gpt4 book ai didi

database-design - 彼此之间具有 N2N 关系的两个实体的组成之间的关系

转载 作者:行者123 更新时间:2023-12-04 07:20:42 26 4
gpt4 key购买 nike

我定义了两个实体:

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

最佳答案

It is not bidirectional. It is only the left side that can be either a product or a product/part combination.

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

enter image description here

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

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

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

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

关于database-design - 彼此之间具有 N2N 关系的两个实体的组成之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16309071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com