ms access - RDBMS Schema设计-为了捕获新属性,我是否应该分离表



我现在有这两个表:

1)

      Models
id (PK)    desc    ...

2)

            Model_Hierarchy
parent_id (PK)    child_id (PK)    qty

表示生产装配的基本结构。例如,Model id = 001, desc = "shoeA"可以由另外2个模型组成:

1) model id = 002, desc = "upperA"2) model 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中表示它。

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

第一种方法:

In Models table:

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_id 4 .

第二种方法:

In Models table:

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

In Model_Hierarchy table:

通过添加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是相同的child_id的4,他们是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)现在我有一个新的表,捕获极其相似的结构表,我已经有(即。

有没有我没看到的更简单的方法?

如果我理解正确的话,刀的尺寸是刀的属性,而不是层次结构的属性-所以在我看来,它属于描述刀的零件表。我想37号和38号是两种不同的刀号。在层次表中,您需要一些逻辑来定义可替换的部件,以显示在某些特定的组装中,可以使用任意一把刀。您可以尝试一个虚拟部件,该部件的定义显示了可以使用的2种可选尺寸。在任何情况下,都不只是涉及到数据结构—您需要一些逻辑来允许层次结构表中的OR条件,而不仅仅是通常使用的AND条件。

我不太明白你的解释。希望我已经包含了你需要的所有东西如果有点长,这是可以理解的

这个设计可行吗?

<标题>域h1> :域基本上是您将使用的数据类型-在同一域中创建的字段可用于连接表)
IdentifierOfShoeModel - integer
IdentifierOfSubModel - integer
IdentifierOfKnife - integer
IdentifierOfShoeSize - integer
DescriptionOfShoeModel - string
DescriptionOfSubModel - string
DescriptionOfKnife - string
ShoeSize - double
ShoeArea - double
SubModelQty - integer <标题>表:模型h1> strong>ID - IdentifierOfShoeModel
Desc - DescriptionOfShoeModel
主键 ID <标题>表:刀h1> strong>ID - IdentifierOfKnife
Desc - DescriptionOfKnife
主键 ID <标题>表:子模型h1> strong>ID - IdentifierOfSubModel
ModelID - IdentifierOfShoeModel
Desc - DescriptionOfSubModel
主键 ID外键 ModelID references Model <标题>表:大小

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

<标题>表:

ShoeID - IdentifierOfShoeModel
SizeID - IdentifierOfShoeSize
主键 (ShoeID, SizeID)
外键 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

最新更新