如何使用 DDD 为库存跟踪模型设计聚合根?



对于以下贫血域模型:

  • stock: id, code, description, total_amount- 特定库存类型,计算total_amount以加快显示剩余数量的视图,
  • stock_arrival: id, date, document_id- 库存到达事件,以及出于官僚主义/历史原因使用document_id的详细信息的参考文档,
  • stock_arrival_line: stock_arrival_id, stock_id, quantity, unit_price- 描述到货时特定库存变化的行,包括定价,
  • stock_removal: id,...- 库存清除事件,
  • stock_removal_line: stock_removal_id, stock_id- 描述移除事件时特定库存变化的行,
  • 。其他变化股票事件...

贫血域模型具有以下关系约束:

  • stock_arrival_line:stock_id参考资料stock:id
  • stock_arrival_line:stock_arrival_id参考资料stock:id
  • stock_removal_line:stock_id参考文献stock:id
  • stock_removal_line:stock_removal_id参考资料stock:id

可能,stockstock_arrival/stock_removal应该是聚合根,..

上面的域表明,通过映射表,stockstock_arrival/stock_removal之间存在多对多关系,这是我关心的主要部分。

不变量应仅在聚合根及其内部定义。因此,在聚合stock中,需要存储stock_arrival_line/stock_removal_line,以使聚合stock完整。

但是,这同样适用于聚合根stock_arrival/stock_removal,它们需要分别包含自身stock_arrival_line/stock_removal_line,以使这些关于事件的聚合根完整。

遵循 DDD 时,这些...line应属于何处?它们应该重复吗?或者,它应该完全不同地建模吗?


对可能的接近投票者的免责声明:我已经完成了计算机科学研究,数据和操作之间存在严重分歧。最近,我偶然发现了领域驱动的设计,并开始学习它,这是完全不同的方法,我对这种多对多关系和聚合根源感到迷茫。

在您的情况下,Stock应该是聚合根。StockArrivalStockRemoval可以扩展事件类,您可以将其重命名为StockArrivedStockRemoved相对于事件类型对象的过去时态。此外,事件可以包含Line实例的列表(其中Line是一个抽象类,由StockArrivalLineStockRemovalLine子类化(,并通过事件类中的stockId属性引用Stock聚合。在现实生活中,文档上的Line没有id,而是orderNumber。如果是Lineid属性,这个名字听起来很合成,我认为你应该把它重命名为orderNumber

最新更新