在我的数据仓库案例中计算维度表的数量

Posted

技术标签:

【中文标题】在我的数据仓库案例中计算维度表的数量【英文标题】:Figuring out number of dimension table(s) in my case of data warehouse 【发布时间】:2015-07-21 22:13:13 【问题描述】:

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

在这种情况下,我试图找出维度的数量。

在我的交易数据库中:

我有一个存储位置代码的表。列是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 创建 1 个维度表,该表也具有包含这些列的 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 创建 1 个维度表,其中还包含 Location 与这些列: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 创建 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

或者还有其他更有意义的方法吗?如果是,请告诉

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

谢谢

【问题讨论】:

流程的业务视图是什么?要获得有意义的答案,您应该解释什么是“数据”以及什么是位置和区域。是“数据”例如销售吗?位置是属于某个位置的地理点吗?位置会重叠吗? @momobo 数据是所有员工在特定位置的工作时间。例如,位置 L1 为 1500 小时,位置 L2 为 2400 小时。位置是地理位置,位置不能重叠。一个区域有 1 个或多个位置。 1 个位置只能属于 1 个区域。 【参考方案1】:

我会在同一维度(根据业务用途命名,例如 D_Location 或 D_Geography)对 Location 和 Region 建模。

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

Region 和 Location 的所有描述性列都可以在 D_Location 中愉快地共存(当然 Region 不会被规范化,但这是通常的做法)。

【讨论】:

对于特定地区,您将如何计算小时数? select sum(hours) from F_Hour join D_Location on F_Hour.keyLocation = D_Location.keyLocation where D_Location.Region = "Region 01"【参考方案2】:

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

我将创建 2 个维度表 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

有意义吗?

【讨论】:

这个看起来很像事务数据库;可以考虑数据仓库解决方案吗?我不确定@momobo 您对此解决方案有何看法? 我认为它有效。只是,我只会使用一个维度,并且会使用代理键。

以上是关于在我的数据仓库案例中计算维度表的数量的主要内容,如果未能解决你的问题,请参考以下文章

计算基本事实表的行数

数据仓库维度建模法案例

聊聊数据仓库中的缓慢变化维度(SCD)

无事实事实表的数据仓库维度设计

小案例:数据仓库搭建中的流量日志维度表案例

向数据仓库添加新维度(向事实表添加新列)