【问题标题】:MySQL fixed allowed combinations from multiple tablesMySQL 修复了来自多个表的允许组合
【发布时间】:2015-07-02 13:37:20
【问题描述】:

我正在设计一个数据库来组织 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 )。

有什么想法吗?

【问题讨论】:

  • 看起来像一个简单的问题 os 创建关系表示例:[Type]、[SubType]、[Type_SubType]。您甚至可以创建一个 [SubType_Subtype] 关系表来获得更多级别的变化
  • 是的,但是我该怎么做呢?材料表基本上需要一个外键来显示正确的 type_ID 和 subType_ID 组合,
  • 您将 PK 给 [Type] 另一个给 [SubType] 并且关系表只是将这些组合存储为 FK [Type_SubType] (FK_Type, FK_SubType)。在您选择加入这 3 个表时,不,Type 或 SubType 也不会直接为彼此获取 FK
  • 我仍然需要来自类型和子类型表的信息。我将做一个简单的 GUI 插件,允许用户保存材料。概念是先使用下拉框选择类型,然后是可用(正确)子类型,最后输入材料名称。然后将信息存储在数据库中的表格材料中,然后可以进一步使用。

标签: mysql database-design combinations


【解决方案1】:

为了生成那种名字

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

只检索可能的匹配项很简单

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

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

Select * from SubType sb
join Type_SubType tp_sb on tp_sb.SubTypeId = sb.Id
where tp_sb.TypeId = @TypeId

SubSubTypes 以此类推

注意:此解决方案仅涵盖固定(或最大)数量的子子。要获得总的动态抽象级别,您需要递归 FK。不像火箭科学,但如果您仍然掌握 SQL 的基础知识,请尝试使用最简单的示例。

【讨论】:

  • 谢谢吉恩。我超前于自己,试图在没有掌握基本概念的情况下做事。给我回书本,会退还的。再次感谢您。
猜你喜欢
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2021-05-18
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多