【发布时间】:2018-05-17 11:55:59
【问题描述】:
我们正在使用存储单个聚合的事件存储 - 用户的订单(想象一下亚马逊订单,在实际发货之前,客户或电子商务公司中的某人可以随时更新)。
我们将首次允许我们公司的员工查看订单的历史记录,因为到目前为止他们只能看到其当前状态。
我们现在意识到构成聚合根的事件并没有真正显示意图或用户实际做了什么。当顺序应用于空订单时,它们仅用于构建订单的当前状态。问题是:他们应该这样做吗?
假设一个用户最初拥有一本 X 书,然后将其删除并再次添加了 2。我们应该将其视为事件“用户添加了 1 本书”还是事件“用户删除了 1 本书”+“用户添加了 2 本书”(我们似乎已经遵循了这种方法)?
在某些情况下,我们有一个初始事件,然后是其他事件。我,开发人员,肯定知道所有这些事件都是由一个命令触发的,但是在动态生成这个“订单历史”功能供用户查看时,做出这种假设对我来说似乎非常脆弱。但如果我不将它们视为一个单独的操作,至少在订单历史功能中,看起来有很多订单修改,而实际上只有一个,大的。
我应该有包含“微事件”的“宏”事件吗?我是否应该将命令的 id 附加到事件中,这样我就可以轻松推断出同时发生了哪些事件,哪些没有(另一种方法是依赖时间戳……但这很恶心)。
处理这种情况的标准方法是什么?我希望能够随时查看聚合的历史记录并生成此报告(我不想每次更新订单时都以增量方式构建报告)。
谢谢
【问题讨论】:
标签: domain-driven-design cqrs event-sourcing