Почему у Datomic нет индекса EATV?

Я думаю, что обычной операцией в любой СУБД, даже в Datomic, будет извлечение самых последних значений атрибутов данного объекта. Например. покажи мне (самый последний) адрес Джо.

Учитывая 4 доступных индекса, все они имеют T в конце, кажется, что эта обычная операция не будет очень эффективный. Например, используя EAVT, вам нужно будет просмотреть все значения для данной пары объект-атрибут, чтобы найти то, которое имеет самый последний T.

Есть ли что-то упущенное или неправильное в этом анализе? Если нет, то не означает ли это, что должен быть индекс EATV?


person brooks94    schedule 20.03.2014    source источник


Ответы (4)


Индексы Datomic охватывают индексы — см. документы по этой теме. Вы не перемещаетесь по нескольким деревьям указателей, чтобы конкретизировать объект, вы фактически извлекаете (отсортированные) данные об объекте, перемещаясь по дереву индексов для EAVT (по E) и извлекая эти данные. На самом деле сами сущности просто выводятся из данных о них, иначе они не реализуются.

Чтобы перемещаться по EAVT, вы переходите к данным о E через дерево индексов и извлекаете конечный сегмент, содержащий отсортированные данные E, A, V, Tx об объекте для текущей базы данных (начиная с ее базиса-T). Помните также, что Datomic поддерживает кардинальность многих атрибутов.

person Ben Kamphaus    schedule 17.12.2014

Редко будет иметь несколько сущностей с небольшим количеством атрибутов и огромным количеством оттока значений. Это должно быть так, чтобы индекс EATV помог.

Это часть индекса EA, которая действительно важна для скорости поиска. Взятие самого последнего значения всех атрибутов для данной сущности представляет собой быструю фильтрацию непрерывного набора данных, индекс EAVT (который, как и все индексы в datomic, представляет собой покрывающий индекс означает, что упорядоченные данные фактически присутствуют в структуре индекса).

person Alex Stoddard    schedule 04.04.2014
comment
Какой вариант использования делает EAVT предпочтительнее EATV? - person brooks94; 15.04.2014
comment
Справедливый вопрос, на который я не знаю ответа. Если бы мне пришлось угадывать, это могло бы быть связано с внутренней реализацией с T в согласованном месте во всех индексах datom. В изоляции EATV, казалось бы, имеет такой же смысл, как и EAVT. - person Alex Stoddard; 15.04.2014

Чтобы найти самое последнее значение атрибута, вам не нужно искать в базе данных истории.

(d/q '[:find ?address
       :where [?e :name "Joe"]
              [?e :address ?address]]
  db)

предоставит вам самый последний адрес Джо (в версии db, предоставленной для запроса) и эффективно использует EAVT.

Дополнительные сведения по этой теме есть на Группа Datomic Google.

person stijnopheide    schedule 02.05.2014
comment
Это показывает только синтаксис запроса, он не отвечает, что происходит в фоновом режиме. Как узнать, перебирает ли Datomic внутренне все прошлые значения текущего E&A? - person Tomas Kulich; 06.12.2014

Для получения самого последнего значения Datomic не нужно перебирать все возможные значения: Datomic хранит текущие значения в отдельном B-дереве (называемом текущей частью), так что это должно быть очень быстро. Для дальнейшего объяснения прочитайте этот УДИВИТЕЛЬНЫЙ блог:

http://tonsky.me/blog/unofficial-guide-to-datomic-internals/

Однако мне непонятно, почему EAVT предпочтительнее EATV.

Кроме того, неясно, как Datomic выполняет запросы в режиме реального времени. Когда Datomic должен объединить часть истории и текущую часть (терминология из статьи, упомянутой выше), что дает именно ту проблему, которую вы изначально поставили.

person Tomas Kulich    schedule 05.12.2014