我定义了两个实体:
Product:
ProductId (PK)
Name (not null)
Parts:
PartId (PK)
Name (not null)
它们之间定义了多对多关系。
根据我的要求,我需要对复合产品/零件与其他复合产品/零件之间的另一个一对多关系进行建模。在某些情况下,我还需要能够将没有零件的产品链接到产品/零件项目。
我是这样建模的:
ProductPartLink:
ProductPartLinkId (PK)
ProductId (not null)
PartId (null)
ParentId (null)
由于某种原因,这似乎不是对该设计进行建模的最佳方式。
如果不涉及太多细节,我无法链接到多对多交叉引用表,因为它可能尚不存在(产品和零件之间定义了其他关系)。
谁能建议另一种更有效的方法?
UPDATE:此 ProductPartLink 只是统计/研究目的关系,不会以任何方式修改产品和零件之间的关系。我对建模方式存疑的原因是因为我在实际上不是层次结构且只有两个级别的项目之间实现了层次结构(使用 ProductPartLink .ParentId)。
它不是双向的。只有左侧可以是产品或产品/零件组合。
假设这意味着右侧(“N”)must是产品/零件组合(不能只是产品),看起来您需要与此类似的东西:
CHECK (NOT (ParentProductId IS NULL AND ParentPartId IS NOT NULL))
FK1 和 FK2 是标准连接表外键。 FK3 蓬从ProductPart
to Product
。 FK4 自我参考ProductPart
.
- If both
ParentProductId
and ParentPartId
are NULL,FK3 和 FK4 均不强制执行,并且产品/零件组合没有父级。
- If just
ParentProductId
is non-NULL, FK4 is not enforced1 but FK3 is. The product/part combination has a product as its parent.
- If both
ParentProductId
and ParentPartId
are non-NULL,FK3 和 FK4 均被强制执行。 FK4 确保母体是产品/零件组合(而不仅仅是产品)。在这种情况下,FK3 是“无用的”,因为我们已经知道该产品必须存在,否则产品/零件组合就不会存在。
1 Assuming your DBMS supports MATCH SIMPLE http://wiki.burnsoft.net/KB58.ashx foreign keys (most do).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)