维度模型以数据分析作为出发点,不遵循三范式,故数据存在一定的冗余。维度模型面向业务,将业务用事实表(SalesOrder:业务事实——下单记录、支付记录、加入购物车记录…)和维度表(业务事实的描述信息——何人何时何地)呈现出来。表结构简单,故查询简单,查询效率较高。
第一范式:属性不可切割;
第二范式:不存在部分函数依赖;
第三范式:不存在传递函数依赖。
一个典型的维度建模一般需要经过如下几个步骤:
- 业务调研:调研需要建模的业务形态,划分基本的业务线/数据域;
- 层次设计:定义数仓层级,保证各层级之间职责明确,划分清晰;
- 规范设计:定义数仓中表/字段的命名规范,建立统一的指标体系 ;
- 事实表设计:根据单一/复合业务过程确定事实表主题,确定最小粒度;
- 维度表设计:根据业务确定实体,补充实体属性字段
维度建模应该符合以下几个规范:
- 高内聚,低耦合:从业务流程和数据访问特性两个角度考虑,针对业务粒度相近,业务流程相近的数据应该放在同一个表中(例如广告数仓中通常会把广告的点击/曝光/转化多个业务过程数据放在同一个宽表中),针对经常要在同一个场景下访问的数据,也应该放在同一个表内。
- 公共处理逻辑下沉和单一:公用的逻辑应该封装在底层表中,避免公用逻辑直接暴露给上层,同一个公共逻辑需要收敛,避免在多个地方同时存在。
- 适当冗余:考虑到mr/rdd计算框架下join运算的资源损耗,可以通过适当冗余字段处理减少join操作。
- 命名一致/可理解:同一个业务含义的字段命名必须相同,且直观可读。
在维度建模的基础上又分为三种模型:星型模型、雪花模型、星座模型。
雪花模型与星型模型的区别主要在于维度的层数,标准的星型模型维度只有一层。而雪花模型可能会涉及多级。
星座模型与前两种的区别是事实表的数量,星座模型是基于多个事实表。