CQRS /事件采购:如何实施数据完整性?

时间:2014-05-04 12:00:42

标签: cqrs event-sourcing

如果我实施CQRS和事件源,假设数据的最终存储(读取存储)是在RDBMS中,我该如何维护数据的完整性和一致性?

如果发布了一个事件,但是由于检查违规或缺少FK引用,RDBMS会拒绝从中派生的数据,该怎么办?

2 个答案:

答案 0 :(得分:5)

CQRS意味着至少有两种模式:写入和读取。两者都可以存储在同一个db或不同的dbs中。使用ES,你正在使用一个事件存储,它本身可以在rdbms之上实现(在.net中有NEventStore,它可以与很多数据库rdbms一起使用)。

你说你在rdbms中有 read 模型,这很棒。没有什么需要强制执行,因为它是读取模型,模型更新程序之外没有人接触到它。应用程序客户端只能查询该模型,从不修改它。这就是为什么你首先有2个模型,这样Domain就可以使用'write'模型,而app的其余部分可以使用'read'模型。

此外,RDBMS不应该拒绝任何东西。事件处理程序应该是幂等的,因此,如果处理程序插入具有唯一ID的内容,则第二次调用应该忽略任何唯一约束违规。使用CQRS,您使用RDBMS约束来支持幂等性,而不是实现某些业务规则。

此外,将阅读模型视为“扔掉模型”,可以随时更改或重建。

答案 1 :(得分:2)

我们的阅读模型非常简单。我们没有foriegn键,所以这是不可能的。你为什么需要外键?您可能具有foriegn键值,但您不需要由域模型强制执行的约束。您实际上只是阅读并且可以根据需要重建所有读取存储。