数据仓库维度建模之维表设计


1、代理键
维度表中必须有一个能够唯一标识一行记录的列,通过该列维护维度表与事实表之间的关系,一般在维度表中符合条件的业务主键可以当作维度主键。
然而当整合多个数据源的维度时,不同数据源的业务主键重复问题如何解决?涉及维度拉链表时,同一主体存在多条记录,业务键重复怎么解决?

此时就需要引入代理键,代理键是由数据仓库处理过程中产生的、与业务本身无关的、唯一标识维度表中一条记录并充当维度表主键的列,也是描述维度表与事实表关系的纽带,所以在设计有代理键的维度表中,事实表中的关联键是代理键而不是原有的业务主键,即业务关系是靠代理键维护,这样有效避免源系统变化对数仓数据产生影响。

在实际业务中,代理键通常是数值、自增值类型,在传统数据库中有自增id,那在hive中怎么生成自增的代理键呢?
在这里插入图片描述
如上图所示,db1和db2库各有一张stu学生信息表,将两张表数据进行整合时,出现了id冲突的问题,此时可通过代理键来解决,可通过以下方式合并两张表数据并生成代理键:

insert overwrite table db1.dim_stu partition(dt='2020-02-17')
select
	tb.id
	,tb.name
	,tb.sex
	,tb.grade
	,tb.school
	,row_number() over(order by id)+ta.max_id as gid
from 
(select
	id
	,name
	,sex
	,grade
	,school
from db1.stu 
union all
select
	id
	,name
	,sex
	,grade
	,school
from db2.stu
) tb
cross join
(select 
	nvl(max(gid),0) as max_id 
from db1.dim_stu where dt='2020-02-16'
)ta
union all
select 
	id
	,name
	,sex
	,grade
	,school
	,gid
from db1.dim_stu where dt='2020-02-16';

2、缓慢渐变维
维度数据会随着时间发生变化,变化速度比较缓慢,这种维度数据通常称作缓慢变化维,由于数据仓库需要追溯历史变化,尤其是一些重要的数据,所以历史状态也需要采取一定的措施进行保存,常用方法有以下三种:
(1)每天保存当前数据的全量快照数据,该方案适合数据量较小的维度,使用简单的方式保存历史状态
(2)在维表中添加关键属性值的历史字段,仅保留上一个的状态值
(3)拉链表
当维度数据发生变化时,将旧数据置为失效,将更改后的数据当作新的记录插入到维表中并开始生效,这样能够记录数据在某种粒度上的变化历史。但因为是对维度表做拉链,所以同一个维度实体必然存在多条记录,此时维度表的原子性主键就不存在了,维度设计中不建议使用拉链表,维护成本较高,拉链表如下所示:
在这里插入图片描述
这种情况下,拉链表怎么和事实表关联呢?
这就需要在事实表中装载代理键,而事实表来源于业务事务表,代理键和业务本身没有关系,那怎么在事实表中装载代理键?
事务表中历史的用户维度ID不会发生变化,所以只需对事实表中每日新增数据装载代理键即可。
在这里插入图片描述
根据上图关系,向销售记录事实表中装载代理键,代码如下:

insert overwrite table fact_record partition(dt='2020-02-17')
select
	ta.order_id
	,ta.emp_id
	,tb.emp_uid
	,ta.pro_type
	,ta.trans_amount
	,ta.create_date
from
(select 
    order_id
    ,emp_id
    ,pro_type
    ,trans_amount
    ,create_date 
from sale_record
) ta
join dim_emp as tb on ta.emp_id = tb.emp_id
where create_date >= start_date and create_date <= end_date;

代理键是维度建模中很有效的一种方式,它能有效隔离源端变化带来的数仓结构不稳定问题,同时也能够提高数据仓库检索性能。
但是代理键维护代价非常高,尤其是数据装载过程中,对事实表带来了较大的影响,比如代理键的生成、事实表中关联键的装载、不支持非等值关联等问题,这将导致ETL过程更加复杂,所以在大数据体系下,谨慎使用代理键,同时对缓慢渐变维场景,可以考虑使用空间换时间的方法,每天保留维表全量快照,但这样会带来存储成本的上升,可以根据实际情况衡量。

3、维度拆分
以员工维度为例,公司中技术部会重点关注员工的技术特长,财务部会重点关注员工的入职时间和薪资情况,如果多个部门共用同一张给员工信息维表,则灵活性较差,此时可将员工维表进行拆分,如下图所示,可将员工维表拆分为技术方向的维表和财务方向维表

在这里插入图片描述
另外在星座模型中,一张维表经常会被多个事实表使用,也可以对维表进行适当拆分,简化模型。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值