2009-08-26 3 views
21

будут следующая жизнеспособной стратегией для осуществления контроля версий (с использованием «примера» в качестве типа документа образца):CouchDB стратегии управления версиями

Есть один оригинальный документ, в котором поле типа с именем example_original.

Последующие изменения документа имеют тип example_change и идентификатор example_original document в качестве ключа. Это изменение также будет иметь временную метку.

Храните один документ с типом example_current, который является результатом example_original со всеми примерами «применяется». Новый документ example_change будет автоматически применен к этому документу.

Поиск конкретной версии будет заключаться в извлечении документа example_original и внесении необходимых изменений (в основном до определенной отметки времени, но также может быть несколько изменений).

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

Какие плюсы и минусы вы видите в этом подходе?

+0

Вы пытаетесь изменить содержимое документа или структуру документа? – Dokie

+0

Только содержание. Поля никогда не будут удалены только добавленными. – mac

ответ

9

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

Вам понадобится удалить что-нибудь из истории? Вы действительно уверены? Неужели, правда, верно? Как насчет филиалов?

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

  1. При создании документа вы назначаете UUID. Не используйте имя или вы будете сталкиваться с проблемами во время операций переименования. Добавьте поле версии, которое читает «1». Создайте второй документ, содержащий список документов с тем же UUID или добавьте «родительский» указатель на первый документ.

    Наличие «документа истории» для каждого документа позволяет ускорить навигацию по истории, но родительские указатели более «безопасны» (поскольку вы не можете легко создавать с ними нелегальные структуры).

  2. При создании новой редакции повторно используйте UUID и назначьте новую уникальную версию. Обновите документ истории или указатель родителя.

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

+0

См. Ваш вопрос, спасибо за предложение. Мне никогда не понадобится удалять что-то из истории, но некоторые изменения могут быть отмечены как «ошибка» или аналогичная. Поддержка разветвления не понадобится. – mac

1

Каков бизнес-статус этих документов, особенно законный? Я работал в ситуациях, когда ваше предложение не соответствовало бы деловой активности, из-за необходимости доказать, что документ, представленный как v.3, действительно является версией 3 документа. Динамическое применение дельт не нарушало бы горчицу.

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

+0

Я не думаю, что это будет представлять проблему соответствия, если у вас есть журнал аудита для всех документов, включая документы с изменениями. Такой подход аналогичен подходу к первоначальному контракту и последующим поправкам. – mac

1

Стратегия для управления версиями с помощью CouchDB - это НЕ когда-либо уплотнять базу данных, содержащую документы, для которых вам необходимо сохранить полную историю. Вы все еще можете скомбинировать другие базы данных. Эта простая стратегия работает сегодня из коробки с помощью стратегии разрешения конфликтов.

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

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

Теперь для возможного будущего CouchDB:

  • Сегодня каждая редакция имеет полную копию документа, но можно было бы подумать, что оптимизации двигателя CouchDB в один прекрасный день магазин дельт.
  • Возможно также, что в будущем CouchDB предложит API для предотвращения уплотнения определенных типов документов. Это позволит сохранить все документы в одной базе данных. Это будет легкий патч для CouchDB.
  • Эта стратегия позволяет управлять ветвями документов, но учитывая природу CouchDB как базы данных документов, это что-то разумное, но долговременное.
+0

Интересная идея, но не хороший совет. Хотя вы можете реализовать очень простую систему управления версиями, просто избегая уплотнения, вы будете работать против базы данных, а не работать с ней. Лучше хранить каждую версию, которую вы хотите сохранить с другим _id, чтобы база данных знала, что она должна быть сохранена. –

+0

@NickPerkins, я специально упомянул не компактную «базу данных», которая ... Это означает, что у вас может быть одна или несколько других баз данных, которые вы все равно будете компактными. Поэтому это решение не работает с базой данных. –

19

Simple Document Versioning with CouchDB

Управления версий в виде вложений подхода, описанные в этой статье, должны соответствовать требованиям большинства людей для управления версий.

+2

ссылки больше не являются вживую, но [этот] (http://jchris.ic.ht/drl/_design/sofa/_list/post/post-page?startkey=%5B%22Versioning-docs-in-CouchDB % 22% 5D) содержат обзор описанных 4 методов –

+0

Я считаю, что это обновленная [link] (https://blog.couchbase.com/how-implement-document-versioning-couchbase) –

+0

@BrianPutt: ссылка, которую вы давайте говорим о CouchBase, который отличается от CouchDB http://www.couchbase.com/couchbase-vs-couchdb –