背景:结合公司的数仓体系,和工作经历,谈一谈数据仓库体系。
首先在编写这边文章之前,需要知道什么是数据仓库。
数据仓库之父Bill Inmon在1991年出版的“Building the Data Warehouse”一书中所提出的定义被广泛接受——数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。
数据仓库搭建的整理流程
怎么评判搭建数仓的好坏呢
个人认为主要从五个指标考量:稳定、可信、丰富、透明、安全。
- 稳定:数据产出需要稳定,这就需要任务调度平台、任务异常信息报警平台
- 可信:数据产出是能够令人信服的,这里面涉及到数据质量管理、数据指标管理
- 丰富:数据产出是丰富的,包含公司的整体数据集
- 透明:数据有迹可查,包含了数据地图、数据血缘管理
- 安全:数据是安全的,涉及到数据权限管理
数据治理说白了就是怎么能知道有哪些数据,存哪了,谁在用,怎么用,啥时候用,给谁提供服务了。
文绉绉一点,就是“数据管理”,“数据血缘”,“数据开发”,“数据分析”,“运维监控”,“数据服务”,等这一系列的能力。
传统的数据模型是E-R模型,数仓建模以维度建模为主。
维度建模
维度建模主要从4个维度去考量:选择业务过程->声明粒度->确认维度->确认事实;
1、选择业务过程
业务过程是由组织完成的微观活动,通常描述一段业务过程,如获得订单、学生注册、接收付款。业务过程包含以下公共特征
- 业务过程通常用行动动词表示
- 业务过程通常由某个操作系统支持,例如,账单或购买系统。
- 业务过程建立或获取关键性能度量
- 业务过程通常由输入激活,产生输出度量。一系列过程产生一系列的事实表。
2、声明粒度
- 声明粒度意味着精确定义某个事实表的每一行表示什么。
- 粒度传递的是与事实表度量有关的细节级别
粒度的声明尤为重要,如果不能清楚的定义粒度,整个设计就像建立在流沙之上。
3、确定维度
- 描述来自业务过程度量事件的数据。
- 应当使用健硕的维度集合装饰事实表
4、确定事实
- 不同粒度的事实必须放在不同的事实表
- 典型的事实是可加性的数值
- 需要综合考虑业务用户需求和数据来源的实际情况
- 事实表与维度表通过外键关联
比如说有个零售业务50元买10只笔。按照维度建模的思路
业务过程 | 粒度 | 维度 | 事实 |
---|---|---|---|
销售 | 订单的创建 | 店铺、商品、日期维度、出纳维度、促销维度 | 零售销售事实 |
目前常见的维度模型:
- 星型模型:每一个维表都与都与事实表相关联。数据冗余量较大
- 雪花模型:有些维表可能不与事实表直接关联,而是通过其他维表关联到事实表。数据冗余量较小
- 星座模型:由多个事实表相组合,维表是公共的。企业中一般都是星座模型
雪花模型和星型模型的主要区别就在于维度表有没有外键
目前来说业界采用的比较多的是星型模型。我认为主要原因是现在存储资源是廉价的。计算资源比较稀缺、比较贵。当采用了雪花模型,虽然存储资源减少了,但是会存在多表的join导致可能会浪费计算资源。
建设数据仓库之前需要定义一系列的标准,从数据层级规划、主题划分、业务线划分、表类型划分、表库命名规则、字段命名规范
数仓建设体系
(一)层级规范
(二)主题划分
主题域 | 英文 | 简写 | 说明 |
---|---|---|---|
营销 | campaign | cpn | 指企业发现或发掘客户需求,让客户了解该产品进而购买该产品的过程,例如双十一大促,618促销活动等。 |
商品 | goods | gds | 可市场化的产品、产品包和服务 |
事件 | event | evt | 事件是当事人发起的行为活动,它记录了详细的活动数据。 |
... | ... | ... | ... |
(三)业务线划分
...
(四)表类型划分
(五)表、视图、数据库命名
(1)ODS层表命名:
ods_[数据库名称/http/flume/spider]_[实例简写]_[业务系统表/生成程序名]_[更新周期(y/q/m/d/h)&更新策略(有分区增量s/有分区全量d/无分区全量a)]
- 例:ods_finance_counter_pro_ipaa_t_car_info_dd
(2)DL层表命名:
dl_[数据库名称/http/flume/spider]_[实例简写]_[业务系统表/生成程序名]_[更新周期(y/q/m/d/h)&更新策略(有分区增量s/有分区全量d/无分区全量a)]
- 例:dl_finance_counter_pro_ipaa_t_car_info_dd
(3)DWD层表命名:
dwd_[数据库名称/http/flume/spider]_[实例简写]_[业务系统表/生成程序名]_[更新周期(y/q/m/d/h)&更新策略(有分区增量s/有分区全量d/无分区全量a)]
- 例:dwd_finance_counter_pro_ipaa_t_car_info_dd
(4)DWB层表命名:
dwb_[主题]_[子主题]_[业务线/子业务线]&表类型(/f/d/l)]_[实际含义*]_[更新周期(y/q/m/d/h)&更新策略(有分区增量s/有分区全量d/无分区全量a)]
- 例:dwb_evt_trd_insd_car_info_dd
(5)DWS层表命名:
dws_[主题]_[子主题]_[业务线/子业务线]&表类型(/f/d/l)]_[实际含义*]_[更新周期(y/q/m/d/h)&更新策略(有分区增量s/有分区全量d/无分区全量a)]
- 例:dws_evt_trd_insd_car_info_dd
(6)DM层表命名:
dm/ws_[主题]_[子主题]_[业务线/子业务线]&表类型(/f/d/l)]_[实际含义*]_[更新周期(y/q/m/d/h)&更新策略(有分区增量s/有分区全量d/无分区全量a)]
- 例:dm_evt_trd_insd_car_info_dd
(六)字段命名规范
...
数据分层有什么好处呢
- 1、清晰的数据结构。每一层都有对应的作用域,使用表的时候更能够方便的理解和定位
- 2、数据血缘追踪。简单来说,就是当使用一张业务表依赖了多张数据表。出现问题时能够快速准确地定位到问题,并清楚它的危害范围
- 3、减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算
- 4、把复杂问题简单化。每一层都具有独立的属性。每一层都处理单一的步骤
- 5、屏蔽业务的影响。不必改一次业务就需要重新接入数据。
其实数据仓库包含的东西还蛮多的,元数据管理、血缘管理、指标管理等,每一种都包含很多东西。就先简单的描述下数仓。后续有时间在更新吧。。。