SQL - 维护两个桥接表之间的完整性

时间:2015-03-23 11:15:37

标签: sql-server

enter image description here

我有两个父子组:

  • ProductType / ProductTypeGroup;
  • 属性/ AttributeGroups;

AttributeGroups也与ProductTypeGroups相关,而Attributes与ProductTypes相关。我通过2个桥接表来做到这一点。

但是,剩下的维度是2个桥接表也必须保持完整性 - Attribute和ProdcutType必须保持对其组层次结构的真实性。

我的第一个,就是在ProductTypes_Attributes上创建一个触发器,将6个表连接在一起并检查是否存在但是可能有更容易或更健壮的解决方案我不知道作为SQL新手。

我很欣赏有关更好的建议,或者只是管理这种关系的替代方法。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您每张桌子都使用纯技术ID。在确保数据一致性方面,这有其局限性。请考虑使用复合键。例如:ProductTypeGroup具有ProductTypeGroupNo。因此,ProductTypeGroupNo和ProductTypeNo引用ProductType。

主键为粗体:

  • ProductTypeGroup( ProductTypeGroupNo ,名称)
  • ProductType( ProductTypeGroupNo,ProductTypeNo ,名称)

  • AttributeGroup( AttributeGroupNo ,名称)

  • 属性( AttributeGroupNo,AttributeNo ,名称)

  • ProductTypeGroups_AttributeGroups( ProductTypeGroupNo,AttributeGroupNo

  • ProductType_Attribute( ProductTypeGroupNo,ProductTypeNo,AttributeGroupNo,AttributeNo

您看,现在您可以轻松设置外键。表ProductType_Attribute包含将其链接到ProductType,Attribute ProductTypeGroups_AttributeGroups的所有关键信息。

答案 1 :(得分:0)

您可以将ProductTypeGroupIDAttributeGroupID添加到ProductTypes_Attributes表格中。

然后,您可以在ProductTypeIDProductGroupID)和AttributesID,{{}上声明超级密钥 1 1}}),并通过AttributeGroupID表中的新外键引用这些键。这可确保始终正确填充这两个新列。

然后,您可以添加从ProductTypes_AttributesProductType_Attributes的其他外键,以确保存在特定组合。

因此,两个新列和3个新的外键约束然后您可以确定没有无效组合。您可能需要做的是将ProductTypeGroups_AttributeGroups替换为继续仅显示原始列的视图,然后使用一组触发器来维护新列“幕后”,以便现有代码不需要要了解这种执法是如何发生的。


1 即。你在两列中声明了一个唯一的键约束,即使仅ProductType_Attributes足以唯一地标识每一行,这是一个关键事项的通常标准。这允许两个列由单个外键约束引用。