【问题标题】:Database synchronization between a new greenfield project database and old projects database新的新建项目数据库和旧项目数据库之间的数据库同步
【发布时间】:2012-01-11 12:14:04
【问题描述】:

我正在考虑使用 DDD/TDD/NHibernate 开发一个新的新应用程序,该应用程序具有一个反映域的新数据库架构,其中数据库中的更改需要与旧项目数据库双向同步。要求是两个项目并行运行,一旦新项目开始比旧项目增加更多业务价值,旧项目将被关闭。

我想到的一种方法是通过数据库触发器实现数据库同步。在新数据库中插入/更新/删除后,表的触发器将需要正确更新旧数据库。旧数据库中的更改也是如此,其触发器需要更新新数据库。

示例: 旧项目有一个表 Quote,其中包含 QuoteId 和 QuoteVersion 列。正确的域模型是一个 Quote 对象,具有许多 QuoteVersion 对象。因此,新数据库将有两个表,Quote 和 QuoteVersion。因此,如果您更改新数据库中的 Quote 表,触发器将需要更新旧数据库中具有该 QuoteId 的所有记录或最新版本。接下来,如果您更新旧数据库中的报价记录,您可以再次更新新数据库中的记录,或者它可能仅在更新旧数据库中最新版本的报价时更新它。

因此,触发器中需要有一些逻辑。那些 sql 语句可能有点不重要。为了确保可维护性,需要对触发器进行彻底的测试(数据保存在一个数据库中,测试数据在第二个数据库中,针对不同的情况)。

问题:您认为这种用于数据库同步的触发器想法是否可行(尚不确定如何确保一个触发器不会触发另一个数据库触发器)?有人试过,发现它会下地狱吗?您对如何满足同步数据库的要求有更好的了解吗?

【问题讨论】:

标签: database synchronization


【解决方案1】:

这是一个不平凡的挑战,我真的不想使用触发器 - 您自己已经确定了一些问题,我想补充一下关于性能和可用性以及可怕无限的明显可能性的问题循环错误 - 旧应用程序中的触发器将记录插入新应用程序,导致触发器在新应用程序中触发以在旧应用程序中插入记录,导致触发器在旧应用程序中触发...

我见过的最简洁的选项是基于消息传递系统。应用程序中的每次更改都会触发一条消息,该消息由接收端的接收者处理。接收者可以验证消息,并且 - 理想情况下 - 将其转发到处理该特定数据项的“正常”代码。

例如:

  • 旧版应用创建新的“报价”记录
  • 旧版应用发送一条带有新“报价”表示的消息
  • 消息总线将消息转发到新建应用“newQuoteMessageHandler”
  • 新建应用“newQuoteMessageHandler”验证数据
  • greenfield "newQuoteMessageHandler" 实例化 "quote" 域实体,并用数据填充它
  • 新建域实体处理剩余的持久性和相关的业务逻辑。

您的消息处理程序应该相对容易测试 - 您可以使用它们将每个应用程序与底层数据层中的疯狂行为隔离开来。它还允许您在新建应用程序中处理不断变化的数据模式。

将其重新安装到旧版应用中可能会很棘手 - 并且很可能需要涉及触发器来捕获数据更新,但触发器内部的逻辑应该非常简单 - “发送新消息”。

双向同步很难!您可能会花费大量时间来启动和运行它,并随着您的新建项目的发展对其进行维护。如果您正在开发 MS 软件,那么值得关注 http://msdn.microsoft.com/en-us/sync/bb736753

【讨论】:

  • 我可以看到消息的一个问题。数据库的更新不会发生在同一个事务中,并且在处理消息之前数据可能不同步。如果消息的处理程序失败,数据将保持不同步。
  • 确实——但如果你想在混合中添加分布式事务和实时同步,我认为如果不在同步上投入比项目本身更多的时间,你的项目不太可能成功——尤其是如果您有性能和可扩展性要求。在实践中,消息传递解决方案(最多)增加了几秒钟而不是几分钟的延迟。 “如果处理程序失败”的问题同样适用于触发器,但是通过使用消息传递方案,您可以做出更明智的决策 - 例如,您的错误处理代码可以通过电子邮件发送给帮助台。
  • ““如果处理程序失败”的担忧同样适用于触发器”。不是真的,如果触发器失败,整个事务就会失败。全部,或者什么都没有。这些失败基本上会指出未涵盖的领域(好事)。现在我正在研究 CLR 触发器,运行 C# 代码来执行插入/更新/删除逻辑。到目前为止,我能够通过在 c# 中设置另一个触发器实际上正在运行的标志来解决“触发器触发器”问题。我完全同意同步比项目本身更昂贵的巨大风险。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多