为什么Datomic没有EATV指数?

时间:2014-03-20 14:29:06

标签: algorithm indexing datomic

我认为任何DBMS(甚至是Datomic)的常见操作都是检索给定实体的最新属性值。例如。告诉我Joe(最近的)地址。

鉴于4 available indices最后都有T,看起来这种常见的操作效率不高。例如,使用EAVT,您必须搜索给定实体 - 属性对的所有值,以便找到具有最新T的那个。

此分析中是否存在缺失或错误的内容?如果不是,那是不是意味着应该有EATV指数?

4 个答案:

答案 0 :(得分:3)

Datomic的索引涵盖了索引 - 请参阅docs on this topic。您没有导航多个指针树以充实实体,您实际上通过导航EAVT的索引树(通过E)并检索这些数据来实际检索有关实体的(已排序的)数据。实际上,实体本身只是从有关它们的数据中推断出来的,它们并没有以其他方式实现。

要导航EAVT,您可以通过索引树导航到有关E的数据并检索叶子段,其中包含有关当前数据库实体的已排序的E,A,V,Tx数据(从其基础-T开始) )。还要记住,Datomic支持基数很多属性。

答案 1 :(得分:1)

要查找属性的最新值,您不需要搜索历史数据库。

(d/q '[:find ?address
       :where [?e :name "Joe"]
              [?e :address ?address]]
  db)

将为您提供Joe的最新地址(在提供给查询的db版本中)并有效地使用EAVT。

Datomic google group上有关于该主题的更多背景资料。

答案 2 :(得分:0)

很少有实体,几乎没有属性和大量的流失值。这需要EATV指数的帮助。

它是索引的EA部分,对查找速度非常重要。获取给定实体的所有属性的最新值是对一组连续数据的快速过滤EAVT索引(与数据组中的所有索引一样是covering index意味着有序数据实际存在于索引中结构)。

答案 3 :(得分:0)

对于检索最新值,Datomic不必迭代所有可能的值:Datomic将当前值保存在单独的B树(称为当前部分)中,因此这应该非常快。有关进一步说明,请阅读此AWESOME博客:

http://tonsky.me/blog/unofficial-guide-to-datomic-internals/

然而,为什么我不清楚EAVT对EATV的偏好。

此外,还不清楚Datomic如何执行查询。当Datomic必须加入历史部分和当前部分(上面提到的文章中的术语)时,这恰好产生了你最初提出的问题。