Какие данные на самом деле хранятся в базе данных B-дерева в CouchDB? - PullRequest
6 голосов
/ 19 апреля 2010

Мне интересно, что на самом деле хранится в B-дереве базы данных CouchDB? CouchDB: полное руководство сообщает, что B-дерево базы данных используется только для операций добавления и что база данных хранится в одном B-дереве (кроме B-деревьев для каждого просмотра).

Таким образом, я предполагаю, что элементы данных, которые добавляются в файл базы данных, являются ревизиями документов, а не целыми документами:

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

Это правда?

Если значение равно true, то как определяется текущая версия документа на основе такого B-дерева?

Не означает ли это, что CouchDB нуждается в отдельной базе данных "view" для индексации текущих версий документов для сохранения доступа O (log n)? Не приведет ли это к гоночным условиям при создании такого индекса? (насколько я знаю, CouchDB не использует блокировки записи).

Ответы [ 2 ]

3 голосов
/ 20 апреля 2010

Файл базы данных на диске предназначен только для добавления; однако B-дерево концептуально модифицировано на месте. При обновлении документа

  1. Записан его листовой узел (через добавление в файл БД)
  2. Его родительский узел переписан для ссылки на новый лист (через приложение, конечно)
  3. Повторяйте шаг 2, пока не обновите корневой узел

Когда записывается корневой узел, это эффективно, когда более новая ревизия «зафиксирована». Чтобы найти документ, вы начинаете с конца файла, получаете корневой узел и переходите к своему идентификатору документа. Последняя версия всегда будет доступна таким образом.

2 голосов
/ 19 апреля 2010

CouchDB не хранит различия. Когда вы обновляете документ, он добавляет весь новый документ с новым _rev и тем же _id, что и у старой версии. Старая версия удаляется во время сжатия.

...