Изменения модели документа CouchDB? - PullRequest
8 голосов
/ 25 сентября 2008

Rails использует концепцию миграций для работы с изменениями модели с помощью API ActiveRecord.

CouchDB использует JSON (вложенные карты и массивы) для представления объектов своей модели.

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

Существуют ли функции или у вас есть лучшие практики для обработки изменений модели в CouchDB?

Ответы [ 3 ]

9 голосов
/ 26 сентября 2008

Время на устранение «промывания мозгов» СУРБД. :)

Один из самых важных моментов бесшумного дизайна couchdb напрямую направлен на предотвращение необходимости миграции. Представление объектов в формате JSON упрощает ввод ваших объектов.

Например, если у вас есть веб-приложение типа блога с постами и другими модными вещами, которые люди хранят в блоге. Ваши почтовые документы имеют такие поля, как автор, заголовок, созданный в и т. Д. Теперь вы приходите и думаете: «Я должен отслеживать, на какой стадии находится луна, когда я публикую свои сообщения ...», вы можете просто начать добавлять moon_phase как атрибут для новых сообщений.

Если вы хотите завершить работу, вернитесь и добавьте moon_phase к старым сообщениям, но это не обязательно.

В ваших представлениях вы можете получить доступ к moon_phase в качестве атрибута. И это будет нулевым или вызовет исключение или что-то. (Не эксперт JS, я думаю, что ноль - правильный ответ)

Дело в том, что это не имеет значения. Если вы хотите что-то изменить, просто измените это. Хотя убедитесь, что ваши взгляды понимают это изменение. Что, по моему опыту, не требует много.

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

{
   _id: "foo-post",
   _rev: "23490AD",
   type: "post",
   typevers: 0,
   moon_phase: "full"
}

Надеюсь, это поможет.

3 голосов
/ 04 января 2009

Если у вас есть схемы и вы все еще хотите использовать CouchDB, вы получаете «несоответствие импеданса».

Тем не менее, иметь "миграции" не так сложно. Добавьте элемент schema_version к каждому документу. Затем включите обновление «функция чтения документа». Примерно так:

def read(doc_id):
    doc = db.get(doc_id)
    if doc.schema_version == 1:
        # version 1 had names broken down too much
        doc.name = "%s %s" % (doc.first, doc.last)
        del doc.first
        del doc.last
        doc.schema_version = 2
        db.put(doc)
    if doc.schema_version == 2: weight
        # version 2 used kg instead of g
        doc.weight_g = doc.weight_kg * 1000
        del doc.volume_kg
        doc.schema_version = 3
        db.put(doc)
    return doc

Если вы хотите обновить всю БД сразу, просто наберите read(doc_id) для каждого документа.

3 голосов
/ 25 сентября 2008

Оформить заказ ActiveCouch .

CouchDB специально не использует схемы, поэтому нет сопоставления концепций 1: 1 из миграций ActiveRecord в эквивалент CouchDB. Однако ActiveCouch включает в себя миграции для «представлений» CouchDB.

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