我是数据仓库的新手,所以请放轻松。
我想弄清楚这种情况下的尺寸数量。
在我的交易数据库中:
我有一个存储位置代码的表。列是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
还是有另一种方式更有意义吗?如果是,请告诉
在数据仓库世界中,这种称为什么类型的关系以及处理它的标准方法是什么?
由于
答案 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
有意义吗?