Architecture DDD在Northwind数据库中的应用

Architecture DDD在Northwind数据库中的应用,architecture,domain-driven-design,ddd-repositories,Architecture,Domain Driven Design,Ddd Repositories,我想做一些练习,并将DDD应用到我应用于Northwind数据库的域模型中。即使Northwind是一个例子,我想它是为了满足一些“虚拟业务”需求而做的。因此,我们的目标是建立一个尊重DDD的域模型,并将数据存储在Northiwnd数据库中 考虑以下EF持久性模型: (来源:) 请注意,我们只有实体和双向关系。我想有一个真正的DM尊重DDD。而且,我的DM模型不需要是我数据库的镜像 如何在需要时将des关系更改为只有单向关系或双向关系 是否存在可以更改为一对一的多对一或一对多关系 你会如何塑造

我想做一些练习,并将DDD应用到我应用于Northwind数据库的域模型中。即使Northwind是一个例子,我想它是为了满足一些“虚拟业务”需求而做的。因此,我们的目标是建立一个尊重DDD的域模型,并将数据存储在Northiwnd数据库中

考虑以下EF持久性模型:


(来源:)

请注意,我们只有实体和双向关系。我想有一个真正的DM尊重DDD。而且,我的DM模型不需要是我数据库的镜像

  • 如何在需要时将des关系更改为只有单向关系或双向关系

  • 是否存在可以更改为一对一的多对一或一对多关系

  • 你会如何塑造一个革命者

  • 如果需要,价值观对象、服务和工厂如何

  • 我知道我可能应该看看业务需求,看看模型应该如何改变,但我希望你能就此提出建议

    如果我的问题不清楚,请不要犹豫询问细节


    提前感谢。

    一般来说,我很想回答(在禅宗意义上),因为从DDD的角度来看,这个场景是错误的。在DDD中,我们从业务需求和领域专家开始,并从中衍生出一个领域模型

    尽管这是一个有争议的问题,但数据库几乎只是业务需求的附带产物(几乎总是声明必须持久化实体)

    也就是说,我会尽力做到最好

    在大多数情况下,订单是一个非常重要的业务对象,显然我们需要了解订单行,包括每一行中的产品,因此我们似乎需要从订单行(订单详细信息)到产品的关联

    然而,当给定一个特定的产品时,我们很少需要知道它包含在哪个订单中,因此这表明存在单向关系。我们可以从订单行导航到产品,但不能从产品导航到订单行

    然而,上述分析在更深层次上可能是错误的。想象一下开发人员和领域专家之间的以下对话:

    Dev:我们创建了从订单到产品的关联,以便我们始终了解特定订单中产品的所有信息

    Exp:听起来不错,但是供应商呢

    开发:也包括在内

    Exp:那么当我们更换产品的供应商时会发生什么

    Dev:也将隐式反映在订单数据中

    Exp:这不是我们想要的。我们希望数据反映发货时的订单

    在本例中,事实证明数据库模式中确实存在错误。问题可能是由报告引起的,因为业务分析人员可能希望运行关于不同供应商如何影响收益的报告(我知道什么)

    这种情况可能会建议将订单行与产品之间的关联完全切断。订单应保存历史(快照)产品数据,而不是当前产品数据

    我们甚至可以引入一个
    ProductSnapshot
    值对象,它在语义上反映了一个
    产品
    实体,以在域模型中对此进行建模

    总而言之,将
    订单
    建模为自身和订单行的集合(使用
    产品快照
    )似乎越来越合理,但订单和客户之间的关系又如何呢

    正如我目前理解的关联和聚合,关联定义聚合。如果有订单,我们想了解客户的情况吗?很有可能。如果有客户,您想知道订单的情况吗?可能吧

    这表明了一种双向关系,它使
    Customer
    成为聚合根。这意味着您将拥有一个
    CustomerRepository
    ,但没有
    OrderRepository
    。每次您需要订单时,都必须通过
    客户
    获得

    在某些情况下,这可能是完全合理的,而在其他情况下,这可能真的很笨拙。这实际上取决于业务需求

    您可以考虑创建<代码> OrthRealStaby< /Cord>,但这会侵犯<代码>客户< /COD>聚合根。如果您这样做,那么订单的责任就变得模糊了。如果你从订单到客户唠叨会发生什么

    Customer
    有一个订单列表,但是如果您从
    OrderRepository
    中读取订单,它们是否都会填充到内存中

    可能不会,但如果您从
    CustomerRepository
    中阅读客户,则很可能是这样。这里的要点是,对聚合根的分析很重要,一旦定义了聚合,就必须坚持并尊重它

    这使得我喜欢小聚合而不是大聚合,因此在本例中,我将聚合限制为
    订单
    及其订单行,并且
    订单
    客户
    之间没有关联


    订单
    客户
    之间没有正式关联并不意味着我们根本无法关联它们,但我们需要明确的服务为给定客户提供所有订单。我们不能从一个导航到另一个。

    这个例子不是最好的。显然,Northwind数据库是在考虑关系数据的情况下建立的。正如您所说,我们不知道数据库开始时的需求。但是你的分析很好,很详细。它展示了DM应该如何思考和建模。感谢您的时间和详细回复。