星型架构设计 - 一列尺寸
问题描述:
我对数据仓库很陌生,但我认为我的问题可以相对容易地回答。 我构建了一个具有维度表'产品'的星型模式。该表有一个'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个不同的属性。 或者我应该为事实表中的每个属性创建列吗? 或使所有属性的一个维度?
在此先感谢您的帮助。
答
你的维度表“产品”应该是这样的:
surrogate_key | natural_key (productID) | Color | Material | Size | ...
1 5 red wood 20 ...
2 6 red ...
如果你有很多属性,尝试将它们分组,另一维度。例如,如果您可以在另一种颜色或材质中使用相同的ID和相同的价格拥有相同的产品,则颜色和材质可以是其他尺寸的属性。事实表可以有两个密钥识别产品:PRODUCT_ID和colormaterial_id ...
答
您的设计被称为EAV
(实体 - 属性 - 值)表。
这是一个不错的设计为稀疏矩阵(大量的,只有少数人填写在同一时间属性)。
然而,它有几个缺点。
它无法一次对两个或多个属性进行索引(并因此有效搜索)。像这样的查询:“获得所有木制品和20或20尺寸的产品”效率会更低。
涉及多个属性的同时实施限制更为复杂
等
如果这不是你的问题,你可以使用EAV
设计。
好的,非常感谢。我想是的。明天将有尝试。 – fancyPants 2010-09-14 16:32:04