Каковы хорошие подходы к миграции формата данных в бессхемных базах данных?

Если вы используете базу данных без схемы (особенно документно-ориентированные базы данных, такие как CouchDB, Couchbase, MongoDB) и хотите изменить формат представления данных для определенного объекта, вы можете оставить существующие записи в старом формате и создать новые записи в новом формате. Это заявлено как одно из основных преимуществ бессхемных баз данных (я думаю, потому что вы можете избежать простоев). С другой стороны, иметь дело со многими форматами одних и тех же данных неудобно и неэффективно. Итак, каковы хорошие подходы / стратегии для переноса данных из одного формата в другой в бессхемных базах данных?


person Alexey    schedule 20.11.2012    source источник


Ответы (1)


Как и все, есть много разных способов справиться с этим. При разработке без схемы вы, как правило, осведомлены о данных, которые храните. Дело не в том, что схема отсутствует, все данные имеют неявную схему, поэтому мы действительно говорим, что база данных не обеспечивает соблюдение схемы. Если у меня есть пользовательский объект с 10 переменными экземпляра, которые я храню в json, там ЕСТЬ схема!

Случай 1: значения могут иметь разные возможности, одно значение, массив или вложенную структуру.

Случай 2: значение необходимо изменить с одного формата на другой, например. от одного значения до массива значений

Случай 3: наличие или отсутствие ключа json, это довольно просто

Для случая 1: если вы ожидаете разнообразия в значении json, разнообразие конкретного значения необходимо будет записать в логику кода приложения, если это строка, сделайте это, если это массив , сделай это.

Для случая 2: один из подходов может заключаться в том, чтобы обработать это как «по запросу» или «по запросу», чтобы вы включили логику преобразования в методы своего класса, чтобы данные преобразовывались из одного формата. в другой формат. Это означает, что вы преобразуете данные из одного формата в другой при их извлечении. Вы также можете пометить его, чтобы указать, что вы его преобразовали. Поскольку это по запросу, у вас могут быть данные, которые не «преобразовываются» в вашем хранилище документов, но если они все же будут запрошены, они будут преобразованы.

Альтернативный подход для случая 2: просматривайте и преобразуйте данные с помощью рабочих процессов. Таким образом, вместо того, чтобы ждать его запроса, вы фактически создаете задание для изменения данных, как вы хотите, чтобы они были изменены, запекая логику преобразования в самих воркерах (которые могут использовать те же определения классов в вашем коде приложения). В Couchbase вы можете создать представление (вторичный индекс) или использовать эластичный поиск для перебора документов определенного типа. Если вы создаете систему рабочего процесса, вы можете делать многое из этого параллельно со многими рабочими.

>>>> Когда я выполняю преобразования, я обычно преобразую один json k / v в другой json k / v неразрушающим способом, чтобы в случае ошибки в своем процессе я не изменяю исходные данные. Затем я могу на более позднем этапе удалить старый json k / v «On Demand», если я даже чувствую, что это необходимо. Это более безопасный подход к операциям такого типа.

Добавлен

Варианты 1 и 2: преобразование данных

Исходный документ JSON

user::101        
{ 
  "uid": 1234,
  "type": user,
  "my_comment": "the quick brown fox jumped over the lazy dog"
  "version": 1.00
}

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

user::101        
{ 
  "uid": 1234,
  "type": user,
  "my_new_comment": ["the quick brown fox jumped over the lazy dog", "comment2"]
  "my_comment": "the quick brown fox jumped over the lazy dog",
  "version": 1.01

}

Обратите внимание, что он неразрушающий, старый ключ json все еще там, в качестве альтернативы я могу сделать это, сохранить старые данные как новый ключ и вместо этого изменить ожидаемый ключ json на новый формат (массив) строки:

user::101        
{ 
  "uid": 1234,
  "type": user,
  "my_comment": ["the quick brown fox jumped over the lazy dog", "comment2"],
  "my_comment_v1.00": "the quick brown fox jumped over the lazy dog",
  "version": 1.01
}

Очевидно, что существует множество различных схем, которые вы можете использовать в зависимости от ваших предпочтений.

person scalabl3    schedule 20.11.2012
comment
Не могли бы вы привести пример, как выполнить миграцию неразрушающим способом? В основном вы хотите заменить k / v1 на k / v2. Насколько я понимаю, это означает, что k / v1 нужно «уничтожить». - person Alexey; 21.11.2012
comment
В основном из вашего ответа я вижу одну из возможных процедур миграции следующим образом. Когда я меняю формат данных 1) код приложения должен уметь работать со старым и новым форматом и отличать один от другого 2) код приложения, который использует данные, должен иметь возможность на лету конвертировать старый формат в новый и работать с новый 3) запускается рабочий процесс, конвертирующий записи из старого формата в новый формат и сохраняющий их - person Alexey; 21.11.2012
comment
давайте посмотрим, смогу ли я сделать это в комментарии к SO ... скажем, документ: ах, не могу вернуть символы, позвольте мне создать суть ... Я отредактирую свой ответ, чтобы помочь понять и добавить суть. - person scalabl3; 21.11.2012
comment
не нужна была суть, просто вставьте ее в ответ, имеет смысл? в противном случае задавайте дополнительные вопросы! - person scalabl3; 21.11.2012