Я хочу знать, например. когда сущность была создана или обновлена. Должен ли я создать атрибут, например :created-at
и :update-at
, или Datomic имеет эти атрибуты по умолчанию? Или каким-либо образом узнать, когда объект был создан или обновлен?
Есть ли объекты в метаданных Datomic, такие как время создания и обновления?
Ответы (1)
Время имеет основополагающее значение для дизайна Datomic. Часть взгляда Datomic на время заключается в том, что сущности не создаются и не обновляются, как в традиционной базе данных CRUD, где строки вставляются в таблицы, а новые факты перезаписывают старые факты в строке. Вместо этого факты о сущностях утверждаются и опровергаются с течением времени. Учитывая эту неизменную историю, Datomic знает, как она оказалась в своем нынешнем состоянии. Вы можете собрать эту информацию о структуре ваших данных с течением времени в базе данных истории:
http://docs.datomic.com/clojure/#datomic.api/history а>
Таким образом, чтобы ответить на ваш вопрос о добавлении и обновлении, вы можете положиться на встроенную в Datomic информацию о времени. Для запроса о том, когда что-то было создано, есть два варианта. Если ваша схема включает какой-то уникальный идентификатор, вы можете ограничить свой запрос ссылкой на транзакцию, когда этот атрибут был создан (должен быть один раз, когда сущность была впервые добавлена):
(d/q '[:find ?e ?tx-time
:where
[?e :user/id _ ?tx]
[?tx :db/txInstant ?tx-time]]
db)
Если вы не можете полагаться на атрибут при инициализации, вы можете использовать базу данных истории, чтобы занять минимальное время для всех транзакций, соответствующих объекту, например, в этом параметризованном запросе:
(d/q ':find ?e (min ?tx-time)
:in $ ?e
:where
[?e _ _ ?tx _]
[?tx :db/txInstant ?tx-time]
(history db) entity-id)
Обратите внимание, что этот способ будет медленнее, но потенциально более надежным. Если вы хотите подтвердить последний факт («обновление»), вы можете заменить max
на min
.