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

Database design 两个实体之间有N2N关系的组成之间的关系,database-design,relational-database,entity-relationship,Database Design,Relational Database,Entity Relationship,我定义了两个实体: Product: ProductId (PK) Name (not null) Parts: PartId (PK) Name (not null) 它们之间定义了多对多关系。 在我的需求中,我需要建模复合产品/零件项与其他复合产品/零件之间的另一个一对多关系。在某些情况下,我还需要能够将没有零件的产品链接到产品/零件项。 我以这种方式对其进行建模: ProductPartLink: Product

我定义了两个实体:

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)在实际上不是层次结构的项目之间,并且只有两个级别

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

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

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

FK1和FK2是标准连接表外键。FK3桥从
ProductPart
Product
。FK4自参考
ProductPart

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


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

与其提供奖励,不如添加示例并尽可能最好地解释产品和零件之间的关系(以及您正在建模的任何其他关系)。您说:“在某些情况下,我还需要能够将没有零件的产品链接到产品/零件项。”这是方向性的吗?换句话说,1:N关系的两个端点是“没有零件的产品”,还是只有一个端点(和哪个端点)?@Branko:它不是双向的。只有左侧可以是产品或产品/零件组合。@ypercube:我以产品和零件为例,但我工作的实际实体是公司特定的业务对象,需要大量的文字来解释它们之间的关系。我将OP更新为扩展产品/零件示例。我根本不确定OP想要的是什么,但由于解释太模糊,这不仅仅是一个好答案。ParentPartId自引用关系的第二个字段是什么?@BlueChameleon在FK4中,字段
{ParentProductId,ParentPartId}
引用字段
{ProductId,PartId}
在同一个表中。请看图表-
ParentProductId
在FK3和FK4中。