【问题标题】:RDBMS Schema design - should I separate the tables or not in order to capture new attribute?RDBMS 模式设计 - 我是否应该分开表以捕获新属性?
【发布时间】:2016-12-22 14:05:39
【问题描述】:

我现在有这两张桌子:

1)

      Models
id (PK)    desc    ...

2)

            Model_Hierarchy
parent_id (PK)    child_id (PK)    qty

这代表了生产装配的基本结构。例如 Model id = 001, desc = "shoeA" 可以包含 2 个其他模型:

1) 型号 id = 002, desc = "upperA" 2) 型号 id = 003, desc = "soleA"

关系将在层次结构表中简单表示如下:

            Model_Hierarchy
parent_id (PK)    child_id (PK)    qty
001               002              1
001               003              1

所以在我的应用程序中它看起来像:

name             qty
shoeA---
       -upperA   1
       -soleA    1

这暂时有效。但是,现在我发现对于某些特定的模型关系,我还必须捕获属性size。例如,我有一个模型cuttingKniveA,我想捕获类似:

name            size  area (cm^2)
cuttingKniveA   35    12.4
                36    12.9
                37    13.6
                38    13.6 *note
                .     .
                .     .

但是 *注意:我必须能够捕捉到这样一个事实,即对于某些尺寸,可以使用相同的刀具。例如,对于 38 号,使用与 37 号相同的刀!这是我苦苦挣扎的部分,我不知道如何在我的 RDBMS 中表示它。

有几种方法可以做到这一点,我不确定选择哪一种(对于未来的开发来说最有效/最清晰)。

第一种方法:

在Models 表中:

id(PK)    desc
1         cuttingKniveA
2         35
3         36
4         37

在Model_Hierarchy 表中:

parent_id (PK)    child_id (PK)    qty
1                 2                12.4
1                 3                12.9
1                 4                13.6

我怎么会发现size 38 使用带有size 37 的刀? IE。 model_id4.

第二种方法:

在Models 表中:

id(PK)    desc
1         cuttingKniveA
2         ""
3         ""
4         ""

在Model_Hierarchy 表中:

通过添加size 属性进行扩展。

parent_id (PK)    child_id (PK)    size    qty
1                 2                35      12.4
1                 3                36      12.9
1                 4                37      13.6

在这里可能更容易捕捉到尺寸 38 使用相同的刀具,但我不喜欢这样的解决方案。即:

parent_id (PK)    child_id (PK)    size    qty
1                 4                38      13.6

这里有两个大问题: 1) 保持qty 一致(即,即使大小 37 和 38 与 4 的child_id 相同,它们是 2 条记录,因此更改为 1 也必须更改另一个的数量。 2)到目前为止,它验证了主键条件,即。独特的parent_id、child_id 配对。这使事情变得复杂,因为捕获此关系是Model_Hierarchy 中显示的所有关系的一小部分,因此我可以为这个小子集添加size 属性,但我宁愿不对表进行重大更改,例如更改 PK .

第三种方法:

创建一个新表来捕获size 关系,即。

parent_id (PK)    child_id (PK)    size (PK)    qty
1                 2                35           12.4
1                 3                36           12.9
1                 4                37           13.6
1                 4                38           13.6

我看到了两个问题: 1) 与 第二种方法 中保持qty 一致的问题相同,即。如果 13.6 发生变化,它应该在两个记录中都发生变化。 2) 现在我有一个新表,它捕获的结构与我已有的表极为相似(即父 - 子 - 数量)。

还有其他一些我没有看到的更简单的方法吗?

【问题讨论】:

    标签: ms-access database-design database-schema rdbms


    【解决方案1】:

    如果我理解正确,刀大小是刀的属性,而不是层次结构的属性 - 所以 IMO 它属于描述刀的零件表。我认为 37 号和 38 号是两种不同的刀代码。在层次结构表中,您需要一些定义替代零件的逻辑,以表明在某些特定组件中,可以使用任一刀。您可以尝试一个虚拟零件,该零件的定义显示了可以使用的 2 个可选尺寸。无论如何,所涉及的不仅仅是数据结构 - 您需要一些逻辑来允许层次结构表中的 OR 条件,而不仅仅是通常使用的 AND 条件。

    【讨论】:

      【解决方案2】:

      无法理解您的解释。希望我已经包含了您需要的所有内容,如果有点长也是可以理解的

      这种设计是否可行:

      域

      (注意:域基本上是您将使用的数据类型 - 在同一域上创建的字段可用于连接表)
      IdentifierOfShoeModel -整数
      IdentifierOfSubModel - 整数
      IdentifierOfKnife - 整数
      IdentifierOfShoeSize - 整数
      DescriptionOfShoeModel - string
      DescriptionOfSubModel - string
      DescriptionOfKnife - string
      ShoeSize - double
      ShoeArea - double
      SubModelQty - 整数

      表:模型

      ID - IdentifierOfShoeModel
      Desc - DescriptionOfShoeModel
      主键 ID

      桌子:刀

      ID - IdentifierOfKnife
      Desc - DescriptionOfKnife
      主键 ID

      表:子模型

      ID - IdentifierOfSubModel
      ModelID - IdentifierOfShoeModel
      Desc - DescriptionOfSubModel
      主键 身份证 外键 ModelID references Model

      表格:大小

      ID - IdentifierOfShoeSize
      KnifeID - IdentifierOfKnife
      Size - ShoeSize
      Area - ShoeArea
      主键 ID 外键 KnifeID 引用 Knife

      表:切割

      ShoeID - IdentifierOfShoeModel
      SizeID - IdentifierOfShoeSize
      主键(ShoeID、SizeID)
      外国Key ShoeID references Model
      外键 SizeID references Size

      表格中有这些条目:

      型号

      ID  Desc  
      1   ShoeA
      

      刀

      ID  Desc
      1   cuttingKnifeA
      

      子模型

      ID  ModelID Desc
      1   1       upperA
      2   1       soleA
      

      尺寸

      ID  KnifeID Size    Area
      1   1       35      12.4
      2   1       36      12.9
      3   1       37      13.6
      4   1       38      13.6
      

      切割

      ShoeID  SizeID
      1       1   
      

      使用此查询获取底部表格中的结果:

      SELECT      Model.Desc, 
                  SubModel.Desc, 
                  Knife.Desc, 
                  Size.Size, 
                  Size.Area
      FROM        (((
                      Cutting INNER JOIN Model ON Cutting.ShoeID = Model.ID) 
                              INNER JOIN [Size] ON Cutting.SizeID = Size.ID) 
                              INNER JOIN Knife ON Size.KnifeID = Knife.ID) 
                              INNER JOIN SubModel ON Model.ID = SubModel.ModelID
      ORDER BY    Model.Desc, 
                  Knife.Desc  
      
      
      Model.Desc  SubModel.Desc   Knife.Desc      Size    Area
      ShoeA       soleA           cuttingKnifeA   38      13.6
      ShoeA       upperA          cuttingKnifeA   38      13.6
      ShoeA       soleA           cuttingKnifeA   35      12.4
      ShoeA       upperA          cuttingKnifeA   35      12.4
      

      【讨论】:

      • 问题在于层次结构的深度未知,基本上“鞋”也可能不是最终产品。例如,一只鞋可以装在一个由多只鞋组成的包装中……每只鞋都由子零件组成,每个子零件可以由更多的子零件和/或材料等组成。等等。我不想解释整个域,否则问题将太长。具体问题是捕捉到 1 把切割刀可以适应多种尺寸的事实。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多