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

2023-01-21 钟敬
《手把手教你落地 DDD》
课程介绍


讲述:钟敬

时长:大小9.88M

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

什么是“限定”

我们可以先回忆一下上节课完成的模型图。
为了说明“限定”的概念我们可以从员工和工作经验

展开全文
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。

精选留言

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

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

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

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

    共 2 条评论
    1
  • Spoon
    2024-02-26 来自浙江
    为什么要在DDD中使用限定?使用限定的优劣是什么?希望在后面的课程可以找到答案

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

    
    
  • 王应发
    2024-01-04 来自广东
    老师, 租户 ID、员工 ID、开始日期和结束日期 作为唯一约束,那删除只能做物理删除吧,

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

    共 2 条评论
    
  • 邓西
    2023-02-13 来自四川
    1. 同一个员工不同工时记录中的时间段不能重叠; 2. 结合之前的课程,将一个n:n的关联关系,通过引入一个表示关联的实体,拆解成两个1:n的关联,然后就可以通过两个Map结构实现限定了。

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

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

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

    
    
  • aoe
    2023-01-25 来自浙江
    “总体上看,一个员工可以有多条工作经验”,这个不看上文,直接看“时间段限定”的图还真难一眼看出。
    共 2 条评论
    2