我有一张摆满产品的桌子。每个产品都可以有 0..n 个特征。例如。 “Linux Server S”或“Windows Server M”等
每个产品还可以有一个按选项组分组的选项列表。例如。选项组“操作系统”,然后该选项组具有诸如“Windows”、“Linux”之类的选项参数。
在矩阵中,我将选项参数映射到特征。
我希望 optionparams 属于 optiongroup,而 optiongrop 属于产品;甚至特征也属于产品。具体矩阵也属于产品。
我不知道表之间的关系是否正确,或者矩阵和产品之间的关系是否不正确,因为我可以将特征加入到产品中。但在这种情况下,如果有人(应用程序应该阻止)在矩阵中进行了错误的映射,例如。他们从另一个产品中选择一个选项参数而不是特性,我找不到错误。
但在这种情况下,如果有人(应用程序应该阻止)在矩阵中进行了错误的映射,例如。从另一个产品而不是特性中选择一个选项参数,我找不到错误。
在正常情况下,您不会想要直接从 Matrix
到
Product
的 FK,这是多余的,只会使事情处理起来更加复杂。另一方面,如您的问题所示,这对于能够应用交叉一致性约束来说是“必要的”。但是正确的方法是使用整个主键链直到
Product
,并沿着两条(所有)路径进行操作,即通过OptionParams
以及
Characteristics
,以及在所有中间表,最多
Product
。
在实践中(为了方便进行了一些重命名),结构将如下所示(有两个可能的选项
Matrix
:稍后查看详细信息):
Products {
ID PK
}
OptionGroups {
ID PK UK1
ProductID UK1 FK -> Product.ID
}
OptionParams {
ID PK UK1
ProductID UK1 FK -> OptionGroups.ProductID
OptGroupID UK1 FK -> OptionGroups.ID
}
Characteristics {
ID PK UK1
ProductID UK1 FK -> Product.ID
}
Matrix { // 1st option
ID PK UK{1,2}
ProductID UK{1,2} FK1 -> OptionParams.ProductID,
FK2 -> Characteristics.ProductID
OptGroupID UK1 FK1 -> OptionParams.OptGroupID
OptParamID UK1 FK1 -> OptionParams.ID
CharID UK2 FK2 -> Characteristics.ID
}
Matrix { // 2nd option
ID PK UK{1,2}
OptProductID UK1 FK1 -> OptionParams.ProductID
OptGroupID UK1 FK1 -> OptionParams.OptGroupID
OptParamID UK1 FK1 -> OptionParams.ID
CharProductID UK2 FK2 -> Characteristics.ProductID
CharID UK2 FK2 -> Characteristics.ID
CONTRAINT CHECK OptProductID = CharProductID
}
也就是说,我基本上看到了两种强制一致性约束的方法:
只需Matrix
中使用同一个字段来指代FK中的Product.ID
到
OptionParams
和1中的
Characteristics
;或者,在
Product.ID
Matrix
使用不同的字段,两个FK各一个,但添加一个约束,即两个字段必须相等
。通常,第一个选项是首选,因为第二个选项有一些冗余;另一方面,第二个选项更加统一,在某些情况下,例如如果涉及代码生成,可能会更好。