如何基于实体属性值数据库构建数据仓库?

时间:2012-09-10 20:08:42

标签: database database-design data-warehouse

是否可以基于entity attribute value数据库创建数据仓库?

若然,怎么样?

基本上我有以下格式的数据:

id  name   value
----------------
1   name1   10
1   name2   20
1   name3   30
2   name1   40
2   name2   50
2   name3   60
...

而不是以下内容:

id name1 name2 name3
--------------------
1   10    20    30
2   40    50    60

我遇到的问题是我可以在事实表中添加一些特定的名称/措施。

name1name2name3 事先不知道(甚至不存在多少个。)

关于如何解决这个问题的任何想法?我在互联网上搜索,但找不到任何相关信息。非常感谢任何帮助...

注意:我没有构建数据仓库的经验。我正在读: 数据仓库ETL工具包:提取,清理,合规和交付数据的实用技术(作者Ralph Kimball)


所以要回答Ben (from comments):“您的桌子实际上是规范化的...为什么要对其进行去标准化?

答案很长
我们的客户使用的工具可以让他拖放尺寸和尺寸。从工作空间中的OLAP多维数据集测量,然后向他显示所选数据。

如果我使用the model Paul Grimshaw suggested,客户需要在工作区中拖动名称,然后为名称添加一个过滤器,例如name1(如果他愿意的话)。

另一方面,如果客户有一个他可以在工作区中拖动的名单,他只需要一个动作(易于使用)来访问与name1相关联的数据(仅作为示例)。还有一个原因:可发现性。客户可以查看可用名称列表,只需从中选择,而不是为名称添加过滤器(他需要知道确切的名称)。

简短回答:客户易用性(包括名称的可发现性)。

2 个答案:

答案 0 :(得分:1)

处理实体 - 属性 - 值结构在报告关系模型时很棘手,从不介意维度模型。

我们通过构建“属性”列的“动态属性”表来处理这个问题 - 在这种情况下,“名称”列“。

基本上,在批处理ETL过程中,我们删除旧表,并创建一个新表。通过从(在您的情况下)“name”列中选择不同的值,然后在数据库上作为动态SQL运行,生成新的DDL。然后,ETL动态创建UPDATE或INSERT语句,这些语句使用EAV表中的每一列加载此表,如:

IF id doesn't exist in table, then:

INSERT INTO DYNAMIC_PIVOT_TABLE (id, $name) 
   SELECT id, value as "$name" where name = "$name";

ELSE 

UPDATE DYNAMIC_PIVOT_TABLE  ... etc

对于$ name的每个值,我们执行一次插入或更新以将EAV数据的“子集”加载到适当的列中。

现在你有一个“事实”表,其中包含一个维度(ID)和其他项目的度量。

然而,如果“名称”中的某些内容不是度量,而是维度属性,则会变得更糟。然后你必须做一些疯狂的逻辑来确定什么是衡量标准,什么是属性。

此外,许多OLAP工具需要“静态”元数据 - 动态更改元数据可能会导致问题。

答案 1 :(得分:0)

如果我理解正确,您可以使用“id”作为事实表的关键字以及“名称ID”。

这会给你两个维度(id和name),一个带有两个键(id和nameid)的事实表,以及一个值字段。