Time 在Datomic中使用事件时间而不是事务时间?

Time 在Datomic中使用事件时间而不是事务时间?,time,clojure,transactions,datomic,Time,Clojure,Transactions,Datomic,背景 我使用Datomic存储由其他系统生成的事件的投影(本例中的投影可以被视为Datomic中的一个实体)。这些事件有一个与之相关联的时间戳,它告诉我们事件是何时(例如)创建的。这显然与Datomic在投影中存储新属性(基于事件)时分配给事务的事务时间不同。我的应用程序的用户对事务时间不感兴趣,而是对事件时间感兴趣。我之所以使用Datomic,首先是为了能够像在特定时间一样获取实体(或查询数据库)。但是,该时间不应为Datomic事务时间,而应为事件时间。例如,我希望能够基于此事件时间获取实体

背景

我使用Datomic存储由其他系统生成的事件的投影(本例中的投影可以被视为Datomic中的一个实体)。这些事件有一个与之相关联的时间戳,它告诉我们事件是何时(例如)创建的。这显然与Datomic在投影中存储新属性(基于事件)时分配给事务的事务时间不同。我的应用程序的用户对事务时间不感兴趣,而是对事件时间感兴趣。我之所以使用Datomic,首先是为了能够像在特定时间一样获取实体(或查询数据库)。但是,该时间不应为Datomic事务时间,而应为事件时间。例如,我希望能够基于此事件时间获取实体:

可能的解决方案

我想到的一个想法是将每个事务的
:db/txInstant
设置为事件时间,但我没有将此作为一般原则。这方面的另一个潜在问题是,您无法分配比架构旧的
:db/txInstant
(在我的应用程序中就是这种情况)。解决方法是为创建模式的事务设置一个非常早的
:db/txInstant

问题


在Datomic中,通常如何处理事件时间而不是事务时间?“可能的解决方案”如何维持?

通常,Datomic的事务时间(
t
)旨在记录系统何时发现某个事实,而不是该事实的域时间


如果您需要处理域时间(即“真实世界”中发生的时间,或您的示例中的事件时间),我强烈建议使用属性显式地对域时间建模(您可以使用类型为
:db.type/instant
)的属性)。这将允许您不受任何限制地设置日期,并分别查询域时间和系统时间,以获取诸如“X何时发生以及我的数据库何时发现X发生?”之类的问题。

听起来很合理,但是,例如,如果我这样做,我如何在特定的事件时间获取实体呢?为了澄清,我的意思是,我对数据库在某个时刻的外观感兴趣,而这个时刻应该是事件时间,而不是数据处理/事务时间。您可以使用
(d/as-of-db-date)
获取
日期的数据库视图,其中date是java.util.date(即:db.type/instant解析为的日期)
(datomic/entity (datomic/as-of db event-time) id)