1. Background:
生产中,数仓分层没有一个统一的规范,各家公司都有一套自己的逻辑。命名更是五花八门。但只要有一套适合业务的分层、建模逻辑并贯彻执行,对开发效率的提升将会是很大的帮助。这篇文章将介绍一种四层分层的方案。
2. Basic
2.1 维度表 vs 事实表
- 维度表一般是对事实的描述信息,每一张维度表对应现实世界中的一个对象或者概念,如用户、商品、日期、地区这些都可以作为维度表。一张维度表一般由一个主键和若干属性字段构成。
- 事实表一般是对某种动作的描述,每行数据代表一个业务事件。“事实”这个术语表示对业务事件的度量值。例如事实表可以是下单、支付。其中事实(度量值)可以是下单的次数、下单的金额;支付的次数、支付的金额。一张事实表一般由若干维度表的外键和若干度量值构成。
2.2 星型模型 vs 雪花模型
- 星型模型:事实表中外键关联的维度表只有一个层级。例如事实表中地区维度的外键
location_key
关联的维度表只有一层,可以通过location_key
获取都所有关于地区的属性。 - 雪花模型:事实表中外键关联的维度表可以有多个层级。例如事实表中地区维度的外键
location_key
关联的维度表有多层,通过location_key
只能获取到部分关于地区的属性,获取更多的属性需要进行 join 操作关联下一层级的维度表。
2.3 关系建模 vs 维度建模
- 关系建模一般用于关系型数据库,遵循范式理论建模。
- 维度建模一般在数仓的原始数据层的上一层,遵循星型模型建模。
3. Deep
掌握了上一节介绍的基本知识后,这里介绍一种四层数仓的搭建方式。分别是 ODS 层,DWD 层,宽表层(DWS,DWT),ADS 层。
3.1 ODS 层
该层保持数据原貌,不对数据进行任何修改。如用户行为埋点数据可以直接使用一行 line string
进行存储。数据库产生的业务数据则维持原表结构进行存储。
3.2 DWD 层
所谓维度建模就是在这一层完成的。整体分为四个步骤。
DWD 层的特点是多维度,少度量(单个事实表的度量值)。
- 选择业务过程
- 即选择需要的所有事实表
- 声明粒度
- 声明一行数据代表的含义,这里取最小的粒度
- 确认维度
- 确认所选择的每张事实表需要的所有维度
- 确认事实
- 事实即是度量值。确认所选择的每张事实表需要统计的度量值
根据以上步骤最终将得出一个表格:
时间 | 会员 | 地区 | 度量值 | |
---|---|---|---|---|
订单 | √ | √ | √ | 次数、金额 |
支付 | √ | √ | √ | 次数、金额 |
收藏 | √ | √ | 次数 |
得出该表格后,根据每一个事实表进行建模。以订单事实表为例,需要关联时间维度、用户维度、地区维度,并统计次数和金额。需要注意的是,如果维度有多级,需要使用 join 操作进行维度退化,满足星型模型的规范。
3.3 宽表层
该层的特点是主题驱动,在 DWD 层建模后理论上所有的统计都可以从 DWD 层进行统计获取,但是实际生产中往往是主题驱动的,如果不设置一层宽表层将会造成大量的重复计算并且统计分析的难度也大大提升。宽表层从维度出发,观察各个事实表的度量值并进行建表。
宽表层的特点是单维度,多度量(多张事实表的度量值)
宽表层可以进一步细化出 DWS 层、DWT 层。其中 DWS 层每行数据的是天粒度的度量值。DWT 层则更广泛,如事件开始时间、结束时间的度量值。粒度也会更大,如全部时间的累积度量值、近 30 天的度量值等等。这里以会员主题为例,说明 DWS 和 DWT 都具备哪些度量值。
-
DWS
- 单维度:会员(user_id)
- 多度量
- 当天下单次数、当天下单金额
- 当天支付次数、当天支付金额
- 当天收藏次数
-
DWT
- 单维度:会员(user_id)
- 多度量
- 首次下单时间、末次下单时间、累积下单次数、累积下单金额、最近 30 天下单次数、最近 30 天下单金额
- 累积支付次数、累积支付金额、最近 30 天支付次数、最近 30 天支付金额
- 累积收藏次数、最近 30 天收藏次数
3.4 ADS 层
该层主要利用上面的 DWD、DWS、DWT 层进行具体指标的分析
以上。