6

CouchDBデータベースのBツリーに実際に何が格納されているのでしょうか。CouchDB:The Definitive Guideには、データベースBツリーが追加専用操作に使用され、データベースが単一のBツリー(ビューごとのBツリー以外)に格納されることが記載されています。

したがって、データベースファイルに追加されるデータ項目は、ドキュメント全体ではなく、ドキュメントのリビジョンであると思います。

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

それは本当ですか?

それ本当なら、ドキュメントの現在のリビジョンは、そのようなBツリーに基づいてどのように決定されますか?

それは、CouchDBが、 O(log n)アクセスを維持するために、ドキュメントの現在のリビジョンにインデックスを付けるための別個の「ビュー」データベースを必要とするということではありませんか?そのような指標を構築している間、それは競合状態につながるのではないでしょうか?(私が知る限り、CouchDBは書き込みロックを使用しません)。

4

2 に答える 2

3

ディスク上のデータベースファイルは追加専用です。ただし、Bツリーは概念的にインプレースで変更されます。ドキュメントを更新すると、

  1. そのリーフノードが書き込まれます(DBファイルへの追加を介して)
  2. その親ノードは、新しいリーフを参照するように書き直されます(もちろん追加を介して)
  3. ルートノードを更新するまで、手順2を繰り返します。

ルートノードが書き込まれるとき、それは事実上、新しいリビジョンが「コミット」されるときです。ドキュメントを見つけるには、ファイルの最後から開始し、ルートノードを取得して、ドキュメントIDまで処理します。最新のリビジョンには、常にこの方法でアクセスできます。

于 2010-04-20T00:06:43.863 に答える
2

CouchDBは差分を保存しません。ドキュメントを更新すると、新しいドキュメント全体に新しい_revと古いバージョンと同じ_idが追加されます。古いバージョンは、圧縮中に削除されます。

于 2010-04-19T16:03:46.720 に答える