分享技巧之前,先普及两个概念:
1)什么是维度?
维度是维度建模的基础和灵魂。在维度建模中,讲度量称为“事实”,将环境描述为“维度”,维度是用于分析事实所需要的多样环境。例如,在分析新增过程中,可以通过平台、手机厂商、版本号等维度描述用户的属性。
维度所包含的标识维度的列成为维度属性。维度属性是查询约束条件、分组和报表标签生成的基本来源,是数据易用性的关键。例如,在sql查询中,获取连信有头像和风控合法用户,是通过约束用户头像状态属性和风控级别属性来实现的;统计连信不同手机厂商的每日新增用户数,是通过用户手机厂商维度属性进行分组汇总;所以维度的作用一般是查询约束,分类汇总以及排序等。
2)缓慢变化维度
缓慢变化维度,英文叫Slowly Changing Dimensions,下文简称SCD。
数据仓库的重要特点之一是反映数据历史变化,所以如何处理维度的变化是维度设计的重要工作之一。缓慢变化维的提出是因为在现实世界中,维度的属性并不是静态的,它会随着时间的流逝发生缓慢的变化。与数据增长较为快速的事实表相比,维度变化相对缓慢。
正文开始,分享一下我对历史拉链表的理解。
历史拉链表是数据仓库中常用的一种表结构,用于存储动态的维度属性,处理方式是通过新增两个时间戳字段(start_dt和end_dt),将所有以天为粒度的变更数据都记录下来。通常分区字段也是时间戳字段。
例如,用一张表记录用户使用连信时候的手机厂商。2018年1月1日,用户01通过华为手机使用连信,用户B通过oppo手机使用连信,数据存入相应分区。2018年1月3日,用户01通过小米手机使用连信,用户02通过oppo手机使用连信,数据存储如下:
user_id | manufacturer | pt |
---|---|---|
01 | HUAWEI | 20180101 |
02 | OPPO | 20180101 |
01 | XIAOMI | 20180103 |
02 | OPPO | 20180103 |
如果使用传统的历史拉链表,数据存储记录如下表,其中对于重复的记录不再重复存储。使用历史拉链表后,数据存储如下:
user_id | manufacturer | start_dt | end_dt |
---|---|---|---|
01 | HUAWEI | 20180101 | 20180103 |
02 | OPPO | 20180101 | 99991231 | </