Доступны ли старые данные в CouchDB? - PullRequest
12 голосов
/ 16 марта 2012

Я немного прочитал о CouchDB, и я действительно заинтригован тем фактом, что он «только для добавления».Возможно, я неправильно понимаю, но, насколько я понимаю, это работает примерно так:

  • данные добавляются в момент времени t0 в БД, сообщая, что пользовательс ID 1 имя «Cedrik Martin»

  • запрос «как зовут пользователя с ID 1?» возвращает «Cedrik Martin«

  • во время t1 сделано обновление в БД, говорящее: « Пользователь с ID 1 зовут Седрик Мартин »(изменяя 'k' на 'c').

  • запрос, снова запрашивающий "как зовут пользователя с идентификатором 1" теперь возвращает "Седрик Мартин "

Это глупый пример, но это потому, что я хотел бы понять кое-что фундаментальное о CouchDB.

Видно, что обновление было сделано с использованием дополненияв конце БД, можно ли запросить БД "как это было в момент времени t0", не делая ничего особенного?

Могу ли я спросить CouchDB "Как звали пользователя сяD 1 в момент времени t0? "?

РЕДАКТИРОВАТЬ первый ответ очень интересен, и поэтому у меня есть более точный вопрос: пока я не" сжимаюсь ""CouchDB, я могу написать запросы, которые как-то" ссылочно прозрачны "( т.е. они будут всегда приводить к одному и тому же результату)?Например, если я запрашиваю "документ d с ревизией r" , я гарантирую, что всегда получу один и тот же ответ обратно, пока я не сжимаю БД?

Ответы [ 4 ]

30 голосов
/ 19 марта 2012

Возможно, самая распространенная ошибка, допущенная в CouchDB, заключается в том, что она предоставляет систему управления версиями для ваших данных.Это не так.

Сжатие удаляет все не самые последние версии всех документов, а репликация только копирует самые последние версии любого документа.Если вам нужны исторические версии, вы должны сохранить их в своей последней редакции, используя любую схему, которая кажется вам полезной.

"_ rev", как отмечалось, является неудачным именем, но не было предложено никакого другого слова,понятнее.«_mvcc» и «_mcvv_token» были предложены ранее.Проблема с обоими заключается в том, что любое описание того, что там происходит, неизбежно будет включать в себя «старые версии остаются на диске до сжатия», что все равно будет означать, что это система управления версиями пользователя.спросите CouchDB «Как звали пользователя с ID 1 в момент времени t0?»? », короткий ответ« НЕТ ».Длинный ответ - «ДА, но потом это не сработает», это просто еще один способ сказать «НЕТ».:)

4 голосов
/ 16 марта 2012

Ответ на второй вопрос: ДА.

Измененные данные всегда добавляются в дерево с большим номером ревизии.одна и та же версия никогда не изменяется.

Для вашей информации:

Ревизия (1-abcdef) построена таким образом: 1 = номер версии (здесь: первая версия), вторая - хешповерх содержимого документа (не уверен, если там есть еще немного «соли») ... так что одно и то же содержимое документа всегда будет производить один и тот же номер ревизии (с той же настройкой couchdb) даже на других машинах, когда включенотот же изменяющийся уровень (1-, 2-, 3-)

Другой способ - : если вам нужно сохранить старые версии, вы можете хранить документы в большем документе:

{
 id:"docHistoryContainer_5374",
 "doc_id":"5374",
 "versions":[
   {"v":1,
    "date":[2012,03,15],
    "doc":{ .... doc_content v1....}
   },
   {"v":2,
    "date":[2012,03,16],
    "doc":{ .... doc_content v2....}
   }
 ]
}

тогда вы можете запросить ревизии:

Просмотр "byRev":

for (var curRev in doc.versions) {
  map([doc.doc_id,doc.versions[curRev].v],doc.versions[curRev]);
}

вызов:

/ byRev? Startkey = ["5374"] & endkey = [" 5374 ", {}]

результат:

{id:" docHistoryContainer_5374 ", ключ = [5374,1] значение = {... doc_content v1 ....}} {id: "docHistoryContainer_5374", key = [5374,2] value = {... doc_content v2 ....}}

Дополнительно теперь вы также можете написатькарта-функция, которая соответствует дате в ключе, так что выможно запросить изменения в диапазоне дат

4 голосов
/ 18 марта 2012

Как уже говорилось, это технически возможно, и вы не должны на это рассчитывать. Речь идет не только о сжатии, но и о репликации, одной из самых сильных сторон CouchDB. Но да, если вы никогда не сжимаете и не копируете, вы всегда сможете извлечь все предыдущие версии всех документов. Я думаю, что он не будет работать с запросами, хотя они не могут работать со старыми версиями.

По сути, называть его "rev" было самой большой ошибкой в ​​дизайне CouchDB, его следовало называть "mvcc_token" или что-то в этом роде - он действительно только реализует MVCC, он не предназначен для использования при создании версий.

1 голос
/ 16 марта 2012

t0 (t1 ...) в couchdb называется "ревизия".Каждый раз, когда вы меняете документ, номер редакции увеличивается.Старые версии документов хранятся до тех пор, пока вы больше не захотите иметь старые версии, и скажете базе данных "компактная"Посмотрите "Доступ к предыдущим версиям" в http://wiki.apache.org/couchdb/HTTP_Document_API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...