MySQL修复了多个表中允许的组合

时间:2015-07-02 13:37:21

标签: mysql database-design combinations

我正在设计一个数据库来组织3D制作材料。

材质命名为1_Fabric_01_Textile_001_BlueJeans_Denim和2_Metal_02_BrushedMetal_002_ChromeBrushed_Chrome等

所以,我需要一个材料表,它基本上有关于材料名称(最后一个值,上面看)的信息以及类型和子变量的组合。每种类型都允许变体,如1_Fabric有01_Textile,02_Leather,2_Metal有01_Metal,02_BrushedMetal等等。

现在制作所有组合并不困难(即能够为每种材质类型选择每种可能的子变量),但我想将组合限制为仅允许的组合,因此用户无法选择无效组合(如1_Fabric_01Metal或2_Metal_01Textile) )。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

为了生成那种名称

ReturnColumnId

基于以下表格

1_Fabric_01_Textile
2_Metal_02_BrushedMetal

并保持关于哪些类型与子类型相关的规则 你需要一个关系表,如:

    Type
    ----------
    Id  Name
    --  ------
     1  1_Fabric
     2  2_Metal


    SubType
    ------------
    Id  Name
    --  ------
     1  01_Textile
     2  02_Leather
     3  01_Metal
     4  02_BrushedMetal

如果您需要更多级别的子类型,您可以添加更多表格

    Type_SubType
    -----------------
    TypeId  SubTypeId
    ------  ---------
         1          1
         1          2
         2          3
         2          4

现在的技巧部分是为第三级关系做更好的规范化。如果将标识列添加到第一个关系表,则可以实现此目的 所以你可以使用这个例子:

1_Fabric_01_Textile_001_BlueJeans_Denim
2_Metal_02_BrushedMetal_002_ChromeBrushed_Chrome

SubSubType
--------------
Id  Name
--  ----------
 1  001_BlueJeans_Denim
 2  002_ChromeBrushed_Chrome

Type_SubType_SubSubType
-------------------------
TypeId  SubTypeId  SubSubType
------  ---------  ----------
     1          1           1
     2          3           2

并将其与第二个关系表

相关联
Type_SubType
---------------------
Id  TypeId  SubTypeId
--  ------  ---------
 1      1          1
 2      1          2
 3      2          3
 4      2          4

只检索可能的匹配是微不足道的

Type_SubType_SubSubType
-------------------------
Type_SubTypeId  SubSubType
--------------  ----------
             1           1
             3           2

或只是(如果您已经选择了一个类型并将其放在变量@TypeId中)

select * from type tp
join Type_SubType tp_sb on tp_sb.TypeId = tp.Id
join SubType sb on sb.Id = yb_sb.SubTypeId

以及SubSubTypes

等等

注意:此解决方案仅涵盖固定(或最大)数量的子子。为了获得抽象的总动态水平,你需要一个递归的FK。不像火箭科学那样,但如果你仍然掌握SQL的基础知识,那就试着坚持最简单的例子。