【发布时间】:2017-02-02 23:23:13
【问题描述】:
我对 EAVT 的理解是,当事实被插入 Datomic 时,T 必须是。通常在我的工作中,事实可以在它们发生几个月后被插入到系统中。显然,我可以在我的模式中添加一个“at”属性,但这似乎破坏了 Datomic 的大部分价值。是否有模式或技术可以方便地处理这种时间断开?
我要避免的主要问题是:
t=1: I receive a fact that at t=0 x=5
t=3: I receive a fact that at t=2 x=6
t=5: I receive a fact that at t=4 x=7
x @t=2.5 是什么?
要回答这个问题,我想我必须查询 x 的整个历史记录,并遍历一个自定义的 at 字段。或者进行某种二进制 asof 搜索。看起来都不是很吸引人。
【问题讨论】:
-
您在更新中表达问题的方式似乎将系统时间(
t值)和事件时间混为一谈。说t=1: I receive a fact that at '2016-09-26T00:00:00Z' x=5更准确吗?在这种情况下,问题将是“2016-09-27:00:00:00Z 的 x 是什么?”。 -
是否准确地说您的问题更多是关于有效访问历史属性而不是在哪里存储日期时间?我想我明白你在追求什么。如果系统时间和事件时间相同,可以使用
as-of直接访问相应的db。否则,您必须四处寻找合适的数据库。对于我的用例来说,查询历史从来没有特别慢过。这些属性会有很多历史吗? -
是的,这就是难题。 :) 在特定情况下,我认为属性往往每 2 天更改一次,历史长达 2 年。在 SQL 数据库中,我可能会记录按事件时间索引的每个更改的记录,这应该允许我有效地找到当时的活动记录。但是除了完整的历史扫描之外,我想不出在 Datomic 中这样做的方法。完整的历史扫描可能很好,但如果有更好的模式来处理这个难题,我很感兴趣。
标签: datomic