用于模仿列的行

时间:2012-05-04 07:45:22

标签: sql relational-database rdbms

我想构建一个表来模拟列级过滤器作为行级过滤器,以避免添加新列。

假设我有下表来存储汽车的详细信息

-------------------------------------
Type        Color       Year
-------------------------------------
Mini        Silver      2010
Standard    Silver      2011
Fullsize    White       2011
Luxury      Black       2010
Sports      Red     2011
Convertible Red     2009

如果我想存储这些车的Make,为此我必须添加一个额外的列和另一列,如果我有汽车以外的汽车。

所以问题是如何构建此表以避免添加新列?该结构应仅需要添加行来定义记录的属性。

[提示]结构可能有多个表,一个用于存储行/记录,另一个用于存储列/属性,然后是它们之间的某种映射或全新的结构。

修改

我的数据的某些属性是固定的,有些是动态的。固定属性可以映射到给定的样本汽车模型,因为可用性,条件和动态可以是一个人可能询问的关于汽车的任何事情。现在我不需要将所有列映射为行但很少,这些是动态的,我甚至不知道所有列。我道歉,我之前没有提到过。

2 个答案:

答案 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