为什么 CQRS 似乎阻止了写入端的唯一约束?

问题描述 投票:0回答:1

我在任何地方看到有关确保 CQRS 架构中的唯一性的帖子,对我来说最明显的解决方案是在写入端添加唯一索引,但从未提及,没有任何解释。

相反,我读到必须查询读取模型,并且并发问题应该通过补偿操作的传奇来解决。当您可以拒绝唯一索引违规的命令时,这似乎过于复杂,那么这是为什么呢?

indexing unique cqrs
1个回答
3
投票

为什么 CQRS 似乎阻止了写入端的唯一约束?

没有

它所做的就是认识到在分布式集合上维护不变量是一场噩梦。

对我来说最明显的解决方案是在写入端添加唯一索引从未提及,没有任何解释

没错。如果您没有分布式集合——如果集合的所有元素都存储在一起——那么维护不变性就很简单了。

但是跨两个数据库的唯一索引约束意味着什么?

为了用更现代的术语表达这个想法,指导性假设是业务逻辑应该是“规模不可知论”。如果两个写入模型“真的”彼此独立,那么我们应该能够单独存储它们。 如果需要满足一个约束,该约束依赖于来自两个不同写入模型的数据,那么这些写入模型并不是真正独立的。

Greg Young 提出了

一个非常好的问题

失败会对业务产生什么影响?

毕竟,这是我们在领域驱动设计中应该考虑的事情。

为什么事件溯源会阻止我在唯一字段上放置索引?

实际上是相同的答案:不会,

只要您的独特约束和您的事件存储在一起

如果您有一个 RDMBS,其中包含代表集合元素的表和存储事件的表,您可以在单个事务中一起更新这两个表,并在违反约束时回滚整个混乱情况。 但是采取同样的想法,并将集合放入与事件不同的数据库中?现在您有两个不同的事务需要协调。祝你好运。

© www.soinside.com 2019 - 2024. All rights reserved.