首页 > 解决方案 > 如何建模领域模型 - 聚合根

问题描述

我在正确设计我正在处理的域时遇到了一些问题。

我的直接用例如下:
用户(约 5000 名用户)可以访问广告列表(约 500 万)
他可以选择添加/删除其中一些作为收藏夹。
他可以决定显示/隐藏其中的一些。

我有一个命令会改变聚合状态,比如将收藏设置为 TRUE。

在 DDD 方面,我应该如何设计聚合?
如何设计用户和他最喜欢的广告选择之间的关系?
考虑到大量广告,我无法在用户聚合根目录中复制每个广告。
我可以设计一个包含用户“集合”的 Ads aggregateRoot。

最后,如何处理/执行 readmodels 部分?

提前致谢

干杯

标签: aggregatedomain-driven-designcqrsaggregateroot

解决方案


两个概念可以帮助您理解如何对此建模:

1.聚合是交易边界。

聚合是被视为单个单元的关联对象的集群。聚合的所有部分都一起加载和持久化。

如果您有一个包含 1000 个实体的聚合,那么您必须将它们全部加载到内存中。因此,您应该尽可能地使用小聚合体。

2.聚合是不同的概念。

聚合代表域中的一个独特概念。与多个聚合相关的行为(如您的情况下的收藏)通常是一个聚合,它本身具有自己的一组属性、域对象和行为。


从你的例子来看,User是一个明确的聚合。

AnAd在域中具有与之相关的独特概念,因此它也是一个聚合。可能还有其他实体将嵌入到广告中,例如valid_untildescriptionis_active等。

收藏广告的概念将UserAd聚合联系起来。您的问题似乎集中在应该保留这种联系的地方。它应该在User聚合中(一个列表Ads),还是应该在其中嵌入Ad一组对象?User

虽然两者都是可能性,但恕我直言,我认为这FavoriteAd是另一个聚合,它包含对User聚合和Ad聚合的引用。这样,您就不会为偏爱行为的概念带来User负担Ad

这些聚合也不需要在每次加载到内存时加载这些附加数据。例如,如果您正在加载一个Ad对象以编辑其内容,您不希望收藏夹集合默认加载到内存中。

就读取模型而言,这些聚合结构无关紧要。聚合仅处理域的写入端。您可以在读取端以多种形式自由地重新连接数据。您可以让订阅者仅监听Favorited事件(在处理命令后引发Favorite)并构建包含来自聚合UserAd聚合的数据的复合数据结构。


推荐阅读