两个实体之间具有N2N关系的组成之间的关系

时间:2013-04-30 21:15:25

标签: database-design relational-database entity-relationship

我定义了两个实体:

Product:
    ProductId  (PK)
    Name       (not null)

Parts:
    PartId     (PK)
    Name       (not null)

它们之间定义了多对多关系。 在我的要求中,我需要模拟复合产品/零件项目与其他复合产品/零件之间的另一个一对多关系。在某些情况下,我还需要能够将没有零件的产品链接到产品/零件项目。 我用这种方式建模:

ProductPartLink:
    ProductPartLinkId  (PK)
    ProductId          (not null)
    PartId             (null)
    ParentId           (null)

出于某种原因,这似乎不是建模此设计的最佳方式。 没有太多细节我无法链接到多对多交叉引用表,因为它可能还不存在(产品和部件之间定义了其他关系)。

任何人都可以提出另一种更有效的方法吗?

更新 此ProductPartLink只是一种统计/研究目的关系,并不会修改产品和零件之间的关系。我对我建模方式有疑问的原因是因为我在实际上不是层次结构的项目之间实现了层次结构(使用ProductPartLink .ParentId),并且只有两个级别。

1 个答案:

答案 0 :(得分:2)

  

它不是双向的。只有左侧可以是产品或产品/零件组合。

假设这意味着右边(“N”)边必须是产品/零件组合(它不能只是产品),看起来你需要类似的东西:

enter image description here

CHECK (NOT (ParentProductId IS NULL AND ParentPartId IS NOT NULL))

FK1和FK2是标准联结表外键。从ProductPartProduct的FK3字体。 FK4自引用ProductPart

  • 如果ParentProductIdParentPartId NULL ,则不会强制执行FK3和FK4,且产品/零件组合也没有父级。
  • 如果只有ParentProductId 非空,则FK4不会强制执行 1 ,但FK3是。产品/零件组合有一个产品作为其母公司。
  • 如果ParentProductIdParentPartId都是非NULL ,则会强制执行FK3和FK4。 FK4确保父母是产品/零件组合(而不仅仅是产品)。在这种情况下,FK3“无用”,因为我们已经知道产品必须存在,否则产品/零件组合就不会存在。

1 假设您的DBMS支持MATCH SIMPLE个外键(大部分都支持)。