3

我定义了两个实体:

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)。

4

1 回答 1

2

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

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

在此处输入图像描述

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

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

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

1假设您的 DBMS 支持MATCH SIMPLE外键(大多数都支持)。

于 2013-05-03T13:56:21.747 回答