3

是否可以基于实体属性值数据库创建数据仓库?

如果是这样,怎么做?

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

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

我遇到的问题是我无法在事实表中放入特定的名称/度量。

name1name2并且事先不知道name3(甚至不知道其中有多少)。

关于如何解决这个问题的任何想法?我在互联网上搜索,但找不到任何相关信息。任何帮助是极大的赞赏...

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


所以回答本(来自评论):“你的表实际上是规范化的......你为什么要反规范化它?

长答案
我们的客户使用一种工具,该工具允许他从工作区中的 OLAP 多维数据集中拖放维度和度量,然后向他显示所选数据。

如果我使用Paul Grimshaw 建议的模型,客户需要在工作区中拖动名称,然后添加一个过滤器以使名称等于例如name1(如果他愿意)。

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

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

4

2 回答 2

1

在报告关系模型时,处理实体-属性-值结构很棘手,更不用说维度模型了。

我们通过构建“属性”列的“动态属性”表来处理这个问题——在本例中,是“名称”列”。

本质上,在批处理 ETL 过程中,我们删除旧表并创建一个新表。新的 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

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

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

然而,如果“名称”中的某些东西不是度量,而是维度属性,情况就会变得更糟。然后你必须做一些疯狂的逻辑来确定什么是度量,什么是属性。

此外,许多 OLAP 工具需要“静态”元数据——动态变化的元数据可能会给它们带来问题。

于 2012-09-11T15:53:53.220 回答
0

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

这将为您提供两个维度(id 和 name),一个带有两个键(id 和 nameid)的事实表和一个值字段。

于 2012-09-10T20:17:28.450 回答