Не так давно поднимал тему миграции схемы данных в NoSQL хранилищах.
Потратив время, обдумав это всё, поизучая вопросы — не удалось придти к какому-то единому мнению о том, как это стоит реализовывать.
Снова хочется послушать мнения людей более сведущих в теме.
Что имеем:
• Коллекции NoSQL документов отображающих какие-то данные
• Переодическое изменение схемы этих данных, с которыми нужно как-то справляться
Если SQL из коробки содержит средства для работы с миграциями, то в NoSQL всё скудно и грустно.
Варианты которые я вижу (и на которую меня тут натолкнули):
1) Забивать на миграцию и работать всегда с теми данными, которые имеются, а так же доп. логика на все кейсы, когда этих данных нет (дефолтные значения, маппинг, проброс ошибок).
Например, нужно добавить новое поле в класс, а в старых документах его нет => при чтении, если в документе отсутствует поле, добавляем некое дефолтное значение при создании класса.
Нужно удалить поле — оно просто игнорируется.
2) Сделать общую логику миграции на клиенте. Хранить каждый документ с номером текущей версии и мигрировать до актуальной при чтении документа при необходимости.
Например, нужно добавить поле.
При чтении видим, что версия документа меньше текущей на устройстве.
Производим миграцию документа до текущей версии, т.е. добавляем новое поле.
Отправляем новую версию документа на сервер для перезаписи старого.
Работаем дальше.
У обоих подходов видятся плюсы и минусы.
Первый вариант очевидно проще.
Второй кажется оверхедом, однако в какой-то мере выглядит как тот же первый, но более структурированый, что плюс.
Гуглеж тоже не упростил задачу.
В общем.
Для меня это первый реальный опыт работы с NoSQL хранилищем как основной БД, поэтому хочется узнать как это обычно делают и как принято, чтобы не нагородить хероты сразу же.
Что скажете?