两种常见的数仓设计
-
三范式建模
尽量减少数据冗余,以关联的形式去关联数据
优点:空间占用小,数据冗余少
缺点:查询要用很多的JOIN
-
维度建模
不在意数据冗余,尽量为了维度而服务
优点:查询的时候不需要多数的JOIN
缺点:数据占用空间大
对于现代的企业来说,空间换性能,是划算的。因为硬盘便宜(相对)。
维度建模的概念
维度建模是围绕着事实表和维度表两个核心点来进行的
事实表
事实:就是事件的意思。表示的是系统中一个真实产生的事件信息。
举例:JD用户下单,就是一个事件会产生一个下单的事件信息(事实信息)
在线教育,用户报名学习,这就是一个事件,也就是一个事实信息(一条数据)
事实表,就是记录了一个个的事实(事件)信息的表
常见的事实表:
- 电商系统中的,订单表
- 在线教育中的,用户访问记录表、用户报名学习记录表
- 车联网系统中的,车辆信息上报表数据
事实表有时候也称之为
流水表
事实表的小分类
-
事务事实表
又称之为
原子事实表
,记录了事实的原子性事件隔离一个事件是一条数据
10001 1 12 已支付 2020-01-01 10:00:00 10001 1 12 以发货 2020-01-01 10:00:05 10001 1 12 已收货 2020-01-03 10:05:00 10001 1 12 已完成 2020-01-03 10:10:00
现在数仓开发中经常使用的模式
-
周期快照事实表(Periodicsnapshot fact table)
按照周期对事实进行聚合,得到某个方向的聚合结果
比如:订单事实表可以按照月聚合,得到每个月的订单量、订单金额、售卖商品数量等信息
一批数据到一条数据的转变
-
累积快照事实表
记录了事件的全生命周期中的所有状态节点的汇总
订单id 用户id 金额 是否支付 支付时间 是否发货 发货时间 是否收货 收货时间 是否完成 完成时间 10001 1 12 y 10:00:00 y 10:00:05 Y xxx Y xxx
累计快照事实表是为数不多的在数仓设计中会使用
UPDATE
语句的设计这种设计用的不多了(老年代有)(现代数仓中很少用了)
维度表
维度表:记录的是一个事件或者实体的各个维度上的信息
特性:维度表中的每个列都可以作为一个维度去分析事实表的数据
维度表有时候也称之为
字典表
维度表的小分类
- 高基维度:体量大,数据量比较多的维度表
- 低基维度:体量很小,数据量也很少,数据增长在可见的未来也不会怎么增长的表
基于事实表和维度表的关联,我们可以从多个维度上去分析事实表中的数据
在数据量上,事实表是巨大的,维度表是相对事实表较少。
流水表
车辆id | 速度 | 时间 | GPS | 油门深度 | 方向 | 机油温度 | 型号 | 品牌 | 车主 |
---|---|---|---|---|---|---|---|---|---|
10001 | 100 | 2020-01-01 10:00:00 | 1000,300 | 30 | n | 50 | 半挂 | 沃尔沃 | 王大锤 |
10002 | 110 | xxx | 123,321 | 50 | s | 90 | |||
10003 | 300 | xxx | 312,123 | 60 | w | 100 | |||
10001 | 110 | 2020-01-01 10:00:30 | 1000,300.5 | 60 | e | 60 | 厢式货车 | 东风 | 王大锤 |
。。。 | 。。。 | 。。。 | 。。。 | 。。。 | 。。。 | 。。。 |
字典表
车辆id | 型号 | 品牌 | 车主 | 手机 | 登记城市 | 类型 | 废除日期 | ||
---|---|---|---|---|---|---|---|---|---|
10001 | 厢式货车 | 东风 | 王大锤 | 10000000 | 上海 | 前4后8 | NULL | ||
10001 | 半挂 | 沃尔沃 | 王大锤 | 10000000 | 上海 | 半挂 | 2020-12-10 12:00:00 | ||
10002 | 厢式货车 | 红旗 | 大力 | 121231321 | 广州 | 前4后8 | |||
10003 | 厢式货车 | 东风 | 王晓瑞 | 13121535 | 深圳 | 前4后8 |
宽表
宽表就是事实表和维度表的集合
优点:
- 维度的更新,会在宽表里面跟随事实数据绑定(维度的更新,在宽表中是一种历史记录)
- 字段够多,查询无需JOIN
缺点:
- 数据量大(冗余多)
宽表在企业中应用是很广泛的。
因为,使用起来很简单,唯一的复杂点或者说性能点,在于数据写入的过程中要和很多维度表进行关联。
但是在使用的过程中是很爽的。
两种常见的数仓建模方式
- 星型模型
- 雪花模型
星型模型
以一个事实表为中心,围绕着多个维度表
雪花模型
一个事实围绕着多个维度层级的维度或者一个维度需要另外的维度中转才能连接到事实表
就像雪花一样开枝散叶
SCD渐变维
SCD渐变维也称之为拉链表
也叫缓慢渐变维
-
SCD1
覆盖,不管老的内容,直接更新维度表
这种模式用的人不会很多
-
SCD2
记录全量历史变更
使用的最广泛的模式
-
SCD3
记录少量历史信息(比如上一次)