背景
我使用 Datomic 来存储其他系统生成的事件的投影(在这种情况下,投影可以被视为 Datomic 中的实体)。这些事件有一个与之关联的时间戳,用于说明事件的创建时间(例如)。这显然与 Datomic 在投影中存储新属性(基于事件)时分配给事务的事务时间不同。我的应用程序的用户对交易时间不感兴趣,而是对事件时间感兴趣。我首先使用 Datomic 的原因是为了能够获取特定时间的实体(或查询数据库)。不过这次应该not是 Datomic 交易时间,而是事件时间。例如我希望能够基于此获得一个实体活动时间:
(datomic/entity (datomic/as-of db event-time) id)
可能的解决方案
我正在考虑的一个想法是设置:db/txInstant
对于每笔交易到活动时间,但我一直advised https://stackoverflow.com/a/38938037/398441不要将其作为一般原则。另一个潜在的问题是你不能分配一个:db/txInstant
比模式更旧(will我的应用程序就是这种情况)。解决这个问题的一个办法是尽早设定一个:db/txInstant
到创建模式的事务。
Question
在 Datomic 中,人们通常如何处理事件时间而不是事务时间? “可能的解决方案”如何成立?
一般来说,Datomic 的交易时间(t
) 旨在记录系统何时发现某个事实,而不是该事实的域时间。
如果您需要处理域时间(即“现实世界”中发生的事情的时间,或示例中的事件时间),我强烈建议使用属性显式对域时间进行建模(您可以使用类型的属性:db.type/instant
)。这将允许您不受任何限制地设置日期,并分别查询域时间和系统时间,以解决诸如“X 何时发生以及我的数据库何时发现 X 发生?”之类的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)