uhfath
@uhfath
Разработчик

Как правильно версионировать входные данные?

Есть система из нескольких модулей. Основная задача - получить набор XML файлов, проверить их и загрузить в базу.

Последовательность такая:
  • Получаем XML
  • Проверяем по XSD
  • Проверяем каждую ноду набором скриптов
  • Сериализуем и загружаем в базу

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

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

Какие есть best practises на эту тему?
В СУБД всегда должна быть только последняя версия схемы, но все данные за все время. Хранить предыдущие схемы нет надобности, а данные надо каждый раз адаптировать.
Совместимость нужна только между новой и предыдущей версией файлов. Старьё тянуть не надо.
Изменения могут быть очень глобальными и скрипты могут сильно отличаться.
Как такое лучше реализовать?

Основной затык для меня - это скрипты. Ничего лучше чем вписать в каждый скрипт поддержку версий не придумал.
Но это сильно все усложняет.

В идеале хотелось бы получить нечто вроде веток в git. Одна ветка текущая версия, а вторая новая. И в зависимости от версии файла выбирать скрипты из нужной ветки.
Также и сериализатор. Но для него нужен будет некий адаптер, который будет из текущей версии делать новую.

В общем хотелось бы узнать, кто как решает такую задачу.

UPDATE_1:
Пример:
XML_VER_1.0:
  • FIELD_1: 10
  • FIELD_2: 20
  • FIELD_3: 30


XML_VER_2.0:
  • FIELD_3: 30
  • FIELD_4: 40


Вот приходит два таких XML. В базе в результате должно быть записано так:
Первая запись:
  • FIELD_1: 10
  • FIELD_2: 20
  • FIELD_3: 30
  • FIELD_4: 0


Вторая запись:
  • FIELD_1: 0
  • FIELD_2: 0
  • FIELD_3: 30
  • FIELD_4: 40
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
А если вынести версионную трансформацию в позицию "до"?

То есть отдельно трансформировать прошлую версию в текущую и дальше уже идти по текущему пути. Естественно это приемлемо если есть однозначные трансформации из версии в версию (возможно с хинтами дефотных новых значений и т.п.)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы