2010-09-14 53 views
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个不同的属性。 或者我应该为事实表中的每个属性创建列吗? 或使所有属性的一个维度?

在此先感谢您的帮助。

回答

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

+0

好的,非常感谢。我想是的。明天将有尝试。 – fancyPants 2010-09-14 16:32:04

1

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

这是一个不错的设计为稀疏矩阵(大量的,只有少数人填写在同一时间属性)。

然而,它有几个缺点。

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

  • 涉及多个属性的同时实施限制更为复杂

如果这不是你的问题,你可以使用EAV设计。