我想知道创建或更新实体的时间。是否应该创建诸如:created-at:update-at之类的属性,或者默认情况下Datomic具有这些属性?还是以某种方式找出何时创建或更新实体?

最佳答案

时间是Datomic设计的基础。 Datomic的时间观的一部分是,没有像传统的CRUD数据库那样创建或更新实体,在传统的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

关于database - Datomic元数据中的实体是否具有创建和更新时间之类的功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24645758/

10-12 00:37