我有一张摆满产品的桌子。每个产品都可以有 0..n 个特征。例如。 “Linux Server S”或“Windows Server M”等
每个产品还可以有一个按选项组分组的选项列表。例如。选项组“操作系统”,然后该选项组具有诸如“Windows”、“Linux”之类的选项参数。
在矩阵中,我将选项参数映射到特征。
我希望 optionparams 属于 optiongroup,而 optiongrop 属于产品;甚至特征也属于产品。具体矩阵也属于产品。
我不知道表之间的关系是否正确,或者矩阵和产品之间的关系是否不正确,因为我可以将特征加入到产品中。但在这种情况下,如果有人(应用程序应该阻止)在矩阵中进行了错误的映射,例如。他们从另一个产品中选择一个选项参数而不是特性,我找不到错误。
但在这种情况下,如果有人(应用程序应该阻止)在矩阵中进行了错误的映射,例如。从另一个产品而不是特性中选择一个选项参数,我找不到错误。
在正常情况下,您不会想要直接从 Matrix
到
Product
的 FK,这是多余的,只会使事情处理起来更加复杂。另一方面,如您的问题所示,这对于能够应用交叉一致性约束来说是“必要的”。但是正确的方法是使用整个主键链直到
Product
,事实上你应该在两侧都这样做,Product
以及
Characteristics
:也就是说,你还应该有(参考)
OptionGroup.ID
中的
Matrix
并在FK到
OptionParams
中使用它;并且您应该在 FK 中添加
Product.ID
到
Characteristics
。
这个问题解决了,我基本上看到了两种强制一致性约束的方法:只需
Matrix
中使用同一个字段来指代FK中的Product.ID
到
OptionParams
和1中的
Characteristics
;或者,在
Product.ID
Matrix
使用不同的字段,两个FK各一个,但添加一个约束,即两个字段必须相等
。通常第一个选项是首选,因为第二个选项有一些冗余,另一方面第二个选项更统一,在某些情况下,例如如果涉及代码生成,可能会更好。