Вопрос

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

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

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

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

Это было полезно?

Решение

Пришло время для отмены промывания мозгов в СУБД.:)

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

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

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

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

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

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

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

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

Другие советы

Если вам нравятся схемы и вы все еще хотите использовать 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) для каждого документа.

Проверьте Активный контакт.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top