Разве действительно неправильно присвоить версию использованию документов поведение CouchDB по умолчанию?

Это - один из тех, "Я знаю, что не должен делать этого, но это, о, настолько удобно". вопросы. Извините за это.

Я планирую использовать CouchDB для хранения набора документов и хранения их всей истории пересмотра. CouchDB делает управление версиями автоматически, но ему сильно препятствуют для использования программиста:

"Вы не можете полагаться на изменения документа ни для какой другой цели, чем управление совместным выполнением".

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

Вопрос: если я не выполню уплотнение и буду использовать только экземпляр единой базы данных для моих документов, я могу просто использовать управление версиями документа CouchDB и ожидать, что это будет работать?

С чем другими проблемами я мог бы столкнуться? Например, разве рабочее уплотнение не повреждает производительность или использует значительно больше дискового пространства (чем если бы я действительно обрабатывал управление версиями вручную)?

5
задан Tomas Sedovic 26 April 2010 в 23:22
поделиться

2 ответа

Если вы немного переформулируете предложение, в нем говорится: «Любое обновление, независимо от того, насколько оно незначительное, может полностью изменить поведение. Мы гарантируем, что вы можете использовать его для параллелизма, но ни для чего другого».

Поэтому я бы не стал на него полагаться, потому что в нашем промышленность, подобные вещи будут преследовать вас через 6 месяцев, если только вы не можете абсолютно гарантировать, что никогда, никогда не обновите CouchDB.

8
ответ дан 13 December 2019 в 05:32
поделиться

Если это неправильно, то я не хочу быть правым!

Собственно, нет. Это не правильно. Майкл хорошо объяснил это: в лучшем случае это делает ваше приложение очень ненадежным, а в худшем случае вы получите серьезные ошибки, которые заставят вас перестроить архитектуру в неудобное время.

Рассмотрим Google App Engine. Каков их предлагаемый шаблон транзакции?

  1. Начать транзакцию
  2. Получить объекты с помощью ключа
  3. Изменить объекты и сохранить их
  4. Завершить транзакцию

Они образуют функцию, которая повторно запускается, если транзакция не удалась. Почему? И почему выборка должна выполняться внутри транзакции, а не зависать во внешней области?

Поскольку App Engine использует MVCC внутри себя. Если вы столкнулись с конфликтом (ваша версия неверна, потому что кто-то обновил ее), они просто повторно запустят вашу функцию. Следующая итерация получит более новую ревизию, обновит новые данные и снова установит правильную ревизию. Дело в том, что Google не раскрывает это пользователям, потому что это не подходящая среда для создания управления версиями на уровне приложений.

4
ответ дан 13 December 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: