数据库表之间的关系太多?

问题描述 投票:0回答:1

我有一张摆满产品的桌子。每个产品都可以有 0..n 个特征。例如。 “Linux Server S”或“Windows Server M”等

每个产品还可以有一个按选项组分组的选项列表。例如。选项组“操作系统”,然后该选项组具有诸如“Windows”、“Linux”之类的选项参数。

在矩阵中,我将选项参数映射到特征。

我希望 optionparams 属于 optiongroup,而 optiongrop 属于产品;甚至特征也属于产品。具体矩阵也属于产品。

我不知道表之间的关系是否正确,或者矩阵和产品之间的关系是否不正确,因为我可以将特征加入到产品中。但在这种情况下,如果有人(应用程序应该阻止)在矩阵中进行了错误的映射,例如。他们从另一个产品中选择一个选项参数而不是特性,我找不到错误。

database-design erd
1个回答
0
投票

但在这种情况下,如果有人(应用程序应该阻止)在矩阵中进行了错误的映射,例如。从另一个产品而不是特性中选择一个选项参数,我找不到错误。

在正常情况下,您不会想要直接从 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各一个,但
    添加一个约束,即两个字段必须相等

    通常,第一个选项是首选,因为第二个选项有一些冗余;另一方面,第二个选项更加统一,在某些情况下,例如如果涉及代码生成,可能会更好。
(顺便说一句,您的图表很难阅读,特别是因为字段名称不一致/约定俗成,并且不清楚哪些字段位于哪些 FK 中。)

© www.soinside.com 2019 - 2024. All rights reserved.