Есть система из нескольких модулей. Основная задача - получить набор 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:
Вот приходит два таких 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