手把手教你落地 DDD
钟敬
Thoughtworks 首席咨询师、数字化转型与运营团队 DDD 负责人
19697 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
AIGC特别策划 (2讲)
结束语&结课测试 (2讲)
手把手教你落地 DDD
15
15
1.0x
00:00/00:00
登录|注册

21|用“限定”建模:怎样简化一对多关联?

你好,我是钟敬。
在前几节课我们讲完了值对象。今天咱们学习另外一种建模技术——限定。
在《DDD》原书里讲关联的时候,专门强调了这个方法,因为限定可以起到丰富模型语义和简化关联的作用。
然而我发现,即便是一些 UML 老手,会用这个技术的也不多。这个技术掌握起来没有想象中那么难,而用起来的效果很好。如果你能掌握,那么就向建模专家的目标又迈进一步了。

什么是“限定”

我们可以先回忆一下上节课完成的模型图。
为了说明“限定”的概念我们可以从员工工作经验的关系开始。
一个员工可以拥有多份工作经验,而各个工作经验时间段不能相互重叠。那么,我们可以得出一个推论:对于一个员工而言,每个时间段只能有一条工作经验
虽然这种关系在“时间段不能重叠”这个约束里已经隐含了,但是 UML 里还有一种专门的方式,可以表达这个规则中的部分含义。我先画出来给你看看。
之前,员工工作经验之间有一个一对多关联。现在,在员工那一端加了一个小方框,里面写了“: 时间段”,而另一端的多重性,由原来的“0..*”神奇地变成了“0..1”。
这种方式所表达的意思是说,对于一个员工而言,任何一个时间段,要么没有工作经验,要么有一条工作经验,但不能有多条工作经验。换句话说,总体上看,一个员工可以有多条工作经验,但限定在一个时间段的话,那么最多就只能有一条工作经验了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

领域建模中的“限定”技术是一种重要的建模技术,通过对一对多关联进行简化,丰富了模型语义。本文从员工和工作经验的关系出发,介绍了“限定”的概念和作用。通过限定符的使用,可以表达更严格的约束,简化关联关系的多重性,将一对多关系转化为一对一。文章还探讨了在领域模型中识别更多可以使用限定的地方,并且介绍了“限定”的数据库实现和代码实现。通过实例分析,读者可以更好地理解“限定”在领域模型中的用法和实现方式。文章内容详实,适合领域建模领域的技术人员阅读。文章还提到了在模型和自然语言之间的双向转换是建模的重要技能,强调了对“限定”概念的理解和应用。在代码实现环节里实践DDD,建议是写代码的同时一定要打开模型图,培养边看图边写代码的习惯。文章总结了“限定”在模型中的表示方法和实现层面,以及提出了思考题,引发读者对领域建模中更多限定的例子以及多对多关系是否也可以使用限定的思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手教你落地 DDD》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 6点无痛早起学习的和尚
    在工作有这样一个业务场景,拿捏不定是否可以使用这节课的限定: 1. 业务需求,1 个用户可以有多个户类型(一类户、二类户、三类户)的户,约束:但是同户类型只能有一个是正常的户(户可以注销变为不正常)。 解读:1 个用户只能有一个正常的一类户(户类型还有二类户、三类户等等),一类户可以注销(就变为了不正常) 如果我用状态做限定,设置数据库唯一索引(用户 id、户类型、状态),这样就不能存在多个注销状态的一类户,因为会唯一冲突 所以不知道我这个到底能不能做限定了?望老师解答

    作者回复: 正如您分析的那样,这种情况不能用限定。

    2023-02-15归属地:北京
    1
  • tt
    小结,限定使用的属性: - 在数据库实现中,对应组成(复合)唯一索引的某一个列; - 在代码实现中,对应Map的键 - 那么由上面两条结论可以有如下推论:数据库的唯一索引对应代码中的Map - 这个属性是非聚合根的局部标识 限定将一对多形式上转换成一对一,在代码里实际上就是把“多”放入Map中,让聚合根和代表这个Map属性“一对一”

    作者回复: 总结不错,不过最后半句,我觉得更恰当的说是Map里的键和值一对一。

    2023-01-26归属地:北京
    2
    1
  • Spoon
    为什么要在DDD中使用限定?使用限定的优劣是什么?希望在后面的课程可以找到答案

    作者回复: 使用限定可以更准确地表达语义。

    2024-02-26归属地:浙江
  • 王应发
    老师, 租户 ID、员工 ID、开始日期和结束日期 作为唯一约束,那删除只能做物理删除吧,

    作者回复: 你问的是哪个实体?

    2024-01-04归属地:广东
    2
  • 邓西
    1. 同一个员工不同工时记录中的时间段不能重叠; 2. 结合之前的课程,将一个n:n的关联关系,通过引入一个表示关联的实体,拆解成两个1:n的关联,然后就可以通过两个Map结构实现限定了。

    作者回复: 您说的也是一种思路。就整体而言,多对多可能被限定为一对多

    2023-02-13归属地:四川
  • escray
    之前确实没有注意到限定 qualification 的建模技术,因为不太熟悉,感觉在 UML 图中增加限定的标记(小方框)并不太明显。 使用唯一索引可以在数据库中表达”限定“。 使用 Map 取代 List 可以在代码中实现”限定“。 写代码的时候打开模型图,然后看到模型图(领域设计)可以与自然语言双向转换。 思考题: 1. 项目中一般会有限定,但是可能并没有重视,能想到的就是文档的编辑历史,在一个时间段只能有一个人编辑并提交。 2. 多对多如果采用限定来表达,中间需要有一个表或者对象来转换,似乎更复杂了。 限定是否仅用于值对象?

    作者回复: 1 编辑历史的例子挺好 2 多对多,不管有没有限定,多数都要一个中间表。在概念层面,多对多被限定以后,有可能在形式上变成一对多。 理论上限定也可以用于实体,不过我确实也没遇到过这样的例子。

    2023-01-31归属地:北京
  • aoe
    “总体上看,一个员工可以有多条工作经验”,这个不看上文,直接看“时间段限定”的图还真难一眼看出。
    2023-01-25归属地:浙江
    2
    2
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部