什么数据实际存储在CouchDB的B树数据库中?

时间:2010-04-19 15:49:08

标签: indexing locking couchdb time-complexity b-tree

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

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

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

是真的吗?

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

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

2 个答案:

答案 0 :(得分:3)

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

  1. 其叶节点被写入(通过附加到DB文件)
  2. 重写其父节点以引用新叶子(当然通过追加)
  3. 重复步骤2,直到更新根节点
  4. 当写入根节点时,这有效地在较新版本被“提交”时。要查找文档,请从文件末尾开始,获取根节点,然后查看文档ID。最新版本将始终以这种方式访问​​。

答案 1 :(得分:2)

CouchDB不存储差异。更新文档时,它会使用新的_rev和与旧版本相同的_id附加整个新文档。在压缩过程中删除旧版本。

相关问题