【问题标题】:Rows to mimic Columns行来模仿列
【发布时间】:2012-05-04 18:33:50
【问题描述】:

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

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

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

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

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

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

编辑

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

【问题讨论】:

  • 提示?你在给我们做作业吗?
  • 不,一点也不 :) 只是想提一下它可以由多个表组成

标签: sql relational-database rdbms


【解决方案1】:

您可以使用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...

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

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

【讨论】:

  • 最好在上面贴上强烈的警告标签。我刚读到Inner Platform Effect
  • 如果我想通过属性查找实体,你能给我举个例子吗?
  • EAV 设计可能适合存储和列出实体,但任何基于其属性(如搜索)的东西都需要复杂的查询,而且这些查询也更难构建,正如您已经提到的那样
【解决方案2】:

让您抢先一步:考虑重新设计以允许摩托车等多色车辆:

车辆

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

vehicle_type

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

【讨论】:

  • 您将如何存储 Make 和 CC?我不认为它是用行替换列
  • 我省略了 Make 因为它可以留在vehicle。如果 CC 您指的是 Color - 我将其移至 vehicle_color 关系。这意味着您必须通过 JOIN vehiclevehicle_color 检索有关您的汽车/摩托车的所有信息。
  • 我添加了 Make 但您现在应该明白了 - 当您需要为您的车辆添加颜色时,您不必添加像 color1 这样的列, color2 等添加到您的 vehicle 表中,但只需将行添加到 vehicle_color 关系。
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 2011-03-21
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
相关资源
最近更新 更多