7

我想知道例如何时创建或更新实体。我应该创建一个属性,比如:created-atand:update-at或 Datomic 默认具有这些属性吗?或者以任何方式找出实体何时创建或更新?

4

1 回答 1

16

时间是 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)

请注意,这种方式会更慢,但可能更健壮。如果您想要断言最新的事实(“更新”),您可以maxmin.

于 2014-07-09T14:09:36.123 回答