Синхронизация базы данных между новой базой данных новых проектов и базой данных старых проектов - PullRequest
0 голосов
/ 11 января 2012

Я думал о разработке нового нового приложения с использованием DDD / TDD / NHibernate с новой схемой базы данных, отражающей домен, где изменения в БД необходимо было синхронизировать в обоих направлениях со старой базой данных проектов. Требование заключается в том, что оба проекта будут выполняться параллельно, и как только новый проект начнет приносить больше пользы для бизнеса, чем старый, старые проекты будут закрыты.

Один из подходов, который я имею в виду, заключается в достижении синхронизации БД с помощью триггеров БД. После того, как вы вставите / обновите / удалите новую базу данных, триггер для таблицы должен будет корректно обновить старую базу данных. То же самое для изменений в старой базе данных, ее триггеры должны будут обновить новую базу данных.

Пример: Старый проект имеет одну таблицу Quote, с колонками QuoteId и QuoteVersion. Правильная модель домена - это один объект Quote со многими объектами QuoteVersion. Таким образом, новая база данных будет иметь две таблицы: Quote и QuoteVersion. Таким образом, если вы измените таблицу цитирования в новой БД, триггеру потребуется обновить все записи с этим QuoteId в старой БД или в последней версии. Затем, если вы обновите запись Quote в старой БД, вы либо обновите запись в новой БД, либо она может обновиться только в том случае, если была обновлена ​​последняя версия Quote в старой БД.

Итак, в триггерах должна быть какая-то логика. Эти SQL-операторы могут быть нетривиальными. Чтобы обеспечить удобство обслуживания, необходимо провести тщательные тесты для триггеров (сохранить данные в один дБ, тестовые данные во второй дБ для разных случаев).

Вопрос: считаете ли вы, что эта идея триггера для синхронизации БД жизнеспособна (пока не знаете, как гарантировать, что один триггер не вызовет другой триггер базы данных)? Кто-нибудь пробовал это и узнал, что это идет в ад? У вас есть идея, как выполнить требование синхронизации баз данных

1 Ответ

0 голосов
/ 11 января 2012

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

Самый чистый вариант, который я видел, основан на системе обмена сообщениями. Каждое изменение в приложении запускает сообщение, которое обрабатывается получателем на принимающей стороне. Получатель может проверить сообщение и, в идеале, переслать его в «нормальный» код, который обрабатывает этот конкретный элемент данных.

Например:

  • устаревшее приложение создает новую запись "цитата"
  • устаревшее приложение отправляет сообщение с представлением новой «цитаты»
  • шина сообщений пересылает сообщение в новое приложение "newQuoteMessageHandler"
  • новое приложение "newQuoteMessageHandler" проверяет данные
  • greenfield "newQuoteMessageHandler" создает экземпляр объекта "quote" и заполняет его данными
  • Сущность домена Greenfield имеет дело с оставшейся устойчивостью и связанной бизнес-логикой.

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

Модернизация этого в унаследованном приложении может быть сложной - и может потребоваться использование триггеров для захвата обновлений данных, но логика внутри триггера должна быть довольно простой - «отправить новое сообщение».

Двунаправленная синхронизация - это сложно! Вы можете ожидать, что потратите значительное количество времени на его запуск и обслуживание, а также на поддержание его по мере развития вашего нового проекта. Если вы работаете с программным обеспечением MS, стоит посмотреть http://msdn.microsoft.com/en-us/sync/bb736753.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...