Я сталкиваюсь с проблемой миграции на работе. Прямо сейчас у нас есть одна база данных, которая используется нашим веб-сайтом и инструментом backoffice.
В рамках попытки улучшить наш код на веб-сайте мы разработали новую схему для нескольких таблиц в базе данных.
В качестве примера возьмем таблицу продуктов. Это довольно стандартно с такими полями, как описание, название, код продукта, цена, дата создания и т. Д. Теперь у нас есть новая таблица, назовем ее лучше_продуктами. Проблема в том, что мы можем изменить код веб-сайта, сколько захотим, но мы не можем коснуться кода инструмента backoffice, который в значительной степени опирается на таблицу старых продуктов.
Мы собираемся в конечном итоге оказаться в производственной ситуации, когда инструмент backoffice записывает данные в старую таблицу продуктов, а веб-сайт выполняет чтение из новой таблицы better_products. Вопрос в том, как мы синхронизируем их обоих? Я уже некоторое время гуглюсь, и на сегодняшний день наиболее распространенным решением является использование триггеров и отображение входящих данных в новую таблицу. Я написал триггер AFTER INSERT для продуктов, но когда я решил написать триггер UPDATE, оказалось, что нет способа перебрать поля, которые изменились внутри триггера, и отобразить их. Это означает, что вы должны вручную записывать поля в виде IF ‘NEW.fieldName <> OLD.fieldName THEN ‘, что некрасиво и требует перечисления полей вручную.
Есть ли способ лучше? полу-лучший способ? что-нибудь кроме записи этого поля за полем?
Есть ли лучшая практика, чем использование триггеров?
Пожалуйста, не предлагайте менять инструмент backoffice, так как сейчас это нереально. Это запланировано, но не достаточно скоро, чтобы мы смогли его дождаться.
Создайте представление в базе данных mysql под названием better_products, которое является оператором выбора для старого продукта, но с псевдонимами для имен столбцов, которые изменились.
В конце концов, вы можете обновить код в приложении backoffice, чтобы использовать это представление. Как только обе системы используют новое представление, это представление может быть заменено фактической таблицей под названием better_products, в которой скопированы все данные из старой таблицы.
Других решений пока нет …