Ответ 1
EDIT: более подробное объяснение синхронизации с использованием двунаправленных триггеров; обновления для синтаксиса, языка и четкости.
Преамбула
У меня возникли аналогичные проблемы при обновлении модели данных на большом веб-приложении, над которым я работал в течение 7 лет, поэтому я чувствую вашу боль. Из этого опыта я бы предложил что-то совсем другое - но, надеюсь, это будет намного проще реализовать. Но сначала наблюдение:
Значение для организации - данные - данные будут долго переживать все ваши текущие приложения. Бизнес будет постоянно изобретать новые способы получения ценности из данных, которые он захватил, которые будут порождать новые отчеты, приложения и способы ведения бизнеса.
Таким образом, получение новой структуры данных должно быть вашей самой важной целью. Не торгуйте, чтобы получить структуру в соответствии с другими краткосрочными целями развития, особенно:
- Операционные цели, такие как развертывание новой службы
- Производительность отчета (используйте вместо этого материализованные представления, триггеры или пакетные задания)
Эта структура со временем изменится, поэтому ваша архитектура должна допускать частые добавления и нечастые нормализации к ней. Это означает, что ваша структура данных и любые общие API-интерфейсы к ней (включая службы RESTful) должны быть правильно версированы.
Почему веб-службы RESTful?
Вы упомянули, что ваша воля "Переместить все функции в службу RESTful, чтобы приложение не имело прямого доступа к базе данных". Мне нужно задать очень важный вопрос в отношении устаревших приложений: почему это важно и какое значение оно принесло?
Я спрашиваю, потому что:
- Вы теряете транзакции ACID (каждый вызов является отдельной транзакцией, если вы не реализуете некоторые ужасно сложные стандарты WS- *)
- Производительность ухудшается: прямые соединения с базой данных будут быстрее (без работы и переводов веб-сервера) и имеют меньшую задержку (обычно 1 мс, а не 50-100 мс), которая будет заметно уменьшать отзывчивость в написанных приложениях для прямых соединений с DB
- Структура базы данных не абстрагируется от службы RESTful, поскольку вы подтверждаете, что при нормализации базы данных вам необходимо переписать веб-службы и переписать приложения, вызывающие их.
И другие сквозные проблемы не изменяются:
- Управляемость: Прямые подключения к базе данных можно отслеживать и управлять с помощью множества общих инструментов здесь.
- Безопасность: прямые соединения более безопасны, чем веб-службы, которые будут писать ваши разработчики,
- Авторизация: модель разрешения базы данных является очень продвинутой и настолько тонкой, насколько вам может понадобиться
- Масштабируемость: веб-служба является (только?) приложением с прямым подключением и поэтому масштабируется только так, как база данных
Вы можете перенести базу данных и сохранить устаревшие приложения, поддерживая устаревший API RESTful. Но что, если мы сможем сохранить устаревшие приложения без, представляя службу "legacy" RESTful.
Управление версиями базы данных
Предположительно большинство приложений 'legacy' используют SQL для прямого доступа к таблицам данных; у вас также может быть несколько представлений базы данных.
Одним из подходов к миграции данных является то, что новая база данных (с новой нормированной структурой в новой схеме) представляет собой старую структуру как views для устаревших приложений, как правило, из другой схемы.
Это на самом деле довольно просто реализовать, но решает только функции отчетности и только для чтения. Как насчет унаследованного приложения DML? DML можно решить с помощью
- Обновляемые представления для простых преобразований
- Представление хранимых процедур, в которых обновляемые представления невозможны (например, "CALL insert_emp (?,?,?)", а не "INSERT INTO EMP (col1, col2, col3) VALUES (?,??)".
- У вас есть таблица "legacy", которая синхронизируется с новой базой данных с триггерами и связями DB.
Наличие таблицы устаревших форматов с двунаправленной синхронизацией с таблицами (таблицами) нового формата с использованием триггеров является решением грубой силы и относительно уродливым.
В итоге вы получаете идентичные данные в двух разных схемах (или в базах данных) и возможность выхода данных из синхронизации, если код синхронизации имеет ошибки, - и тогда у вас есть классические проблемы проблемы "два мастера". Таким образом, рассматривайте это как последнее средство, например, когда:
- Изменена фундаментальная структура (например, изменение мощности отношения) или
- Перевод в унаследованный формат является сложной функцией (например, если старый столбец является квадратом значения столбца нового формата и установлен в "4", обновляемое представление не может определить, имеет ли правильное значение +2 или -2).
Когда такие изменения потребуются в ваших данных, где-то будут некоторые существенные изменения в коде и логике. Вы можете реализовать на уровне совместимости (преимущество: без изменения устаревшего кода) или изменить устаревшее приложение (преимущество: уровень данных чистый). Это техническое решение инженерной команды.
Создание базы данных совместимости старой структуры с использованием описанных выше подходов минимизирует изменения в устаревших приложениях (в некоторых случаях устаревшее приложение продолжается без какого-либо изменения кода). Это значительно снижает затраты на разработку и тестирование (для которых нет чистого функционального выигрыша для бизнеса) и значительно снижает риск развертывания.
Это также позволяет вам сосредоточиться на реальной ценности для организации:
- Новая структура базы данных
- Новые веб-службы RESTful.
- Новые приложения (потенциально связанные с использованием веб-служб RESTful)
Положительный аспект веб-служб
Пожалуйста, не читайте выше, как диатрибу против веб-сервисов, особенно веб-служб RESTful. При правильном использовании, например, для включения веб-приложений или интеграции между разрозненными системами, это хорошее архитектурное решение. Однако это может быть не лучшее решение для управления устаревшими приложениями во время переноса данных.