• 请不要在回答技术问题时复制粘贴 AI 生成的内容
289396212
V2EX  ›  程序员

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

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

    业务层是业务层,持久层是持久层。 既然是 DDD ,就不要搞普通的三层了。嫌多、嫌麻烦就不用 DDD 。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1763 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 111ms · UTC 17:25 · PVG 01:25 · LAX 09:25 · JFK 12:25
    ♥ Do have faith in what you're doing.