1

我是数据仓库的新手,但我认为我的问题相对容易回答。我建立了一个星型模式,带有一个维度表“产品”。此表具有“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 种不同的属性。或者我应该为事实表中的每个属性创建列吗?还是制作具有所有属性的一维?

提前感谢您的帮助。

4

2 回答 2

3

您的维度表“产品”应如下所示:

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

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

阅读推荐: 数据仓库工具包,Ralph Kimball

于 2010-09-14T15:29:01.920 回答
1

您的设计称为EAV实体属性值)表。

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

但是,它有几个缺点。

  • 它不能同时在两个或多个属性上被索引(因此有效地搜索)。像这样的查询:“获取所有由木头制成且大小为 20 的产品”效率会降低。

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

  • 等等

如果这对您来说不是问题,您可以使用EAV设计。

于 2010-09-14T15:36:19.327 回答