aggregate - 如何建模领域模型 - 聚合根
问题描述
我在正确设计我正在处理的域时遇到了一些问题。
我的直接用例如下:
用户(约 5000 名用户)可以访问广告列表(约 500 万)
他可以选择添加/删除其中一些作为收藏夹。
他可以决定显示/隐藏其中的一些。
我有一个命令会改变聚合状态,比如将收藏设置为 TRUE。
在 DDD 方面,我应该如何设计聚合?
如何设计用户和他最喜欢的广告选择之间的关系?
考虑到大量广告,我无法在用户聚合根目录中复制每个广告。
我可以设计一个包含用户“集合”的 Ads aggregateRoot。
最后,如何处理/执行 readmodels 部分?
提前致谢
干杯
解决方案
两个概念可以帮助您理解如何对此建模:
1.聚合是交易边界。
聚合是被视为单个单元的关联对象的集群。聚合的所有部分都一起加载和持久化。
如果您有一个包含 1000 个实体的聚合,那么您必须将它们全部加载到内存中。因此,您应该尽可能地使用小聚合体。
2.聚合是不同的概念。
聚合代表域中的一个独特概念。与多个聚合相关的行为(如您的情况下的收藏)通常是一个聚合,它本身具有自己的一组属性、域对象和行为。
从你的例子来看,User
是一个明确的聚合。
AnAd
在域中具有与之相关的独特概念,因此它也是一个聚合。可能还有其他实体将嵌入到广告中,例如valid_until
、description
、is_active
等。
收藏广告的概念将User
和Ad
聚合联系起来。您的问题似乎集中在应该保留这种联系的地方。它应该在User
聚合中(一个列表Ads
),还是应该在其中嵌入Ad
一组对象?User
虽然两者都是可能性,但恕我直言,我认为这FavoriteAd
是另一个聚合,它包含对User
聚合和Ad
聚合的引用。这样,您就不会为偏爱行为的概念带来User
负担Ad
。
这些聚合也不需要在每次加载到内存时加载这些附加数据。例如,如果您正在加载一个Ad
对象以编辑其内容,您不希望收藏夹集合默认加载到内存中。
就读取模型而言,这些聚合结构无关紧要。聚合仅处理域的写入端。您可以在读取端以多种形式自由地重新连接数据。您可以让订阅者仅监听Favorited
事件(在处理命令后引发Favorite
)并构建包含来自聚合User
和Ad
聚合的数据的复合数据结构。
推荐阅读
- angular - Angular 5如何获取复选框值
- jquery - 如何防止引导验证在表单提交之前显示错误消息?
- c# - SettingsBase 的序列化规则是什么
- oracle - 如何将 NCLOB 从 BFILE 加载到 Oracle DB
- excel - 在 Excel 文件中从 2 个不同的 csv 文件中写入一列,其中另一列作为键
- vba - 仅允许数字作为用户输入值到 Application.InputBox for CommandButton1_Click()
- r - 如何在 r 中的 strftime 中添加假期
- hazelcast - Hazelcast 在相邻网络之间是否有网关
- android - Jitpack Gitlab Private Repository Trial 没有对 repo 的读取权限
- flutter - 颤振媒体记录器振幅