我正在设计一个数据库来组织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) )。
有什么想法吗?
答案 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的基础知识,那就试着坚持最简单的例子。