2012-09-10 43 views
3

是否可以基于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工具包:实用技术提取,清理,整合和传递数据(由拉尔夫·金博尔)


所以回答Ben (from comments):“你的表实际上是标准化的。 ..为什么要取消它正常化

龙回答
我们的客户使用一个工具,允许他将它从OLAP多维数据集落尺寸&措施,在工作区,然后表演他选择的数据。

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

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

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

+0

我忘了提及名称1,名称2和名称3是事先不知道的(甚至没有多少可能存在)。 –

+1

@Ben将元数据放入列不是规范化。这只是[糟糕的设计](http://tkyte.blogspot.com/2009/01/this-should-be-fun-to-watch.html)。 –

+0

@IgorPopov每个不同的“名称”有不同的,不同的商业含义吗?因此,对于产品ID 1,其具有称为“重量”的“名称”,其具有度量50,并且具有称为“长度”的“名称”,具有度量25? –

回答

1

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

我们通过建立“属性”栏中的“动态属性”表处理这个 - 在这种情况下,“名称”列”

从本质上讲,在批量ETL过程中,我们删除旧的表,并创建一个新的DDL,新的DDL是通过从(在你的情况下)“名称”列中选择不同的值生成的,然后在数据库上作为动态SQL运行,然后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 

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

现在你已经有了一个“事实”表,其中一个维度(ID)和其余项目的度量。

但是,如果“名称”中的某些内容不是度量值,而是尺寸属性,则会变得更糟。然后你必须做一些疯狂的逻辑来确定什么是度量和属性。另外,许多OLAP工具需要“静态”元数据 - 动态变化的元数据可能会给他们带来问题。

+2

另外 - 我将从Ralph Kimball的早期着作“数据仓库工具包”开始,详细地介绍了一些很好的示例以及维度模型的工作原理。 –

+0

感谢您的参考和您的回答......不幸的是,我不得不处理“动态”元数据(一些来自帆船的关键值对,每艘船都有一组不同的传感器)。由于“动态”部分,我们无法将特定键(初始文章中的“名称”)并排比较。这些要求存在一个相当大的问题,因为对于我可以进行分析的所有船舶至少应该有一组键('name')。 –

+1

@IgorPopov所以他们要求“并排”分析,即使数据不支持:-)。您可能只想识别所有船舶的每个可能的维度,然后对于没有适当传感器的船舶,这些度量和属性在事实表中被忽略。这样,你根本不必建立一个动态的事实(我希望这个结构不会经常改变,因为船舶很大,并且增加一艘新船可能一年或两年发生一次?) –

0

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

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

+0

我不确定名称维度是否有意义...至少我没有发现它记录在任何地方...无论我看,我找到例如日期和时间尺寸或产品尺寸... –

+0

嗯,好吧,是的,我想我可以使用名称维度。 –