0

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

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

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

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

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

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

编辑

我的数据的一些属性是固定的,有些是动态的。固定属性可以映射到给定的示例汽车模型,因为可用性、条件和动态可以是人们可能询问汽车的任何内容。现在我不需要将所有列都映射为行,但很少,而且这些是动态的,我什至不知道所有列。我很抱歉我之前没有提到这一点。

4

2 回答 2

2

您可以使用实体属性值设计 (EAV)。

entity  attribute   value
1       Type        Mini
1       Color       Silver
1       Year        2010
1       Make        Foobar
2       Type        Standard
2       Color       Silver    
etc...

您可能还希望将属性名称存储在单独的表中。

但是,如果你真的需要这个,你应该仔细考虑,因为有一些缺点。值列必须具有可以存储所有不同类型值的类型(例如字符串)。编写查询要麻烦得多,因为您需要许多连接,并且与传统的数据库设计相比,这些查询的运行速度会更慢。

于 2012-05-04T07:51:55.957 回答
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_id    color_id
-----------------------
1             3
2             1
2             2

车辆类型

Id    Name
-----------
1     Car
2     Motorbike

车辆制造

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
于 2012-05-04T08:14:46.787 回答