Есть ли объекты в метаданных Datomic, такие как время создания и обновления?

Я хочу знать, например. когда сущность была создана или обновлена. Должен ли я создать атрибут, например :created-at и :update-at, или Datomic имеет эти атрибуты по умолчанию? Или каким-либо образом узнать, когда объект был создан или обновлен?


person Felipe    schedule 09.07.2014    source источник


Ответы (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.

person Ben Kamphaus    schedule 09.07.2014
comment
спасибо за ваш ответ, однако мне было трудно сделать это таким образом. Это перформанс? Специально в случае нахождения времени обновления? Как вы думаете, нормально ли создавать атрибуты created-at и update-at или это будет пустой тратой времени? Если я хочу заказать по времени создания, например, это просто? И почему вы не использовали (history db) в первом утверждении? Я не понял. Большое спасибо. - person Felipe; 10.07.2014
comment
Вам также может быть полезен раздел о происхождении из day-of-datomic: github.com/Datomic/day-of-datomic/blob/master/tutorial/ - person Ben Kamphaus; 10.07.2014