即使经过数小时的搜索,我也无法准确定义这些内容.我的理解是聚合是一个ID表,它将商店内的事件(集合)组合在一起,通常使用对象表示,这也是聚合类型的原因.
另外,我已经看到了带有版本号的聚合表,我发现它们本质上是表示事件集合的组/容器/聚合ID,这让我感到困惑.
因此,我们同意您尝试将事件流设置为DDD Aggregate Root和Aggregate模式.有一种常见的模式,即每个聚合都有自己的流.它具有聚合根的名称和标识,但名称部分不是必需的.
整个聚合上的所有操作都由事件表示,然后将事件写入此流.
因此,如果您有一个聚合根MyNamespace.Order,它有多个子值对象或实体MyNamespace.OrderLine,则所有行上的操作都是通过访问聚合根方法完成的,所有事件都写入一个流,因此对于ID为123的订单这将是:
流:MyName
> space.Order-123
> OrderPlaced
> OrderDeliveryAddressSet
> OrderLineAdded
> OrderLineAdded
> OrderLineRemoved
> OrderConfirmed
> OrderETASet
> OrderPaid
> OrderDispatched
> OrderDelivered
实体的概念没有在事件存储方面表示,因为您无法轻松定义不同流之间的关系以从多个流中读取事件以重构聚合.因此,所有事件都在聚合根流中写入和读取,然后聚合根流成为整个聚合的流.
关于聚合的一个重要规则是聚合也是一致性边界.这基本上意味着聚合上的所有操作必须在一个事务中完成.
保持事件版本以处理并发非常重要.当您从事件存储中读取聚合时,您也会获得最新的事件版本.执行操作后,您将写回新事件,检查最新事件版本是否仍然相同.如果最后一个事件版本不匹配,则抛出并发异常,因为有人已经更改了聚合并在您发生冲突之前将更改写入了存储.
关于“表格”,我不太清楚你的意思.当然,您可以在表格中对事件存储进行建模,并且在执行此操作时有不同的策略.更常见的是你不喜欢使用专门的事件存储,比如this one.