我一直在考虑分离读写流程,甚至让他们使用不同的数据库通过水平扩展" read"来提供最佳的快速数据可用性。数据库。我要将我的项目写入数据库,推送对象将通知更改为队列,以便另一个服务读取消息并将更新的数据复制到一个或多个非规范化的#34;读取"数据库。考虑到这一点,我发现,如果"写"这将是不好的。数据库也是非规范化的。
示例:假设有一个用户个人资料,其名称为大学用户已毕业。假设我将这些信息存储在"写"像这样的数据库:
{ userId: 100, name: "John", universityId: 200, universityName: "Cambridge"}
假设用户打开了他的个人资料进行编辑,而当他正在做另一个人时,剑桥代表已更改了#34; Cambridge"到" C.U。"并保存了更改,以便他们同时去写"写"和"阅读"数据库。更新了大学名称的服务完成了它的工作,"认为"现在大学到处都可以。在此之后,第一个用户使用旧的大学名称保存更新的个人资料,此名称将转到他的个人资料所呈现的每个地方 这种问题让我觉得"写"数据库必须始终规范化,不包含重复项。但我从没有从关于CQRS的内容中找到这个原则。我错了吗?
答案 0 :(得分:4)
你做对了!
这"原则" Eric Evans在DDD book中写得非常清楚和详细。规则是聚合只能通过其ID 引用其他聚合。在CQRS中,仅在写入侧使用/访问聚合。
另一方面,读取模型应该针对读取进行优化,而非规范化是实现此目的的一种方法。我总是这样做。通过倾听正确的事件,他们可以保持同步。