【问题标题】:Data Model design and Domain Model design数据模型设计和领域模型设计
【发布时间】:2009-06-17 01:13:22
【问题描述】:

我正在尝试为一家杂货店建模。在店内,有好几条“过道”。每个“通道”都有一组它存储的“项目”“类别”。每个“类别”只能属于一个“通道”。每个“项目”只能有一个“类别”。

数据模型对我来说似乎很简单:

  • 带有 ID 和说明的“过道”表
  • 具有 ID、NAME 和引用“过道”表的 AISLE_ID 的“类别”表
  • 具有 ID、NAME、DESCRIPTION 和引用“类别”的 CATEGORY_ID 的“项目”表

对象模型是我需要帮助的地方:

  1. Aisle 对象可以在其中包含 Category 和 Item 对象的列表。
  2. Aisle 对象可以有一个 Category 对象列表。 Category 对象可以在其中包含 Item 对象的列表。
  3. Aisle 可以有一个 Item 对象列表。一个 Category 对象可以有一个 Item 对象的列表。

在每一种情况下,一个项目在逻辑上都会在其中包含一个类别对象。我为每个域对象都有一个 DAO,所以根据它的完成方式,sql 会发生一些变化。有什么想法吗?

【问题讨论】:

  • 几乎每个岛上都有糖果棒和小报。那会是更准确的杂货店模型吗?

标签: database-design oop model domain-driven-design


【解决方案1】:

我投票给选项#2。比 #1 或 #3 更有意义。

您认为这种关系需要是双向的吗? Item 是否需要能够确定其父 Category 和祖父 Aisle 是谁?

【讨论】:

  • @duffymo 这是一个非常好的问题。现在我的模型支持类别和项目之间的双向关系。它有点古怪,因为它会形成一个循环关系:S 我可能只需要包含一个项目有一个类别的“浅”关系,但类别只填充它的 ID 和名称,not 属于该类别的所有项目。你怎么看?
  • @dj:那么它肯定是#2,因为这样你就可以拥有一个带有空列表的类别。从 Hibernate 的角度来看,“inverse=false”打破了循环。
  • @duffymo 当我从持久性加载数据时,是否应该存在整个结构?例如,当加载一个 Aisle 对象时,它所包含的所有类别是否都应具有该类别中包含的所有项目?
  • 取决于你在谈论多少。如果数字成为问题,我会说他们是懒惰获取的候选人。只需从持久层中获取您需要的那些。
【解决方案2】:

我会选择#2。

过道的主要关注点是其中包含哪些类别。应该由 Category 类来确定哪些 Item 是成员。这使每个对象的抽象级别保持一致——其中 Aisle 是更高级别的对象,Category 是一个稍微更详细的级别,item 是最细粒度的。

【讨论】:

    【解决方案3】:

    如果这是您仅有的 3 个选项,那么第 2 个选项最有意义。

    我想,如果我要创建这个模型,我会使用以下模型(稍作修改,只是尽量保持尽可能接近您的想法):

    一个过道对象可以有一个类别对象列表,一个类别对象可以有一个项目对象列表,并且一个项目与一个类别和一个过道相关联。

    我的修改似乎更多是在数据方面。

    我会这样做的原因是,有人说“嘿,我正在寻找这个特定的项目,它在哪个过道?” -- 1 次查找会给你答案。而对于您的数据模型,您需要 2 次查找。

    至少我是这么认为的。

    【讨论】:

    • @Sev 我同意你的看法。我的评论将与我对 duffymo up top 的评论一致,因为保持“浅”关系可能更有意义,即组合对象不包含任何进一步的组合对象。
    猜你喜欢
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多