我想知道例如何时创建或更新实体。我应该创建一个属性,比如:created-at
and:update-at
或 Datomic 默认具有这些属性吗?或者以任何方式找出实体何时创建或更新?
问问题
1587 次
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)
请注意,这种方式会更慢,但可能更健壮。如果您想要断言最新的事实(“更新”),您可以max
为min
.
于 2014-07-09T14:09:36.123 回答