【问题标题】:Why doesn't Datomic have an EATV index?为什么 Datomic 没有 EATV 索引?
【发布时间】:2014-03-20 14:29:06
【问题描述】:

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

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

此分析是否有遗漏或错误?如果没有,那是不是意味着应该有一个 EATV 索引?

【问题讨论】:

    标签: algorithm indexing datomic


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      很少有实体很少,属性很少,值的流失量很大。这需要 EATV 指数提供帮助。

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

      【讨论】:

      • EAVT 优于 EATV 的用例是什么?
      • 公平的问题,我不知道答案。如果我不得不猜测,这可能与 T 在所有 datom 索引中的一致位置的内部实现有关。单独来看,EATV 似乎与 EAVT 一样有意义。
      【解决方案3】:

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

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

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

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

      【讨论】:

      • 这仅显示查询语法,它不回答,后台发生了什么。你怎么知道 Datomic 是否会在内部迭代当前 E&A 的所有过去值?
      【解决方案4】:

      为了获取最新的值,Datomic 不必遍历所有可能的值:Datomic 将当前值保存在单独的 B 树中(称为当前部分),所以这应该非常快。如需进一步解释,请阅读此 AWESOME 博客:

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

      但是,我不清楚为什么 EAVT 比 EATV 更受欢迎。

      此外,尚不清楚 Datomic 如何执行即时查询。当 Datomic 必须加入历史部分和当前部分(上述文章中的术语)时,这完全符合您最初提出的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-08
        • 2017-06-03
        • 2022-01-08
        • 2017-08-01
        • 2010-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多