使用触发器或FK保持元素的完整性

时间:2015-03-23 13:34:45

标签: sql-server

由于以前来自某些Stackers的帮助,我差点就有这种设计。

enter image description here

前提在现实世界中很简单。

  • Product有一个ProductType,而ProductType又有一个ProductTypeGroup;

  • 产品具有属性,而属性又具有AttributeGroup。

桥接表确保可以将AttributeGroup分配给特定的ProductGroups,并且可以将Attributes分配给特定的ProductTypes。两个桥接表之间也存在完整性。

但是,我仍然可以添加孤立属性(桥接表中不存在的属性)作为ProductAttributes。这需要固定,以便属性必须正确地与Product本身上设置的ProductType相关联,并且应该约束任何孤立或不匹配的属性。

我再次转向'触发'(我的解决方案,我无法做任何工作),但鉴于我们已经建立了很多关系,也可以使用我们的方法来实现结果得到或以修改过的形式。

由于我不是经验丰富的SQL专业人士,甚至也不是经验丰富的新手,我发现很难看到一个可行的模式,所以会欣赏一双专家的眼睛。

提前致谢。

更新:我现在知道孤立属性可以使用ProductTypes_Attributes_ProductAttributes之间的键来约束,但不解决不匹配的属性方案。

1 个答案:

答案 0 :(得分:0)

这是一个非常开放的问题,如果我整天都很喜欢从头开始重新建模(不是说我必然会想出一个不同的方法,但我喜欢这个练习)。但是我没有一整天,所以我这会给你你想要的东西。

  1. 将FK从ProductAttributes移除到属性(此FK是您当前问题的来源)
  2. 删除FK 从ProductAttributes到Product
  3. 添加ProductTypeID列 ProductAttributes
  4. 在中创建替代密钥 ProductTypes_Attributes on(ProductTypeID,AttributeID)
  5. 创建一个 Product on(ID,ProductTypeID)中的替代键(或者您可以将ProductTypeID添加到主键)
  6. 从中创建一个FK ProductAttributes to Product on(ProductID,ProductTypeID)
  7. 创建一个 从ProductAttributes到ProductTypes_Attributeson的FK (ProductTypeID,AttributeID)
  8. 我没有对此进行编码以进行测试,但它似乎正好在我脑海中。它是否对您有所帮助可能取决于您的ORM是否喜欢它。