使EAVT指数优于EAT的用例是什么?

时间:2014-12-05 21:38:23

标签: indexing datomic

根据我的理解,EATV(Datomic没有)将非常适合作为查询。另一方面,我认为没有EAVT的用例。

2 个答案:

答案 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索引排列,都重复相同的模式。