V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
289396212
V2EX  ›  程序员

正在用 DDD 开发,请问在划分 aggregate 时候,遇到一些多对多的中间表该怎么处理?

  •  1
     
  •   289396212 · 1 天前 · 1523 次点击
    把这些中间实体单独作为一个 aggregate 吗?
    7 条回复    2025-01-07 13:16:08 +08:00
    dcdlove
        1
    dcdlove  
       1 天前
    通过领域事件来协调多对多关系的更新。例如,当一个 Student 注册到一个 Course 时,可以发布一个 StudentRegisteredForCourse 事件,其他聚合可以订阅这个事件并更新自己的状态。
    289396212
        2
    289396212  
    OP
       1 天前
    @dcdlove 所以中间表还是存在的吗?只是原本是直接拿到这个中间实体的 repo 来增加一个 Student 和 Course 的 row, 变成了从领域事件里来增加这个 Student 和 Course 的 row ?
    alcoholpad
        3
    alcoholpad  
       1 天前   ❤️ 1
    “把这些中间实体单独作为一个 aggregate 吗?”
    这个要根据实际业务情况来分析的,如果这个中间实体没有独立的业务场景,只是关联关系的话,不需要单独作为聚合根。 但如果它有独立的业务场景和生命周期,就需要单独作为一个聚合根,比如说学生和课程这个 “选课” 中间关系,选课需要审批流程(独立业务场景)、选课要求不随着学生或课程的不存在而消失(独立的生命周期)等。
    2han9wen71an
        4
    2han9wen71an  
       1 天前
    我一般中间表要落库就弄聚合,不过我也是半吊子哈
    YuuuuuuH
        5
    YuuuuuuH  
       1 天前   ❤️ 1
    多对多里面一定有业务,你得提取它的业务概念出来。比如 Student 和 Course 的多对多关系,可以提取出 [选课] ( CourseEnrollment )的业务概念。DDD 一定要提取业务概念! DDD 一定要提取业务概念! DDD 一定要提取业务概念!
    AcFnu
        6
    AcFnu  
       1 天前   ❤️ 1
    领域设计就不要表设计先行了,分析问题的时候只关心领域业务,先把你问题域分析好了,就拿上面学生和课程的例子来说,学生和课程理论上都要单独作为聚合根的,此时学生与课程的关联关系是要单独处一个 Vec<Student>和 Vec<Course>的业务聚合根(或者更多你的业务)用来处理学生和课程多对多的领域问题,然后正常就走 route-》 cmd-》 handler-》 aggregate-》 event-》至于监听事件后的 repo 你关系行数据库就正常该怎么关联存就怎么存
    WispZhan
        7
    WispZhan  
       1 天前
    @AcFnu +1

    业务层是业务层,持久层是持久层。 既然是 DDD ,就不要搞普通的三层了。嫌多、嫌麻烦就不用 DDD 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2796 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 659ms · UTC 15:13 · PVG 23:13 · LAX 07:13 · JFK 10:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.