php - 在 CQRS 中反规范化的最佳实践是什么?

标签 php mysql daemon activemq cqrs

我正在尝试创建一个守护进程来对我的数据库进行非规范化。

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

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

  • 读取队列的 MySQL 代理(带 lua)(这可能吗)
  • MySQL 中的触发器
  • Java 守护进程作为读取队列的服务
  • Cron 选项卡? (但我会有很长一段时间的潜伏期

最佳答案

我不确定这是否是官方的“最佳”做法,但总的来说,我发现事件溯源和使用事件来驱动对读取模型的写入和更新是一个很好的做法。通过事件溯源,写入模型本身并不作为关系数据库中的实体和关系存在,而是作为事件的历史记录存在(我知道一开始听起来很困惑)

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

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

但是,这并不能真正回答您的直接问题,最终事件采购可能不适合您。由于您已将“写入”模型的状态存储在关系数据库中,因此触发器是一种可能的方式,但是您正在使您的系统非常以数据为中心。如果您可以在代码中使用触发器来完成同样的事情,那将更加清晰和可测试。

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

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

关于php - 在 CQRS 中反规范化的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3110434/

相关文章:

Linux守护进程启动

c - 在 fork 它的 child 之后,一个守护进程的 parent 是否应该 free() 内存?

php - 永久 Dropbox 授权 PHP

c# - 在集合中找不到参数 "@Name"

mysql - 如何使用自增整数主键合并多个文件?

service - 如何使RUST在后台正常运行并守护进程?

php - 查找具有大于或等于给定数字的值的行(mysql)

javascript - 帖子标题不会出现在网址中

javascript - 如何使用Javascript在两个页面之间传递数据

mysql - 如何纠正 MySQL 加载错误