我应该避免在没有事件存储的系统中使用聚合 (DDD) 吗?
Should I avoid aggregates (DDD) in a system without an event store?
我正在研究在没有事件存储的系统中采用域驱动设计的(根)聚合概念的可能性。然而,我对这两者的了解越多,就越觉得一个离不开另一个。
我还没有读完这本蓝皮书,但到目前为止,我对根聚合的理解是,它是一个 "tree" 聚合,需要在该根聚合内保持一致。聚合只能通过它所属的根聚合进行修改。最后,根基本上可以定义为 "does it make sense to have this aggregate independent and can it exist by itself in this domain?".
想象一个尚未开发的项目,在其中设计事件溯源尚无意义,但将来可能会从中受益。没有事件存储将消除跟踪在特定时间点形成根聚合的所有域事件的可能性。这些命令必须改变根聚合。此外,由于没有事件可重播性,读取端将仅限于对 "root aggregate {id} has updated" 做出反应。
在没有事件存储的情况下,(根)聚合的概念是否存在任何合理的方式,或者应该坚持 "traditional" 实体建模直到投资事件溯源有意义?
我相信你把事情弄糊涂了。没有根聚合或聚合树这样的东西。
DDD 中存在聚合战术模式的主要目的是定义一致性边界,从技术上讲,这可以转化为事务边界。当您处理单个命令时,一个聚合内的所有内容都可以更改,但不会再更改。
聚合可以包含多个实体类型。但是,只有一种实体类型用作 聚合根 。聚合根 id 是整个聚合的标识。聚合内的其他实体将有它们的 id(否则这些不是实体而是值对象)但这些实体不能直接从聚合外部修改或引用,并且对一个聚合内所有实体的所有操作都会访问聚合根。
最典型的聚合示例是 Order
,其中 Order
本身(或 OrderHead
如果您愿意)是根,OrderLine
是实体.一个订单可以有多个订单行,但任何行上的所有操作都通过根。
聚合模式与 event-sourcing 之间没有直接和明确的联系。 Event-sourcing 是实现细节。埃里克·埃文斯 (Eric Evans) 的书甚至没有提到 event-sourcing,它有很多聚合示例。
Event-sourcing是持久化数据的方式。事实上,event-sourcing 与 DDD 完全无关,尽管 Greg Young 最初提出使用 event-sourcing 作为通过存储域事件来持久化聚合的方式。
当你有一个纯领域模型时,从领域模型的角度来看,你使用什么持久性机制并不重要。许多 event-sourced 系统根本没有聚合的概念。例如,纽约时报 has built 一个 event-sourced 内容管理系统,没有考虑任何 DDD 战术模式。另一方面,大多数使用战术 DDD 模式的系统不使用 event-sourcing 而只使用 state-based 持久性。
我正在研究在没有事件存储的系统中采用域驱动设计的(根)聚合概念的可能性。然而,我对这两者的了解越多,就越觉得一个离不开另一个。
我还没有读完这本蓝皮书,但到目前为止,我对根聚合的理解是,它是一个 "tree" 聚合,需要在该根聚合内保持一致。聚合只能通过它所属的根聚合进行修改。最后,根基本上可以定义为 "does it make sense to have this aggregate independent and can it exist by itself in this domain?".
想象一个尚未开发的项目,在其中设计事件溯源尚无意义,但将来可能会从中受益。没有事件存储将消除跟踪在特定时间点形成根聚合的所有域事件的可能性。这些命令必须改变根聚合。此外,由于没有事件可重播性,读取端将仅限于对 "root aggregate {id} has updated" 做出反应。
在没有事件存储的情况下,(根)聚合的概念是否存在任何合理的方式,或者应该坚持 "traditional" 实体建模直到投资事件溯源有意义?
我相信你把事情弄糊涂了。没有根聚合或聚合树这样的东西。
DDD 中存在聚合战术模式的主要目的是定义一致性边界,从技术上讲,这可以转化为事务边界。当您处理单个命令时,一个聚合内的所有内容都可以更改,但不会再更改。
聚合可以包含多个实体类型。但是,只有一种实体类型用作 聚合根 。聚合根 id 是整个聚合的标识。聚合内的其他实体将有它们的 id(否则这些不是实体而是值对象)但这些实体不能直接从聚合外部修改或引用,并且对一个聚合内所有实体的所有操作都会访问聚合根。
最典型的聚合示例是 Order
,其中 Order
本身(或 OrderHead
如果您愿意)是根,OrderLine
是实体.一个订单可以有多个订单行,但任何行上的所有操作都通过根。
聚合模式与 event-sourcing 之间没有直接和明确的联系。 Event-sourcing 是实现细节。埃里克·埃文斯 (Eric Evans) 的书甚至没有提到 event-sourcing,它有很多聚合示例。
Event-sourcing是持久化数据的方式。事实上,event-sourcing 与 DDD 完全无关,尽管 Greg Young 最初提出使用 event-sourcing 作为通过存储域事件来持久化聚合的方式。
当你有一个纯领域模型时,从领域模型的角度来看,你使用什么持久性机制并不重要。许多 event-sourced 系统根本没有聚合的概念。例如,纽约时报 has built 一个 event-sourced 内容管理系统,没有考虑任何 DDD 战术模式。另一方面,大多数使用战术 DDD 模式的系统不使用 event-sourcing 而只使用 state-based 持久性。