何时从Eventstore数据库

时间:2018-02-09 09:29:11

标签: design-patterns domain-driven-design event-sourcing

我正在研究事件采购,我想我理解其中的大部分内容。显然,事件存储数据库不是查询数据的最佳选择。这就是只读数据库跳入的地方,也就是投影。

我要做的是在事件发生后相应地更新非规范化数据库。

现在假设我有一个User可以ScheduleAppointment的系统。 所以用户可以:

  • 创建约会AppointmentCreatedEvent
  • 重新安排约会AppointmentRescheduledEvent
  • 然后取消约会AppointmentCancelledEvent

在我的阅读数据库中,我只有一条记录,其当前状态为Appointment,即Cancelled

这是我的问题。

假设我只对其状态查询约会感兴趣。因此,activecancelled

那么我应该只创建一个只包含那么多信息的读数据库表吗?

约会表(只读数据库)

--------------------------------------------------------------
| 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系统中最好的方法?

1 个答案:

答案 0 :(得分:2)

  

最终,我希望显示AggregateRoot Appointment对象具有的所有信息。

你为什么要这样?在事件源中,Aggregate仅用于处理命令;换句话说,你不会查询它,也不依赖于它的内部/私人状态。

如果你需要一些具有某种结构的状态,你可以为此构建一个Read模型。

  

我是否应该使用尽可能多的数据来丰富我的读取数据库,从而不必转到EventStore数据库?

是。 Event存储用于在执行命令之前重新水合Aggregate并完全重建Read模型(如果需要)。