背景:结合公司的数仓体系,和工作经历,谈一谈数据仓库体系。

首先在编写这边文章之前,需要知道什么是数据仓库。

数据仓库之父Bill Inmon在1991年出版的“Building the Data Warehouse”一书中所提出的定义被广泛接受——数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。

数据仓库搭建的整理流程

96319f2e038943fcb4a719aa66fec05c.png
数据仓库搭建体系

怎么评判搭建数仓的好坏呢

83a39b0592902d999474e54cab6179c7.png
评判标准

个人认为主要从五个指标考量:稳定、可信、丰富、透明、安全

  • 稳定:数据产出需要稳定,这就需要任务调度平台、任务异常信息报警平台
  • 可信:数据产出是能够令人信服的,这里面涉及到数据质量管理、数据指标管理
  • 丰富:数据产出是丰富的,包含公司的整体数据集
  • 透明:数据有迹可查,包含了数据地图、数据血缘管理
  • 安全:数据是安全的,涉及到数据权限管理

数据治理说白了就是怎么能知道有哪些数据,存哪了,谁在用,怎么用,啥时候用,给谁提供服务了。

文绉绉一点,就是“数据管理”,“数据血缘”,“数据开发”,“数据分析”,“运维监控”,“数据服务”,等这一系列的能力。

传统的数据模型是E-R模型,数仓建模以维度建模为主。

维度建模

维度建模主要从4个维度去考量:选择业务过程->声明粒度->确认维度->确认事实;

1、选择业务过程

业务过程是由组织完成的微观活动,通常描述一段业务过程,如获得订单、学生注册、接收付款。业务过程包含以下公共特征

  • 业务过程通常用行动动词表示
  • 业务过程通常由某个操作系统支持,例如,账单或购买系统。
  • 业务过程建立或获取关键性能度量
  • 业务过程通常由输入激活,产生输出度量。一系列过程产生一系列的事实表。

2、声明粒度

  • 声明粒度意味着精确定义某个事实表的每一行表示什么。
  • 粒度传递的是与事实表度量有关的细节级别

粒度的声明尤为重要,如果不能清楚的定义粒度,整个设计就像建立在流沙之上。

3、确定维度

  • 描述来自业务过程度量事件的数据。
  • 应当使用健硕的维度集合装饰事实表

4、确定事实

  • 不同粒度的事实必须放在不同的事实表
  • 典型的事实是可加性的数值
  • 需要综合考虑业务用户需求和数据来源的实际情况
  • 事实表与维度表通过外键关联

d655fff361a79001ca1a05e2c112351d.png

比如说有个零售业务50元买10只笔。按照维度建模的思路

业务过程 粒度 维度 事实
销售 订单的创建 店铺、商品、日期维度、出纳维度、促销维度 零售销售事实

e554a6114ebd2db2cd3535bcb1f2fa1c.png
零售模式中的可度量事实

目前常见的维度模型:

  • 星型模型:每一个维表都与都与事实表相关联。数据冗余量较大
  • 雪花模型:有些维表可能不与事实表直接关联,而是通过其他维表关联到事实表。数据冗余量较小
  • 星座模型:由多个事实表相组合,维表是公共的。企业中一般都是星座模型

雪花模型和星型模型的主要区别就在于维度表有没有外键

目前来说业界采用的比较多的是星型模型。我认为主要原因是现在存储资源是廉价的。计算资源比较稀缺、比较贵。当采用了雪花模型,虽然存储资源减少了,但是会存在多表的join导致可能会浪费计算资源。

建设数据仓库之前需要定义一系列的标准,从数据层级规划、主题划分、业务线划分、表类型划分、表库命名规则、字段命名规范

数仓建设体系

(一)层级规范

9b31f3870ba1b35fc30decf4fa840bac.png

(二)主题划分

主题域 英文 简写 说明
营销 campaign cpn 指企业发现或发掘客户需求,让客户了解该产品进而购买该产品的过程,例如双十一大促,618促销活动等。
商品 goods gds 可市场化的产品、产品包和服务
事件 event evt 事件是当事人发起的行为活动,它记录了详细的活动数据。
... ... ... ...

(三)业务线划分

...

(四)表类型划分

3d3e838cd879ed41aa379c7ce294be5e.png

(五)表、视图、数据库命名
(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

(六)字段命名规范

882f25329e33f8800743a4df9cbc2a7b.png

...

数据分层有什么好处呢

  • 1、清晰的数据结构。每一层都有对应的作用域,使用表的时候更能够方便的理解和定位
  • 2、数据血缘追踪。简单来说,就是当使用一张业务表依赖了多张数据表。出现问题时能够快速准确地定位到问题,并清楚它的危害范围
  • 3、减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算
  • 4、把复杂问题简单化。每一层都具有独立的属性。每一层都处理单一的步骤
  • 5、屏蔽业务的影响。不必改一次业务就需要重新接入数据。

其实数据仓库包含的东西还蛮多的,元数据管理、血缘管理、指标管理等,每一种都包含很多东西。就先简单的描述下数仓。后续有时间在更新吧。。。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐