前文已经简单介绍了什么是数据仓库,数据仓库事实表、维表等相关概念。在了解这些概念之后,我们要建设符合企业要求,能支持业务使用、运营分析的数据仓库。然而在对数据建模之前,我们要对整个业务系统有深刻的理解,只有深度理解了公司内的业务,在数仓建设过程中才会抽象出公共维度的事实宽表,减少数据重复建模、提升数据质量。
一、维度建模方法论
数据仓库建模方法论有多种:分别是维度建模、范式建模、Data Vault模型、Anchor模型。而在企业中最流行,最常用的数仓建模方式便是维度建模。
1、维度模型
按数据组织建模类型划分可分为星型模型、雪花模型、星座模型。前文中已经介绍了相关概念,这里不再做过多赘述。
1.1、星型模型
星型模型是维表和事实表,以事实表为中心,所有维度直接关联在事实表上,呈星型分布,即是 星型模型。
1.2、雪花模型
在星型模型的基础上,维度表上又关联了其他维度表,这种叫雪花模型。
雪花模型维护成本高,性能较差,一般很少使用。尤其在基于Hadoop体系构建数据仓库时,尽可能的要减少join的操作。
1.3、星座模型
星座模型,是对星型模型的扩展延伸,多张事实表共享维度表。
2、范式模型
即实体关系(ER)模型,从全企业的高度设计一个3NF模型,用实体加关系描述的数据模型描述企业业务架构,在范式理论上符合3NF。
3、Data Vault模型
DataVault由Hub(关键核心业务实体)、Link(关系)、Satellite(实体属性) 三部分组成 ,它是在ER关系模型上的衍生,同时设计的出发点也是为了实现数据的整合,并非为数据决策分析直接使用。
4、Anchor模型
高度可扩展的模型,所有的扩展只是添加而不是修改,因此它将模型规范到6NF,基本变成了K-V结构模型,基本很少使用。
二、维度建模流程
下面通过一个业务场景来简单论述维度建模的过程,我们以微商城下单为例:一个会员购买一件商品,会生成一条记录数据。这条记录包含了会员的ID、商品的ID、时间,支付金额,支付方式等等诸多业务信息,我们对这条记录进行拆分。
维度建模的步骤:
2.1、收集业务需求与数据实现
在进行数据建模之前,我们要跟业务方进行充分沟通,理解整个链路的业务,对底层数据要充分认识。通过沟通交流、查看数据库数据或现有报表数据,理解他们需要的关键性指标,运营指标。同时数据实际情况要跟多开发组进行反复核验,确保数据的 原子性(原生业务数据,未进行任何加工处理的数据)。
2.2、选择业务过程
业务过程是业务活动事件,如下单,支付,退款都是业务过程,把这些过程转换为事实表中的事实,多数事实表只记录某一业务过程的结果。业务过程的选择非常重要,因为业务过程定义了特定的设计目标以及对粒度、维度、事实的定义。
2.3、声明粒度
声明粒度是维度设计的重要步骤,粒度用于确定某一事实表中的行表示什么。在选择维度或事实前必须声明粒度,因为每个维度或事实必须与定义的粒度保持一致。在从给定的业务过程获取数据时,原子粒度是最低级别的粒度。
2.4、确认维度
维度是度量的环境,用来反映业务的一类属性。这类属性的集合构成一个维度,也可以称为实体对象。维度属于一个数据域,如地理维度(其中包括国家、地区、省以及城市等级别的内容)、时间维度(其中包括年、季、月、周、日等级别的内容)。
2.5、确认事实
事实 涉及来自业务过程事件的度量,基本上都是以数据值表示。事实表作为数据仓库维度建模的核心,紧紧围绕着业务过程来设计,通过获取描述业务过程的度量来表达业务过程,包含了引用的维度和与业务过程有关的度量。在设计过程中,可以选择不同类型的事实表,它们有各自的适用场景
2.6、数据建模
选择一种维度模型进行数据建模,使用星型建模对业务数据进行建模。
三、数仓建模规范
3.1、数仓层级划分
数据仓库分层
ODS原始数据层
ODS层保存所有操作数据,不对原始数据做任何处理。在业务系统和数据仓库之间形成一个隔离,源系统数据结构的变化不影响其他数据分层。减轻业务系统被反复抽取的压力,由ODS统一进行抽取和分发。记住ODS层数据要保留数据的原始性。
处理原则:
- 根据源业务系统表的情况以增量或全量方式抽取数据;
- ODS层以流水表和快照表为主,按日期对数据进行分区保存,不使用拉链表;
- ODS层的数据不做清洗和转换,数据的表结构和数据粒度与原业务系统保持一致。
DWD数据明细层
DWD层的数据是经由ODS层数据经过清洗、转换后的明细数据,满足对标准化数据需求。如对NULL值处理,对数据字典解析,对日期格式转换,字段合并、脏数据处理等。
处理原则:
- 数据结构与ODS层一致,但可以对表结构进行裁剪和汇总等操作;
- 对数据做清洗、转换;
- DWD层的数据不一定要永久保存,具体保存周期视业务情况而定。
DWS数据汇总层
DWS层数据 按主题对数据进行抽象、归类,提供业务系统细节数据的长期沉淀。这一层是一些汇总后的宽表,是根据DWD层数据按照各种维度或多种维度组合,把需要查询的一些事实字段进行汇总统计。可以满足一些特定查询、数据挖掘应用,面向业务层面,根据需求进行汇总。
处理原则:
- 面向全局、数据整合;
- 存放最全的历史数据,业务发生变化时易于扩展,适应复杂的实际业务情况;
- 尽量减少数据访问时的计算量,优化表的关联。维度建模,星形模型;
- 事实拉宽,度量预先计算, 基本都是快照表。反规范化,有数据冗余。
ADS数据明细层
ADS应用层是根据业务需要,由DWD、DWS数据统计而出的结果,可以直接提供查询展现,或导入至Oracle等关系型数据库中使用。这一层的数据会面向特定的业务部门,不同的业务部门使用不同的数据,支持数据挖掘。
处理原则:
- 形式各式,主要按不同的业务需求来处理;
- 保持数据量小,定时刷新数据;
- 数据同步到不同的关系型数据库或hbase等其他数据库中。
- 提供最终数据,来满足业务人员、数据分析人员的数据需求。
数据仓库分层模式作用
3.1.1、数据结构化更清晰:对于不同层级的数据,他们作用域不相同,每一个数据分层都有它的作用域,这样我们在使用表的时候能更方便地定位和理解。
3.1.2、数据血缘追踪:提供给外界使用的是一张业务表,但是这张业务表可能来源很多张表。如果有一张来源表出问题了,我们可以快速准确的定位到问题,并清楚每张表的作用范围。
3.1.3、减少重复开发:数据分层规范化,开发一些通用的中间层数据,能够减少重复计算,提高单张业务表的使用率。
3.1.4、简化复杂的问题:把一个复杂的业务分成多个步骤实现,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。有点类似Spark RDD的容错机制。
3.1.5、减少业务的影响:业务可能会经常变化,这样做就不必改一次业务就需要重新接入数据。
3.2、数据域划分和命名
数据域的划分至关重要,在数据建模过程中,往往需要我们根据业务划分数据并约定命名。建议使用业务名称结合数据层次约定相关命名的英文缩写,这样划分层次更清晰,见名即可知意。
3.2.1、数据域划分
按业务划分:
命名时按主要的业务划分,以指导物理模型的划分原则、命名原则及使用。如公司有多条业务线,可以按照不同业务线进行划分。
按数据域划分:
命名时按照数据域进行划分,以便有效地对数据进行管理。例如,交易 数据的英文缩写可定义为“trd”,会员数据的英文缩写可以定义为 mbr。
按业务过程划分:
当一个数据域由多个业务过程组成时,命名时可以按业务流程划分。业务过程是从数据分析角度看客观存在的或者抽象的业务行为动作。例如,交易数据域中的“退款”这个业务过程的英文缩写可约定命名为“rfd_ent”。
3.2.2、任务命名
针对数据域任务命名一定要按照规范执行,这里以作者工作中常使用的命名方式为例,当然每个人习惯不同,命名可能有所不同。
如:ods_jnxx_mbr_intgl_di
ods:代表ods层
jnxx:公司名称英文缩写
mbr:会员 的缩写 mbr,表示会员业务
intgl:会员积分 英文的缩写,会员积分相关任务
di:代表天增量。
d:代表日全量同步
ri:代表小时增量同步
m:代表月
等等,这里就不一一举例了。