2014-12-05 14 views

回答

2

这类似于行/主键访问。从​​:“EAVT索引提供有效访问给定实体的所有内容,从概念上讲,这与SQL数据库中的行访问类型非常相似,只是实体可以拥有任意属性,而不限于预定义的一组列。 “

Datomic不可变的时间/历史边是一个激励用例,但总的来说,它仍然围绕典型的数据库操作进行了优化,例如,查找实体的属性及其值。

更新:

Datomic在索引树中存储数据(分段)。因此,您可以使用树导航到特定的E段,然后检索段中有关E的数据,这些数据是EAVT数据。从你的评论中,我相信你会认为这是在每一步更多的b-tree结构的导航,这是不正确的。一旦你导航到E,你正在访问(排序)datoms的叶片段。

+0

但我没有看到如何查看实体的属性值可以从EAVT中受益。我的意思是,EA部分非常明显,但为什么VT最后?据我了解,VT意味着,您在一个B-TREE中只有一个给定属性的所有(过去)值,并且只有在选择一个具体值时,才会发现在什么时候设置了这个值(并且您甚至没有知道这个属性是否存在更新的值!)。虽然,这篇博客文章http://tonsky.me/blog/unofficial-guide-to-datomic-internals/表明,这对大多数查询来说可能不是什么大问题,但对于as-的查询! – 2014-12-09 18:18:38

+0

我已经更新了上面的答案。 VT不是B树,索引本身是一个包含所有数据的覆盖索引。您只能浏览索引树以获取包含有关该实体的所有数据的叶节段 - 您不会继续通过漫步树来获得AVT等。 – 2014-12-16 23:41:10

+0

这是一个有趣的事实,但我仍然不知道它是如何回答最初提出的问题的。为了说明这个问题:比如说,我正在每秒将一个属性的价值改变为一些新的,独特的价值。过了一段时间,有大量这样的数据。现在,如果我在某个特定时间向Datomic询问某个值,引擎可以做什么?从你的帖子看来,它似乎必须获取给定实体的所有数据(可能它们甚至不适合一个段),并且必须迭代它,因为bin-search在这里不适用? – 2014-12-23 12:20:04