Database design 领域驱动设计中的聚合建模

Database design 领域驱动设计中的聚合建模,database-design,domain-driven-design,cqrs,event-sourcing,aggregateroot,Database Design,Domain Driven Design,Cqrs,Event Sourcing,Aggregateroot,这个问题与领域驱动设计及其相关概念有关 在本例中,软件负责管理一组公交线路。公共汽车路线是指公共汽车到达和离开的一组车站。该计划表表示任何路线出发以及指定的实际到达和出发时间(同一路线的不同出发点的偏移量可能不同)。库存通过一组单独的表格进行管理,这些表格定义了任何给定时间表的实际容量及其座位分配。旅行是按特定时间表从一个车站到另一个车站的预订 在我所附的图表中,有多个表集群。每个簇都应该是一个集合,其根从左侧开始- 站 多站点路线 多站时间表 具有多个座位分配/预订的库存 绊倒 在传统的

这个问题与领域驱动设计及其相关概念有关

在本例中,软件负责管理一组公交线路。公共汽车路线是指公共汽车到达和离开的一组车站。该计划表表示任何路线出发以及指定的实际到达和出发时间(同一路线的不同出发点的偏移量可能不同)。库存通过一组单独的表格进行管理,这些表格定义了任何给定时间表的实际容量及其座位分配。旅行是按特定时间表从一个车站到另一个车站的预订

在我所附的图表中,有多个表集群。每个簇都应该是一个集合,其根从左侧开始-

  • 多站点路线
  • 多站时间表
  • 具有多个座位分配/预订的库存
  • 绊倒
在传统的体系结构中(缺少领域驱动设计及其聚合概念),我会修改设计以强制实施其他自然约束

例如,座位预订应指出发站和到达站,以防止从出发站到到达站的座位预订也不是该计划的停靠站。我选择不在这里这样做,因为我的理解是,域驱动设计不鼓励跨聚合引用非根实体。由于schedule是聚合根,因此排除了对计划停止的任何引用。同样的情况也存在,以确保计划的站点实际上是路线站点(尽管公平地说,当前设计允许临时调整单个计划的站点)

将库存和座位预订从计划汇总中分离出来,以避免需要跨行程和计划汇总的事务。通过将容量和座位预订组合在一起,我可以保持不变,即售出的座位数始终小于或等于可用性(客户要求)。在目前的方法中,在确认行程和处理付款之前,将获得预订。然而,这种方法仍然给我留下了一个从trip聚合到seat reservation的引用,seat reservation是一个非根实体。在这种情况下,库存实体是根目录,因为管理员可以随时修改容量以降低或提高可用性


简言之,我并不确信我完全理解如何定义聚合边界(也许这些聚合太小了)。我一直在努力将多个聚合整合到一个更大的聚合中,以便数据库能够帮助保持一致性并防止数据损坏。同时,在创建较小的聚合时,我经常尝试创建对非根实体的引用。任何关于解决这些问题的建议都将不胜感激

很难提供详细信息,因为我无法与领域专家联系。然而,关于你的方法,几乎没有什么不正确的地方

  • 如果您专注于领域驱动的设计,那么您应该真正忽略数据库结构。在那个阶段与解决问题无关。如果有什么不同的话,那么按照表来思考会让您感到困惑,并导致更多的数据优先设计,而不是领域优先设计。想想功能。代码需要做什么。而不是数据

  • 考虑某些操作(命令)的约束可能会有所帮助。这些应组合成一个集合。即,骨料应具备维持运营内部约束所需的所有条件。这种方法可以帮助您找到聚合的边缘。其他需要考虑的因素是无处不在的语言。即确保术语的含义相同。这两种方法都是找到边缘的好方法。要找到聚合还有很多,但这会让您开始


  • 希望能有所帮助。

    正如CodeScribbler提到的,ERD在这里不相关

    在你的问题下面有一个“事件来源”标签,所以让我们从这个角度来看这个问题。即使在采购中,我们也需要事件流。事件流应该始终保持一致。看来个人巴士旅行是个不错的选择。在为行程添加另一张机票或预订之前,您可以检查是否有足够的座位

    其他数据在这方面起着支持作用。它主要是一个引用/读取模型,因此不需要在这个有限的上下文中尝试使用DDD和ES对其进行建模


    因此,总结一下:我建议只做一次汇总——一次特定的公交旅行。

    请。从其他文本中转述或引用。给出你所需要的&把它和你的问题联系起来。仅将图像用于不能表示为文本或扩充文本的内容。无法搜索或剪切粘贴图像。包括一个图例/图例和一个图像解释。昨天我读了更多的书,其中一位作者提出了传统的数据优先设计和领域驱动设计之间的相同区别。我认为你的评论开始为我澄清了一些事情。谢谢你的帮助!