domain-driven-design - 如何对具有一对零或多关系的聚合进行建模
问题描述
我正在阅读 Vaughn Vernon 的实现领域驱动设计一书。但是我很快就遇到了在我的领域建模聚合的麻烦 - 足球比赛。
我的情况是根据某些条件(过滤器)列出所有匹配项,例如:
- 列出将要进行的联赛的所有比赛
- 列出组中某个联赛的所有比赛
- 列出淘汰赛阶段联赛的所有比赛
正如我所见,联赛(例如世界杯)将有许多阶段,例如小组赛或淘汰赛阶段。
一个阶段将有很多轮,例如。16强、1/4决赛等
一轮会有很多比赛。
但是,有些联赛没有舞台,例如。超级联赛。即使是国际友谊联赛也没有舞台和回合。
第一个解决方案:
我们将有 4 个聚合:
- 联赛将包含阶段
- 阶段将包含回合
- 回合将包含比赛
对于没有阶段或回合的联赛,将为阶段和回合创建一个特殊标识符,例如。NO_STAGE 或 NO_ROUND
第二种解决方案:
联赛将包含比赛。Stage 或 Round 只是 Match 的属性(值对象)
第三种解决方案:
创建所有类型的联赛:
- 联赛有阶段、回合和比赛
- 联赛有回合和比赛
- 联赛只有比赛
解决方案
潜在的问题是,您正在尝试对数据而不是行为进行建模。您正在创建一个关系模型(包含什么、一对一、一对多等),而不是对象模型。如果没有关于它必须支持什么功能的上下文,建模数据是没有意义的。
如果您只想要一个数据模型,那么 DDD 就无关紧要,因为这不是一种数据建模技术。
我假设您想构建面向对象的软件。在这种情况下,通过确定您想要从软件中获得什么功能来解决问题,并对其进行建模。
例如:安排比赛、准备/显示事件日历、模拟进程等。
推荐阅读
- c++ - 函数 C++ 中的新运算符
- glsl - WebGL:将纹理从顶点着色器传递到片段着色器
- c# - 在 C# 中为接收到的串行数据事件处理程序实现线程安全队列
- dynamic - 合并两个表和一个串联 - Power BI Q
- salesforce - 实体“任务”上没有这样的“电子邮件”列。
- java - Apache DateUtils 无法解析 2018-03-11 02:00:00 夏令时时间戳
- mysql - mysql在查询后没有释放池连接
- c++ - 如何将字符串加载到 BYTE* 数组的元素中 (C++)
- php - 雄辩的 stdClass 对象返回数组?
- javascript - Javascript:格式化日期