数据分层是数仓模型设计中十分重要的环节,优秀的分层设计能够让整个数据体系更易理解和使用。

本文将整理出一套适合公司行业提的的通用方法,指导分层建模思想,具体包含内容如下:
1.数仓建模分层的意义和作用
2.切实可用的分层设计,以及分层设计元层
3.分层案例
4.切实可行的意见

浅谈数仓分层 - 图1

数仓分层意义

数仓分层目的是使用空间换时间,通过大量预处理,提升用户数据加工效率等,故而存在大量数据冗余。如果不分层,源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。

通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。

综上所述数据分层将可以给我们带来如下的好处:

  1. 清晰数据结构:每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解
  2. 减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算
  3. 统一数据口径:通过数据分层,提供统一的数据出口,统一对外输出的数据口径
  4. 复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题

    通用可行的数仓分层设计方案

    为了满足前面提到数据分层带来的好处,建议将数据模型分为三层:基础数据层( ODS、STG )、公共维度模型层(CDM或EDW)和数据应用层(ADS)。如下图所示。简单来讲,我们可以理解为:基础数据层存放的是接入的原始数据,DW层是存放我们要重点设计的数据仓库中间层数据,数据应用层是面向业务定制的应用数据。

基础数据层

包含 STG(数据缓冲层)与 ODS(原始数据层)两层,这两层数据结构与业务数据几乎一致。

STG 数据准备区或数据缓冲区

定位是缓存来自 DB 抽取、消息、日志解析落地的临时数据,结构与业务系统保持一致;负责对垃圾数据、不规范数据进行清洗转换;该层除为ODS 层服务外,不提供服务,也就是不能被其他更上层次调用。

ODS原始数据层或操作数据层

操作数据层定位于业务明细数据保留区,负责保留数据接入时点后历史变更数据,数据原则上全量保留。可以在此层对增量数据或者拉链表数据进行合并。

公共维度模型层CDM(Common Data Model)或者 企业级数据仓库EDW (Enterprise Data Warehouse)

公共维度模型层主要用于存放明细事实数据、维表数据及公共指标汇总数据,其中明细事实数据、维表数据一般根据ODS层数据加工生成;公共指标汇总数据一般根据维表数据和明细事实数据加工生成。本层采用维度模型作为建模方法的理论基础,更多的是通过采用一些维度退化手段,将维度退化至事实表中,减少维表和事实表的关联,提高数据易用性。

明细数据层:DWD(Data Warehouse Detail)

该层一般保持和ODS层一样的数据粒度,并且提供一定的数据质量保证。同时,为了提高数据明细层的易用性,该层会采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联。同时在此层会采用明细宽表,复用关联计算,极少数据扫描。举例:订单主表以及订单明细表,可以以订单明细表作为最小粒度,连表整合订单表数据,生成dwd层订单事实表。

数据汇总层:DWS(Data WareHouse Summary)

该层会在DWD层的数据基础上,对数据做轻度的聚合操作,生成一系列的中间表,提升公共指标的复用性,减少重复加工。直观来讲,就是对通用的核心维度进行聚合操作,算出相应的统计指标。

公共维度模型层CDM主要作用

1、组合相关和相识数据,采用明细宽表,复用关联计算,减少数据扫描
2、公共指标统一加工,为上层数据产品应用,服务提供公共指标,建立逻辑汇总宽表
3、建立一致性维度,一致性的数据分析维度,降低数据计算口径,解决算法不同意的风险

应⽤层 ADS(Application Data Mart-应⽤数据集市)

数据应用层,也叫DM(数据集市)或APP层等,面试实际的数据需求,可以直接给业务人员使用,以DWD或者DWS层的数据为基础,组成各种统计报表。除此之外还有一些直接的表现形式,例如主题大宽度表集市,以及横表转纵表等。

宽表

宽表这块我的理解是,基于维度模型的扩展,采用退化维度的方式,将不同维度的度量放入数据表的不同列中,同时将于主分析维度相关的指标进行整合,更利于理解,以及较好的查询性能。

宽表物理设计结构:
1、基本属性
2、日行为汇总指标
3、周期行为汇总指标
4、历史累计属性和指标

思考和总结一下

从数据应用理解上来讲,目的是希望越上层次,对使用者约友好。比如ADS层,基本是完全为应用来设计的,很易懂,DWS层的话,相对来讲就会有一点点理解成本,然后DWD层就比较难理解了,因为它的维度可能会比较多,而且一个需求可能要多张表经过很复杂的计算才能完成。

从能力范围来讲,我们希望80%需求由20%的表来支持。直接点讲,就是大部分(80%以上)的需求,都用DWS的表来支持就行,DWS支持不了的,就用DWD的表来支持,这些都支持不了的极少一部分数据需要从原始日志中后去。