在CQRS中反规范化的最佳做法是什么?

时间:2010-06-24 13:37:16

标签: php mysql daemon activemq cqrs

我正在尝试创建一个deamon来反规范化我的数据库。

我使用ActiveMQ作为队列管理器 我有2个数据库:关系一(写+复制),非规范化(读取)

我的问题是对我的真实数据库进行反规范化的最佳做法是什么我有一些想法:

  • MySQL代理(使用lua)读取队列(这是可能的)
  • MySQL中的触发器
  • Java守护程序作为读取队列的服务
  • Cron标签? (但我会有很长的延迟时间

1 个答案:

答案 0 :(得分:3)

我不确定这是否是官方的“最佳”做法,但总的来说,我发现事件采购和使用事件来驱动对读取模型的写入和更新是一种很好的做法。对于事件源,写模型不是作为关系数据库本身的实体和关系存在,而是作为事件历史(我知道这听起来很混乱)

您可以通过查看Eventide如何实现它来了解更多关于事件采购的信息(在Ruby中)https://eventide-project.org/

我还在此处使用域事件简要介绍了CQRS:http://lucisferre.net/2010/11/04/a-brief-introduction-to-cqrs/

然而,这并不能真正回答您当前的问题,最终事件采购可能不适合您。由于您已将“写入”模型的状态存储在关系数据库中,因此触发器是一种可行的方法,但随后您将使系统非常以数据为中心。如果您可以使用代码中的触发器完成相同的操作,那将会更清晰,更可测试。

为此,我仍然会使用域事件模式,并使用事件总线将事件发布到负责更新读取模型的事件处理程序。

将这些事件和处理程序视为您的SQL触发器,但基于您的域设计及其行为。 Udi Dahan有很多关于这种方法的好材料,其中域事件用于更新读取模型,但不使用事件源。 http://www.udidahan.com/?blog=true