星型模式设计 - 一个列维度

时间:2010-09-14 15:06:06

标签: sql data-warehouse star-schema

我是数据仓库的新手,但我认为我的问题可以相对容易地回答。 我构建了一个星型模式,其中包含维度表'product'。该表有一列'PropertyName'和一列'PropertyValue'。 因此,维度看起来有点像这样:

surrogate_key | natural_key (productID) | PropertyName | PropertyValue | ...
    1              5                          Size           20          ...
    2              5                          Color          red
    3              6                          Size           20
    4              6                          Material       wood

等等。

在我的事实表中,我总是使用维度的代理键。 PropertyName和PropertyValue列的原因是我的自然键不再是唯一/识别,所以我在事实表中得到了太多的行。

我现在的问题是,我应该如何处理属性列?将每个属性放入单独的维度(如尺寸大小,尺寸颜色等)是否最好?我有大约30种不同的属性。 或者我应该为事实表中的每个属性创建列? 或者使用所有属性创建一个维度?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您的尺寸表'产品'应如下所示:

surrogate_key | natural_key (productID) | Color | Material | Size | ...
    1              5                      red     wood       20     ...
    2              6                      red     ...         

如果您有许多属性,请尝试将它们分组到另一个维度。例如,如果您可以在另一种颜色或材料中使用具有相同ID和相同价格的相同产品,则“颜色”和“材质”可以是另一个维度的属性。您的事实表可以使用两个键识别产品:product_id和colormaterial_id ......

阅读推荐: The Data Warehouse Toolkit, Ralph Kimball

答案 1 :(得分:1)

您的设计称为EAV entity-attribute-value )表。

对于稀疏矩阵来说这是一个很好的设计(大量属性只有少数几个同时被填充)。

然而,它有几个缺点。

  • 无法一次对两个或多个属性进行索引(并因此有效搜索)。像这样的查询:“获得所有木材制成的产品,尺寸为20”,效率会降低。

  • 一次实现涉及多个属性的约束更为复杂

如果您没有问题,可以使用EAV设计。