为什么 CQRS 似乎可以防止写入端的唯一约束?

Why does CQRS seem to prevent unique constraints on write side?

我到处都看到 post 关于确保 CQRS 体系结构中的唯一性,对我来说最明显的解决方案是在写入端添加唯一索引,但从未提及,也没有任何解释。

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

Why does CQRS seem to prevent unique constraints on write side?

没有

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

the most obvious solution for me which is to add a unique index on the write side is never mentioned, without any explanation

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

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

为了用更现代的术语表达这个想法,指导假设是业务逻辑应该是 scale agnostic。如果两个写入模型真的相互独立,那么我们应该可以将它们分开存储。

如果需要满足的约束取决于来自两个不同写入模型的数据,那么这些写入模型并不是真正独立的。

Greg Young raised一个非常好的问题

What is the business impact of having a failure?

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

Why would event sourcing prevent me to put an index on unique fields??

答案确实相同:不会,只要您的唯一约束和您的事件存储在一起

如果您的 RDMBS 带有代表集合元素的 table 和存储事件的 table,您可以同时更新这两个 table单个事务,如果违反约束,则回滚整个混乱。

但是采用同样的想法,将集合放在与事件不同的 数据库中?现在您有两个不同的事务需要协调。祝你好运。