6

我想知道 CouchDB 数据库 B 树中实际存储了什么?CouchDB:权威指南告诉数据库 B-tree 用于仅附加操作,并且数据库存储在单个 B-tree 中(除了 per-view B-trees)。

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

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

这是真的吗?

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

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

4

2 回答 2

3

磁盘上的数据库文件只能追加;但是 B 树在概念上是就地修改的。更新文档时,

  1. 它的叶节点被写入(通过附加到数据库文件)
  2. 它的父节点被重写以引用新叶子(当然通过附加)
  3. 重复步骤 2,直到更新根节点

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

于 2010-04-20T00:06:43.863 回答
2

CouchDB does not store diffs. When you update a document, it appends the whole new document with a new _rev and the same _id as the old version. The old version is removed during compaction.

于 2010-04-19T16:03:46.720 回答