Вопрос:

Изменения модели документа CouchDB?

ruby-on-rails ruby couchdb

1875 просмотра

3 ответа

19593 Репутация автора

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

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

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

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

Автор: Kyle Burton Источник Размещён: 24.09.2008 09:28

Ответы (3)


3 плюса

8320 Репутация автора

Проверьте ActiveCouch .

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

Автор: Ian Terrell Размещён: 24.09.2008 11:32

9 плюса

1479 Репутация автора

Решение

Время для ДУБД по «промыванию мозгов». :)

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

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

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

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

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

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

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

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

Автор: Paul J. Davis Размещён: 26.09.2008 06:19

3 плюса

15525 Репутация автора

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

Автор: max Размещён: 04.01.2009 11:07
32x32