我正在研究事件采购,我想我理解其中的大部分内容。显然,事件存储数据库不是查询数据的最佳选择。这就是只读数据库跳入的地方,也就是投影。
我要做的是在事件发生后相应地更新非规范化数据库。
现在假设我有一个User
可以Schedule
和Appointment
的系统。
所以用户可以:
AppointmentCreatedEvent
AppointmentRescheduledEvent
AppointmentCancelledEvent
在我的阅读数据库中,我只有一条记录,其当前状态为Appointment
,即Cancelled
。
假设我只对其状态查询约会感兴趣。因此,active
或cancelled
。
那么我应该只创建一个只包含那么多信息的读数据库表吗?
约会表(只读数据库)
--------------------------------------------------------------
| Id (same as AggregateId in EventStore db) | State |
--------------------------------------------------------------
| 1001 | Cancelled |
| 1002 | Active |
| 1003 | Active |
--------------------------------------------------------------
因此,如果我对所有cancelled
约会感兴趣,我会首先查询读取数据库
示例:SELECT Id FROM Appointments WHERE State = 'Cancelled'
然后使用每个Id
记录的Cancelled
来查询EventStore数据库以重建实际AggregateRoot
对象的状态。
最终,我想展示AggregateRoot
Appointment
对象的所有信息。
或者... 的
我是否应该使用尽可能多的数据来丰富我的读取数据库,从而不必转到EventStore数据库?
这两个中哪一个是Event Sourced系统中最好的方法?
答案 0 :(得分:2)
最终,我希望显示AggregateRoot Appointment对象具有的所有信息。
你为什么要这样?在事件源中,Aggregate仅用于处理命令;换句话说,你不会查询它,也不依赖于它的内部/私人状态。
如果你需要一些具有某种结构的状态,你可以为此构建一个Read模型。
我是否应该使用尽可能多的数据来丰富我的读取数据库,从而不必转到EventStore数据库?
是。 Event存储用于在执行命令之前重新水合Aggregate并完全重建Read模型(如果需要)。