indexing - CouchDB 的 B 树数据库中实际存储了哪些数据?

标签 indexing locking couchdb time-complexity b-tree

我想知道 CouchDB 数据库 B 树中实际存储了什么? CouchDB: The Definitive Guide告诉数据库 B 树用于仅附加操作,并且数据库存储在单个 B 树中(除了每个 View 的 B 树)。

所以我猜附加到数据库文件的数据项是修订 文件,而不是整个文件:

            +---------|### ...  
            |           |
   +------|###|------+     ... ---+
   |        |        |            |
+------+ +------+ +------+     +------+
| doc1 | | doc2 | | doc1 | ... | doc1 |
| rev1 | | rev1 | | rev2 |     | rev7 |
+------+ +------+ +------+     +------+

这是真的吗?

如果为真,那么如何根据这样的 B 树来确定文档的当前修订版?

这是否意味着 CouchDB 需要一个单独的“ View ”数据库来索引文档的当前修订以保留 O(log n) 访问权限?在构建这样的索引时,它不会导致竞争条件吗? (据我所知,CouchDB 不使用写锁)。

最佳答案

磁盘上的数据库文件是仅附加的;然而,B 树在概念上是就地修改的。当您更新文档时,

  • 它的叶节点被写入(通过附加到 DB 文件)
  • 它的父节点被重写以引用新的叶子(当然是通过附加)
  • 重复步骤 2,直到更新根节点

  • 写入根节点时,即有效地“提交”了较新的修订版。要查找文档,您可以从文件末尾开始,获取根节点,然后找到您的文档 ID。最新版本将始终可以通过这种方式访问​​。

    关于indexing - CouchDB 的 B 树数据库中实际存储了哪些数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2668834/

    相关文章:

    MongoDB 标签键索引

    elasticsearch - Elasticsearch 每个用户对文档的访问控制

    synchronization - Cassandra 互斥锁(同步)

    database - 用于物理测量的良好(noSQL?)数据库

    sql - 如何预热/准备表/索引统计信息?

    ios - Xcode在索引时在做什么?

    c# - 在C#中的循环内使用lock语句

    c# - 是否有任何理由锁定 new object() 以外的东西?

    javascript - 使用javascript将图像文件转换为base64字符串

    couchdb - 当您可以直接更改 couchdb 数据时,您的数据在 Hyperledger Fabric 中的安全性如何