2017-08-15 69 views
2

我们公司希望为我们的财务系统实施事件采购/ CQRS。只读端事件采购/ CQRS数据库限制

对于只读模型,我们是否应该应用数据库约束? 我知道约束不应该在写事件存储方。 只读模型如何?

包括:

  • 唯一约束
  • 外键约束
  • 检查约束
  • 默认约束
  • 参照完整性
+1

事件是一个关于现实的完成的过去时态事实。事件源读取模型仅消耗事件。例如,你的系统的行为是什么一个独特的约束会失败? – rep

回答

2

对于只读模型,我们应该应用数据库约束吗?我知道约束不应该在写事件存储方面。只读模型方面如何?

这可能没有任何用处。

基本上,有两种情况。一种是读取模型中的约束与域模型的约束不一致。如果域模型是权威,那么读取的模型是错误

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

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

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

我不确定在正常操作期间数据库限制会为您购买任何东西。

他们可能在特殊操作中是有用的指导;如果某人试图“手动”修补读取模型,那么在数据库中拥有冗余的约束副本可能会防止数据输入错误。 (读取模型的常见恢复过程是您销毁缓存副本并重建它;但如果这需要花费相当多的时间,则可以通过修复现有副本来更好地服务您的SLO,直到新副本可用为止) 。

-1

我在读取模型上使用db约束。

  • FKS与级联帮助删除以及告诉你(如果你得到一个例外),你必须在你的应用中的一些情况下结束了不一致的状态(也许是应用在过去坠毁在一个点和读取模型未更新)。一辆耐用的公共汽车可以缓解这种情况。
  • 默认值只是默认值,我没有看到问题。
  • 我使用唯一约束来达到幂等目的,并在发生违规时忽略它。

您会发现,您可以将db约束用于多种目的,而且它们都与您在写入模型中使用的业务约束无关。

+0

我刚刚了解到读取模型应该不会拒绝来自写入存储的事件,这可以读取到异步行为,规则应该在域侧执行,例如:写入存储具有没有父项的子项,这应该流入读取模型,如读取模型不应该隐藏数据,希望这有助于 – AppleBook89

+0

默认值应该只添加etl timedate和作者姓名,默认值不应该添加业务数据,如果写入存储具有空业务数据,读取存储应该有空业务数据,写入存储是数据的真相 – AppleBook89