在我的数据仓库中确定维数表的数量

时间:2015-07-21 22:13:14

标签: database data-warehouse

我是数据仓库的新手,所以请放轻松。

我想弄清楚这种情况下的尺寸数量。

在我的交易数据库中:

  • 我有一个存储位置代码的表。列是location_code int not null primary key, short_description varchar(10) not null, long_description varchar(100) not null

  • 我有一个存储区域代码的表。列是region_code int not null primary key, short_description varchar(10) not null, long_description varchar(100) not null

  • 我有一张关联地点和地区的表格。列是assoc_id int not null primary key, location_code int not null, region_code int not null。 1位置仅属于1个地区。

在我的数据仓库数据库中,用户可能希望按位置或按地区查找数据。

现在我想在这种情况下创建维度表。

想知道我应该以这种方式创建2个维度表(1个用于位置,1个用于区域)吗?

  • 为Location创建一个维度表,其中包含具有以下列的Region:location_code int not null primary key, location_short_description varchar(10) not null, location_long_description varchar(100) not null, region_code int not null, region_short_description varchar(10) not null, region_long_description varchar(100) not null

  • 为Region创建一个维度表,其中包含具有以下列的位置:region_code int not null primary key, region_short_description varchar(10) not null, region_long_description varchar(100) not null, location_code int not null, location_short_description varchar(10) not null, location_long_description varchar(100) not null

或者我应该创建4个维度表(1个用于位置,1个用于区域,1个用于位置区域关联,1个用于区域位置关联)这样吗?

  • 使用以下列为“位置”创建一个维度表:location_code int not null primary key, short_description varchar(10) not null, long_description varchar(100) not null

  • 为具有以下列的Region创建1维表:region_code int not null primary key, short_description varchar(10) not null, long_description varchar(100) not null

  • 为这些列创建位置区域关联的1维表:location_code int not null, region_code int not null

  • 使用以下列为区域位置关联创建1维表:region_code int not null, location_code int not null

还是有另一种方式更有意义吗?如果是,请告诉

在数据仓库世界中,这种称为什么类型的关系以及处理它的标准方法是什么?

由于

2 个答案:

答案 0 :(得分:0)

我会在同一维度(根据业务用途命名,例如D_Location或D_Geography)对位置和区域进行建模。

小时编号将在事实表中,事实表F_Hour和D_Location将与代理键(Oracle中的序列或Sql server中的标识)连接。

区域和位置的所有描述性列都可以很乐意在D_Location中生存(当然Region不会被标准化,但这是通常的方式)。

答案 1 :(得分:0)

我认为您不需要在维度表中跟踪位置和区域的关联。该关联可以在事实表中。

我会创建二维表 D_Location & D_Region 和1个事实表 F_Hour

D_Location:

location_code int not null primary key, short_description varchar(10) not null, long_description varchar(100) not null

<强> D_Region:

region_code int not null primary key, short_description varchar(10) not null, long_description varchar(100) not null

<强> F_Hour:

hour_id int not null primary key, location_code int not null, region_code int not null, hours decimal(10,2) not null

F_Hour 将1 FK改为 D_Location ,将1 FK改为 D_Region

获取特定location_code(@location_code)的小时数:

select h.location_code, l.short_description, l.long_description, sum(h.hours) 
from F_Hour h inner join D_Location l on h.location_code = l.location_code 
where h.location_code = @location_code 
group by h.location_code, l.short_description, l.long_description 
order by h.location_code

获取特定region_code(@region_code)的小时数:

select h.region_code, r.short_description, r.long_description, sum(h.hours) 
from F_Hour h inner join D_Region r on h.region_code = r.region_code 
where h.region_code = @region_code 
group by h.region_code, r.short_description, r.long_description 
order by h.region_code

有意义吗?