是否可以基于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
我遇到的问题是我可以在事实表中添加一些特定的名称/措施。
name1
,name2
和name3
事先不知道(甚至不存在多少个。)
关于如何解决这个问题的任何想法?我在互联网上搜索,但找不到任何相关信息。非常感谢任何帮助...
注意:我没有构建数据仓库的经验。我正在读: 数据仓库ETL工具包:提取,清理,合规和交付数据的实用技术(作者Ralph Kimball)
所以要回答Ben (from comments):“您的桌子实际上是规范化的...为什么要对其进行去标准化?”
答案很长:
我们的客户使用的工具可以让他拖放尺寸和尺寸。从工作空间中的OLAP多维数据集测量,然后向他显示所选数据。
如果我使用the model Paul Grimshaw suggested,客户需要在工作区中拖动名称,然后为名称添加一个过滤器,例如name1
(如果他愿意的话)。
另一方面,如果客户有一个他可以在工作区中拖动的名单,他只需要一个动作(易于使用)来访问与name1
相关联的数据(仅作为示例)。还有一个原因:可发现性。客户可以查看可用名称列表,只需从中选择,而不是为名称添加过滤器(他需要知道确切的名称)。
简短回答:客户易用性(包括名称的可发现性)。
答案 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)的事实表,以及一个值字段。