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

Indexing 为什么CQR似乎阻止写入端的唯一约束?,indexing,unique,cqrs,Indexing,Unique,Cqrs,无论我在哪里看到一篇关于确保CQRS体系结构中的唯一性的帖子,对于我来说,最明显的解决方案就是在写端添加一个唯一的索引,这一点从未被提及,没有任何解释 取而代之的是,我读到必须查询读取模型,并发问题应该通过一个补偿操作的传奇来解决。当您可以拒绝关于唯一索引冲突的命令时,这似乎过于复杂,那么这是为什么呢 为什么CQR似乎阻止写入端的唯一约束 没有 它所做的是认识到在分布式集合上维护不变量是一场噩梦 对于我来说,最明显的解决方案是在写端添加一个唯一的索引,这一点从未被提及,没有任何解释 对。如果您没

无论我在哪里看到一篇关于确保CQRS体系结构中的唯一性的帖子,对于我来说,最明显的解决方案就是在写端添加一个唯一的索引,这一点从未被提及,没有任何解释

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

为什么CQR似乎阻止写入端的唯一约束

没有

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

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

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

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

为了用更现代的术语来表达这个想法,指导性的假设是业务逻辑应该是一致的。如果两个写模型彼此独立,那么我们应该能够分别存储它们

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

一个非常好的问题

失败对业务的影响是什么

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

为什么事件来源会阻止我将索引放在唯一字段上

答案其实是一样的:只要您的唯一约束和事件存储在一起,就不会发生这种情况

如果您有一个RDMBS,其中包含一个表示集合元素的表,以及存储事件的表,那么您可以在一个事务中同时更新这两个表,并在违反约束时回滚整个混乱


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

你到底是如何考虑在写端添加一个唯一的索引的?哪里有无事件源的CQRS?我的写模型是一个数据库,因此我可以在我想要的字段上添加唯一的索引。假设用户发送电子邮件,如果这很重要的话。如果没有事件源,也可以不使用事件源。这与指定有关,即,使用ES,您没有用于写入模型的平面数据库在没有ES的CQRS中是有效的,好的,您提出的建议是否意味着由于写入模型无法强制执行unicity的可能性,从未考虑最简单和明显的解决方案?为什么对ES无效?