事件 Sourcing/CQRS 只读端的数据库限制

Event Sourcing/CQRS Database constraints on Read Only Side

我们公司想为我们的财务系统实施事件 Sourcing/CQRS。

对于只读模型,我们应该应用数据库约束吗? 我知道约束不应该在 Write 事件存储端。 只读模型端怎么样?

包括:

For the Read Only Model, should we apply Database constraints? I know constraints should Not be on the Write event store side. How about the Read only Model side?

这可能没有任何用处。

从根本上说,有两种情况。一是读取模型中的约束与领域模型的约束不一致。如果领域模型是权限,那么读模型是错误.

另一个是约束对齐了,但是读取模型认为约束被违反了,因为它对正在发生的事情没有完整的了解。 IE,域模型发出事件 [A,B,C,D],但读取模型现在只能看到 [A,B,C]

现在,读取模型中的数据应该被理解为陈旧的;因此,仅当域的新的、一致的视图可用时才更新读取模型并非不合理。

但即便如此,仍然不清楚约束是由数据存储还是由填充存储的事件使用者强制执行的。

我不确定数据库限制在正常操作期间是否会给您带来任何好处。

它们可能在异常操作期间成为有用的指南;如果有人试图修补读取模型 "by hand",那么在数据库中拥有约束的冗余副本可能会防止数据输入错误。 (读取模型的通常恢复过程是销毁缓存副本并重建它;但如果这将花费相当长的时间,则通过修复现有副本直到新副本可用,您的 SLO 可能会更好) .

我在读取模型上使用数据库约束。

  • FK 有助于级联删除并告诉您(如果您遇到异常)您的应用程序中有一些案例最终状态不一致(也许应用程序在过去的某一时刻崩溃并阅读模型未更新)。持久的服务总线可以缓解这种情况。
  • 默认值只是默认值,我看不出有什么问题。
  • 我使用 Unique 约束来实现幂等性,并在发生违规时忽略。

您知道,您可以出于多种目的使用数据库约束,其中 none 与您在写入模型中使用的业务约束有任何关系。