我定义了两个实体:
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),并且只有两个级别。
答案 0 :(得分:2)
它不是双向的。只有左侧可以是产品或产品/零件组合。
假设这意味着右边(“N”)边必须是产品/零件组合(它不能只是产品),看起来你需要类似的东西:
CHECK (NOT (ParentProductId IS NULL AND ParentPartId IS NOT NULL))
FK1和FK2是标准联结表外键。从ProductPart
到Product
的FK3字体。 FK4自引用ProductPart
。
ParentProductId
和ParentPartId
都 NULL ,则不会强制执行FK3和FK4,且产品/零件组合也没有父级。ParentProductId
非空,则FK4不会强制执行 1 ,但FK3是。产品/零件组合有一个产品作为其母公司。ParentProductId
和ParentPartId
都是非NULL ,则会强制执行FK3和FK4。 FK4确保父母是产品/零件组合(而不仅仅是产品)。在这种情况下,FK3“无用”,因为我们已经知道产品必须存在,否则产品/零件组合就不会存在。1 假设您的DBMS支持MATCH SIMPLE个外键(大部分都支持)。