数仓维度建模

维度建模方法论:

维度建模 是以业务过程为驱动

先确定某些业务过程 围绕业务过程去建立模型 通常采用自底向上的方法 从明确关键业务过程开始

再到明确粒度 再到明确维度  最后明确事实 

在我们数仓项目初期 我们首先要做的就是对业务调研,数据调研,规划矩阵

一个数仓建模的设计很看重对业务的理解

建模也是整个数仓最核心的工作 数仓建模的好坏就取决于你的业务有没有吃透

模型设计讲究高内聚低耦合,高内聚 就是同一数据域的数据聚集在一块,而低耦合是指数据域与其他数据域之间的数据耦合度低。

 数仓建模 四个步骤 

1. 选择业务过程 -> 2.声明粒度 -> 3.确定维度 -> 4.确定事实

我们在建模的过程中  首先选择公司的核心的业务线 (如果是小公司 业务表只有几十张 可以全选)

比如说 订单业务 支付业务 活动业务 退款业务 物流业务...   一条业务线对应一张事实表 

我们根据选择的这些业务线 来确定一些维度和事实 也结合后端存储在数据库的数据来确定一些指标, 也判断产品提出来的需求能不能做 如果缺少数据 我们也会和后端部门去沟通 看能不能把需要的数据获取到。

我们确定好业务过程 就要去业务数据库 去抓取采集 这些业务线相关的数据了

我们把这些数据拉取到数据仓库中 要划分维度、事实去建表。 事实表中每一行数据表示的就是我们的声明的粒度  , 粒度越细越好 我们做建模 粒度基本都选用原子级别的粒度去拉取这些数据 粒度越细致 后期的工作越好做 。 举个例子:订单中每个商品项 作为订单事实表中的一行数据 粒度为每次。  将每周的订单次数作为一行数据 粒度为每周。   将每周的订单次数作为一行数据 粒度为每月.如果在DWD层建模采用的粒度是每周或者每月 那么后续就没办法统计粒度更细(比如每天 每次)的指标了选择最细粒度可以应对后期各种各样的需求。

维度的主要作用就是对业务事实的描述 主要表示 “谁、何处、何时”等信息 谁就代表用户维度 何处就代表地区维度 何时就代表时间维度,这些是比较常见和通用的维度。可以根据公司的情况和业务 增加维度,维度表的数据基本是不怎么会发生变化的,当然有缓慢变化的维度 可以采用拉链表或其他技术设计存储缓慢变化维。再简单讲group by后的基本都是维度。

“事实”这词在数仓建设中一般指的就是业务中的度量值 例如订单表的度量值就是订单件数,订单金额, 事实是表示业务过程中的发生事实,所以都是度量,数值类型的数据,我买了两瓶可乐花了我5块钱, 2瓶花了我五块钱就是事实。

维度建模有三种模型分别为: 星型模型、雪花模型、星座模型。

我们主要采用维度建模的星型模型进行建模的.(数仓建模不局限一个模型 而是灵活运用单层维度 和 多层维度并存)

星型模型的优点就是性能高,一张事实表 只关联一层的维表 减少后期团队分析数据产生的JOIN

尤其是针对基于Hadoop体系搭建的数仓项目 减少JOIN就是减少中间数据的传输和计算 明显的能改善性能,以及在我们设计事实表的时候适当考虑维度退化,也就是把部分维度数据冗余退化到事实表中,那么在一些场景计算直接统计单表也能满足,如今磁盘廉价,在设计模型时可以多考虑用空间换时间进行设计。

星型模型

数据仓库维度建模理论 数仓维度建模具体案例_算法

根据我们确定好的维表以及事实表 最终会确定一张总线矩阵图  总线矩阵图(总线矩阵产出是在设计物理模型之前产出)

数据仓库维度建模理论 数仓维度建模具体案例_数据仓库维度建模理论_02

 我们在DIM层进行维度的物理模型建设中:

        根据星型模型的思想可以进行维度降维,把地区表和省份表降维为一张地区维表。sku商品表、spu商品表、品牌表、商品一二三级分类表降维为一张商品维表,活动订单关联表以及活动规则表会退化为一张活动维表 等等建立维表。这里主要设计思想高内聚 低耦合,比如以上举例sku、spu等关于商品的表 ,那么有关于商品的数据尽可能的高内聚在一块。

我们在DWD层进行事实的物理模型建设中,要遵守几个原则:
包含所有与业务过程相关的事实

前必须声明粒度,并且同一事实表的粒度必须保持一致,以及事实单位也必须保持一致。 

度量值null值要做清洗补0处理

维度退化来保证事实表的易用性

原则说完后,来讲讲维度建模中事实表中的三种类型(三张表类型详细请关注我最新博客 这里不多赘述):

        1. 事务事实表(一行数据对应空间或时间上某点的度量事件)(常用类型)

        2. 周期快照事实表(每行数据汇总发生在某一标准周期, 比如某一天,某一周,某月的多个度量事件)

        3.累计快照事实表(记录发生在开始和结束之间的可预测的度量事件)。

      

我们在DWS层进行建设轻度汇总层:

        设计原则:1. 一致性 2. 聚焦粒度可不同 3. 区分统计周期 4. 不跨域统计 5. 数据公用性

1. 确定聚集维度   2. 确定一致性上钻 3.   确定聚集事实

我们在ADS层进行服务层的模型建设:

        这一层面向主题对外提供服务,比如我们做好的指标结果表可能应用于支撑报表 那么在进行ads层模型设计就要根据报表原型图以及和业务侧沟通 ads层的表模型该怎么设计。

总结:

        在数仓建模的整个过程非常考验我们的Hive sql的能力和对业务的理解能力,在我们进行数仓建模前要做好充分调研,以及做好数仓开发规范,比如模型设计规范,模型命名规范,关键词根规范,数据开发规范等。不然后期不好维护,团队换人,新人接手也比较难过。