我想构建一个表来模拟列级过滤器作为行级过滤器,以避免添加新列。
假设我有下表来存储汽车的详细信息
-------------------------------------
Type Color Year
-------------------------------------
Mini Silver 2010
Standard Silver 2011
Fullsize White 2011
Luxury Black 2010
Sports Red 2011
Convertible Red 2009
如果我想存储这些车的Make
,为此我必须添加一个额外的列和另一列,如果我有汽车以外的汽车。
所以问题是如何构建此表以避免添加新列?该结构应仅需要添加行来定义记录的属性。
[提示]结构可能有多个表,一个用于存储行/记录,另一个用于存储列/属性,然后是它们之间的某种映射或全新的结构。
修改
我的数据的某些属性是固定的,有些是动态的。固定属性可以映射到给定的样本汽车模型,因为可用性,条件和动态可以是一个人可能询问的关于汽车的任何事情。现在我不需要将所有列映射为行但很少,这些是动态的,我甚至不知道所有列。我道歉,我之前没有提到过。
答案 0 :(得分:2)
您可以使用entity-attribute-value设计(EAV)。
entity attribute value
1 Type Mini
1 Color Silver
1 Year 2010
1 Make Foobar
2 Type Standard
2 Color Silver
etc...
您可能还希望将属性名称存储在单独的表中。
但是,如果确实需要这个,你应该仔细考虑,因为有一些缺点。值列必须具有可以存储所有不同类型值的类型(例如字符串)。编写查询要麻烦得多,因为您需要很多连接,与传统的数据库设计相比,这些查询的运行速度会更慢。
答案 1 :(得分:0)
为您提供一个良好的开端:考虑重新设计以允许像摩托车这样的多色车辆:
<强>车辆强>
Id Year vehicle_type vehicle_make
-------------------------------------------
1 2010 1 1
2 2011 2 2
<强>颜色强>
Id Name
-----------
1 Black
2 White
3 Red
4 Blue
<强> vehicle_color 强>
vehicle_id color_id
-----------------------
1 3
2 1
2 2
<强>汽车类型强>
Id Name
-----------
1 Car
2 Motorbike
<强> vehicle_make 强>
Id Name
-----------
1 Porsche
2 BMW
<强>加成强>
由于我对汽车领域非常熟悉,我会为您的车辆颜色添加一个扩展名:制造商发明了大量的颜色名称(“Magentafuzzyorangesunset”),您需要将它们映射到“真实的“基色名称(”红色,“蓝色”,“绿色”等),以便搜索两者。
您的color
表格可能就像那样
Id Name base_color
-----------------------------
1 Midnight 1
2 Snow 2
您将添加 base_color 表
Id Name
-----------
1 Black
2 White