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
均为NULL,则FK3和FK4均不强制执行,且产品/零件组合没有父项ParentPartId
- 如果just
为非NULL,则FK4不强制1,但FK3强制。产品/零件组合将产品作为其父产品ParentProductId
- 如果
和ParentProductId
都是非空的,则FK3和FK4都被强制执行。FK4确保父项是产品/零件组合(而不仅仅是产品)。在这种情况下,FK3是“无用的”,因为我们已经知道产品必须存在,否则产品/零件组合就不会存在ParentPartId
1假设您的DBMS支持外键(大多数都支持)。与其提供奖励,不如添加示例并尽可能最好地解释产品和零件之间的关系(以及您正在建模的任何其他关系)。您说:“在某些情况下,我还需要能够将没有零件的产品链接到产品/零件项。”这是方向性的吗?换句话说,1:N关系的两个端点是“没有零件的产品”,还是只有一个端点(和哪个端点)?@Branko:它不是双向的。只有左侧可以是产品或产品/零件组合。@ypercube:我以产品和零件为例,但我工作的实际实体是公司特定的业务对象,需要大量的文字来解释它们之间的关系。我将OP更新为扩展产品/零件示例。我根本不确定OP想要的是什么,但由于解释太模糊,这不仅仅是一个好答案。ParentPartId自引用关系的第二个字段是什么?@BlueChameleon在FK4中,字段
{ParentProductId,ParentPartId}
引用字段{ProductId,PartId}
在同一个表中。请看图表-ParentProductId
在FK3和FK4中。