假设我们想要基于域驱动设计实践来建模博客。主要实体是Blog,User,Post,Comment和Like。那么,如何定义聚合,值对象和存储库?通过DDD定义,由于所有实体都依赖于Blog实体,因此似乎只有一个大型聚合与Blog作为它的聚合根。但是,它带来了太多的一致性和性能挑战。
答案 0 :(得分:1)
您应该根据一致性要求对聚合建模。一致性边界越大=>总量越大。
你认为只有一个聚合根与博客一样是有效的吗?从那里我们可以有blog.Posts,blog.Posts(id).Comments和blog.Posts(id).Likes
只有一个像神一样的大聚合Blog
提供了最大的一致性边界,但它会极大地影响性能。想一想:每当有人创建/发布/取消发布/喜欢帖子,发布/编辑/删除评论,然后加载整个Blog
聚合,就会对其嵌套实体执行操作,然后保持该操作。全部在一次交易中。
我建议您阅读有关设计聚合的this blog post。
答案 1 :(得分:0)
你认为只有一个聚合根与博客作为它的根是有效的吗?
是的,绝对。
定义较小的聚合边界是有好处的;例如,如果进行无关更改的用户不会相互阻止,您可以获得更好的扩展,如果您可以看到域的不同部分彼此隔离,则更容易推理域模型。
但是这样做会增加复杂性;因此,您可能希望推迟复杂性的引入,直到您更好地理解问题,或者直到您有足够的用户来解决争用问题,从而提供切实的业务价值。
对于类似博客的内容,如果您的主要用例是单个人类作者,那么您可能不会有很多争用问题 - 机器将比人类快得多,所以单个聚合会没问题。