根据我的理解,EATV(Datomic没有)将非常适合作为查询。另一方面,我认为没有EAVT的用例。
答案 0 :(得分:2)
这类似于行/主键访问。从docs:“EAVT索引提供了对给定实体的所有内容的有效访问。从概念上讲,这与SQL数据库中的行访问样式非常相似,除了实体可以拥有任意属性而不是限制为预定义一组列。“
Datomic的不可变时间/历史方面是一个激励性的用例,但总的来说,它仍然围绕典型的数据库操作进行了优化,例如:查找实体的属性及其值。
更新
Datomic在索引树中存储数据(以段为单位)。因此,您使用树导航到特定的E段,然后检索该段中有关E的数据,这些数据是EAVT数据。从您的评论中,我相信您认为这是在每一步导航更多b树样结构,这是不正确的。导航到E后,您将访问(已排序)数据的叶子段。
答案 1 :(得分:1)
您不是在特定时间点寻找单个值。您正在寻找直到特定时间点T的一组值。历史记录是基于每个值(而不是属性)的。
例如,断言X,撤回X,然后再次断言X。这是3个不同交易中的3个不同事实。您需要计算X被添加,然后被删除,然后可能在某个时候再次被添加。
您可以使用SQL执行此操作:
create table Datoms (
E bigint not null,
A bigint not null,
V varbinary(1536) not null,
T bigint not null,
Op bit not null --assert/retract
)
select E, A, V
from Datoms
where E = 1 and T <= 42
group by E, A, V
having 0 < sum(case Op when 1 then +1 else -1 end)
datom的第五部分Op
告诉您该值是断言(1)还是缩回(0)。通过对该值求和(为+ 1 / -1),我们得出1或0。
两次声明相同的值无济于事,并且在声明新值之前,您总是先收回旧值。最后一部分是算法很好地解决此问题的前提条件。
使用EAVT索引,这是一个非常高效的查询,非常优雅。这样,您仅用150行SQL就可以构建基本的Datomic式系统。对于所需的任何EAVT索引排列,都重复相同的模式。