由于在变化快速的商业世界里,业务形态多种多样,为了能够更有针对性的进行数据建模,经过长时间的摸索,业界逐步形成了数据建模的四部曲:业务建模->领域建模->逻辑建模->物理建模。
简单讲,就是明确具体业务,抽象实体和关系,结合具体的建模方法,确定所有关键成分和属性,最后建数据表进行数据的存储和计算。
目前数据建模的方法论有两大阵营,一个是基于关系型数据库理论设计出来的,比如基于3NF的范式建模。虽然目前也有不少非关系型数据库以及不少半结构化和非结构化数据。但将半结构化/非结构化数据转化为结构化数据,然后再利用关系型数据库处理仍然是一种通用的主流数据处理方案。
另一个是基于数据仓库之父Bill Inmon提出的维度建模理论,是从全企业的高度利用实体关系来对企业业务进行描述。
01 数据建模相关概念
数据几乎总是用于两种目的:操作型记录的保存和分析型决策的制定。简单来说,操作型系统保存数据,分析型系统使用数据。前者一般仅反映数据的最新状态,按单条记录事务性来处理;其优化的核心是更快地处理事务。后者往往是反映数据一段时间的状态变化,按大批量方式处理数据;其核心是高性能、多维度处理数据。
通常我们将操作型系统简称为OLTP(On-Line Transaction Processing)— 联机事务处理,将分析型系统简称为OLAP(On-Line Analytical Processing)— 联机分析处理。
针对这两种不同的数据用途,如何组织数据,更好地满足数据使用需求。这里就涉及到数据建模问题。即设计一种数据组织方式(模型),来满足不同场景。在OLTP场景中,常用的是使用实体关系模型(ER)来存储,从而在事务处理中解决数据的冗余和一致性问题。
在OLAP场景中,有多种建模方式有:ER模型、星型模型和多维模型。下面分别说明下:
1、ER模型
OLAP中的ER模型,与OLTP中的有所区别。其本质差异是站在企业角度面向主题的抽象,而不是针对某个具体业务流程的实体对象关系的抽象。
2、星型模型
星型模型,是维度模型在关系型数据库上的一种实现。该模型表示每个业务过程包含事实表,事实表存储事件的数值化度量,围绕事实表的多个维度表,维度表包含事件发生时实际存在的文本环境。
这种类似于星状的结构通常称为"星型连接"。其重点关注用户如何更快速地完成需求分析,同时具有较好的大规模复杂查询的响应性能。在星型模型基础上,在复杂场景下还可以进一步衍生出雪花模型。
3、多维模型
多维模型,是维度模型的另一种实现。当数据被加载到OLAP多维数据库时,对这些数据的存储的索引,采用了为维度数据涉及的格式和技术。性能聚集或预计算汇总表通常由多维数据库引擎建立并管理。由于采用预计算、索引策略和其他优化方法,多维数据库可实现高性能查询。
02 维度建模
维度建模,是数据仓库大师Ralph Kimball提出的,是数据仓库工程领域最流行的数仓建模经典。
维度建模以分析决策的需求出发构建模型,构建的数据模型为分析需求服务,因此它重点解决用户如何更快速完成分析需求,同时还有较好的大规模复杂查询的响应性能。
它是面向分析的,为了提高查询性能可以增加数据冗余,反规范化的设计技术。
1、事实表
事实表产生于业务过程,存储了业务活动或事件提炼出来的性能度量。从最低的粒度级别来看,事实表行对应一个度量事件。
事实表根据粒度的角色划分不同,可分为事务事实表、周期快照事实表、累积快照事实表。
事务事实表,用于承载事务数据,通常粒度比较低,它是面向事务的,其粒度是每一行对应一个事务,它是最细粒度的事实表,例如产品交易事务事实、ATM交易事务事实。
周期快照事实表,按照一定的时间周期间隔(每天,每月)来捕捉业务活动的执行情况,一旦装入事实表就不会再去更新,它是事务事实表的补充。用来记录有规律的、固定时间间隔的业务累计数据,通常粒度比较高,例如账户月平均余额事实表。
累积快照事实表,用来记录具有时间跨度的业务处理过程的整个过程的信息,每个生命周期一行,通常这类事实表比较少见。
注意:这里需要值得注意的是,在事实表的设计时,一定要注意一个事实表只能有一个粒度,不能将不同粒度的事实建立在同一张事实表中。
2、维度表
维度表,一致性维度,业务过程的发生或分析角度,我们主要关注下退化维度和缓慢变化维。
退化维度(DegenerateDimension)
在维度类型中,有一种重要的维度称作为退化维度,亦维度退化一说。这种维度指的是直接把一些简单的维度放在事实表中。退化维度是维度建模领域中的一个非常重要的概念,它对理解维度建模有着非常重要的作用,退化维度一般在分析中可以用来做分组使用。
缓慢变化维(Slowly Changing Dimensions)
维度的属性并不是始终不变的,它会随着时间的流逝发生缓慢的变化,这种随时间发生变化的维度我们一般称之为缓慢变化维(SCD)。
SCD常用的三种处理方式:
① TYPE1 直接覆盖原值
② TYPE2 增加维度行
在为维度成员增加新行时,需为其分配新的主代理键。并且,至少需要在维度行再增加三列:有效日期、截止日期、行标识。这个地方可联想拉链表设计。
③ TYPE3 增加属性列
④ 混合方式
可根据实际业务场景,混合或选择使用以上三种方式,以快速方便而又准确的分析历史变化情况。
3、粒度
用于确定某一事实表中的行表示什么,是业务最小活动单元或不同维度组合,即业务细节程度。
4、维度建模流程
维度建模步骤:选择业务过程->声明粒度->确定维度->确定事实。旨在重点解决数据粒度、维度设计和事实表设计问题。
声明粒度,为业务最小活动单元或不同维度组合。以共同粒度从多个组织业务过程合并度量的事实表称为合并事实表,需要注意的是,来自多个业务过程的事实合并到合并事实表时,它们必须具有同样等级的粒度。
由于在维度建模过程中,涉及到很多概念。下面通过一个场景来,来一一说明。例如:常见的电商下单环节,每个用户提交一笔订单(仅限一个物品),就对应于一条订单记录。
【业务过程】:下订单
【粒度】:每笔订单(拆分为单个物品)
【维度】:地域、年龄、渠道等(可供分析的角度)
【事实/度量】:订单金额等(可用于分析的数据)
维度建模的步骤如下:
(1)收集业务需求与数据实现
在开始维度建模工作之前,需要理解业务需求,以及作为底层源数据的实际情况。通过与业务方沟通交流、查看现有报表等来发现需求,用于理解他们的基于关键性能指标、竞争性商业问题、决策制定过程、支持分析需求的目标。同时,数据实际情况可通过与数据库系统专家交流,了解访问数据可行性等。
(2)选择业务过程
业务过程是组织完成的操作型活动。业务过程时间建立或获取性能度量,并转换为事实表中的事实。多数事实表关注某一业务过程的结果。过程的选择非常重要的,因为过程定义了特定的设计目标以及对粒度、维度、事实的定义。
(4)声明粒度
声明粒度是维度设计的重要步骤。粒度用于确定某一事实表中的行表示什么。在选择维度或事实前必须声明粒度,因为每个候选维度或事实必须与定义的粒度保持一致。在从给定的业务过程获取数据时,原子粒度是最低级别的粒度。强烈建议从关注原子级别粒度数据开始设计,因为原子粒度数据能够承受无法预期的用户查询。
(5)确认维度(描述环境)
维度提供围绕某一业务过程事件所涉及的"谁、什么、何处、何时、为什么、如何"等背景。维度表包含分析应用所需要的用于过滤及分类事实的描述性属性。牢牢掌握事实表的粒度,就能够将所有可能存在的维度区分开来。
(6)确认事实(用于度量)
事实,涉及来自业务过程事件的度量,基本上都是以数据值表示。一个事实表行与按照事实表粒度描述的度量事件之间存在一对一关系,因此事实表对应一个物理可观察的事件。在事实表内,所有事实只允许与声明的粒度保持一致。
(7)部署方式 - 星型模型或多维模型
选择一种维度模型的落地方式。既可以选择星型模型,部署在关系数据库上,通过事实表及通过主外键关联的维度表;也可以选择多维模型,落地于多维数据库中。
03 维度建模方法论
数据仓库建模方法论可分为:维度建模、范式建模、Data Vault模型、Anchor模型。
1、维度模型
企业中最流行、也是最经典的数仓建模经典,数据仓库大师Ralph Kimball的经典著作《数据仓库工具箱 维度建模权威指南 第三版》一本书进行了论述。从事数据仓库/ETL/BI的同学,强烈建议买一本至少读一遍。
按数据组织类型划分可分为星型模型、雪花模型、星座模型。
(1)星型模型
星型模型主要是维表和事实表,以事实表为中心,所有维度直接关联在事实表上,呈星型分布。
(2)雪花模型
雪花模型,在星型模型的基础上,维度表上又关联了其他维度表。这种模型维护成本高,性能方面也较差,所以一般不建议使用。尤其是基于hadoop体系构建数仓,减少join就是减少shuffle,性能差距会很大。
(3)星座模型
星座模型,是对星型模型的扩展延伸,多张事实表共享维度表。数仓模型建设后期,大部分维度建模都是星座模型。
2、范式模型
即 实体关系(ER)模型,数据仓库之父Immon提出的,从全企业的高度设计一个3NF模型,用实体加关系描述的数据模型描述企业业务架构,在范式理论上符合3NF。此建模方法,对建模人员的能力要求非常高。
3、Data Vault模型
DataVault由Hub(关键核心业务实体)、Link(关系)、Satellite(实体属性) 三部分组成 ,是Dan Linstedt发起创建的一种模型方法论,它是在ER关系模型上的衍生,同时设计的出发点也是为了实现数据的整合,并非为数据决策分析直接使用。
4、Anchor模型
高度可扩展的模型,所有的扩展只是添加而不是修改,因此它将模型规范到6NF,基本变成了K-V结构模型。一般很少使用,本文不多做介绍。
04 建模规范
以维度建模为理论基础,定义一系列术语来描述建模对象。下图摘自于《阿里巴巴大数据实践之路》。
数据域
指面向业务分析,将业务过程或者维度进行抽象的集合。在划分数据域时,既能涵盖当前所有的业务需求,又能在新业务进入时无影响地被包含进已有的数据域中和扩展新的数据域。
业务过程
指企业的业务活动事件,如下单、支付、退款都是业务过程。请注意,业务过程是一个不可拆分的行为事件,通俗地讲,业务过程就是企业活动中的事件。
时间周期
用来明确数据统计的时间范围或者时间点,如最近30天、自然周、截至当日等。
修饰类型
是对修饰词的一种抽象划分,是从属于某个业务域的。
修饰词
指除了统计维度以外指标的业务场景限定抽象。修饰词隶属于一种修饰类型。
度量/原子指标
原子指标和度量含义相同,基于某一业务事件行为下的度量,是业务定义中不可再拆分的指标,具有明确业务含义的名词,如支付金额。
维度
维度是度量的环境,用来反映业务的一类属性,这类属性的集合构成一个维度,也可以称为实体对象。维度属于一个数据域,如地理维度(其中包括国家、地区、省以及城市等级别的内容)、时间维度(其中包括年、季、月、周、日等级别的内容)。
维度属性
维度属性隶属于一个维度,如地理维度里面的国家名称、国家ID、省份名称等都属于维度属性。
派生指标
派生指标=一个原子指标+多个修饰词(可选)+时间周期。可以理解为对原子指标业务统计范围的圈定。
数据层次的划分:
ODS:Operational Data Store,操作数据层,在结构上其与源系统的增量或者全量数据基本保持 一致。
它相当于一个数据准备区,同时又承担着基础数据的记录以及历史变化。其主要作用是把基础数据引入到MaxCompute。
CDM:Common Data Model,公共维度模型层,又细分为DWD和DWS。它的主要作用是完成数据加工与整合、建立一致性的维度、构建可复用的面向分析和统计的明细事实表以及汇总公共粒度的指标。
DWD:Data Warehouse Detail,明细数据层。
DWS:Data Warehouse Summary,汇总数据层。
ADS:Application Data Service,应用数据层。
具体仓库的分层情况需要结合业务场景、数据场景、系统场景进行综合考虑。
数据分类架构
该数据分类架构在ODS层分为三部分:数据准备区、离线数据和准实时数据区。在进入到CDM层后,由以下几部分组成:
公共维度层:
基于维度建模理念思想,建立整个企业的一致性维度。
明细粒度事实层:
以业务过程为建模驱动,基于每个具体业务过程的特点,构建最细粒度的明细层事实表。
可以结合企业的数据使用特点,将明细事实表的某些重要维度属性字段做适当的冗余,即宽表化处理。
公共汇总粒度事实层:
以分析的主题对象为建模驱动,基于上层的应用和产品的指标需求,构建公共粒度的汇总指标事实表,以宽表化手段来物理化模型。
数据处理流程架构
数据划分及命名空间约定
请根据业务划分数据并约定命名,建议针对业务名称结合数据层次约定相关命名的英文缩写,这样可以给后续数据开发过程中,对项目空间、表、字段等命名做为重要参照。
按业务划分:
命名时按主要的业务划分,以指导物理模型的划分原则、命名原则及使用的ODS project。
例如,按业务定义英文缩写,阿里的“淘宝”英文缩写可以定义为“tb”。
按数据域划分:
命名时按照CDM层的数据进行数据域划分,以便有效地对数据进行管理,以及指导数据表的命名。
例如,“交易”数据的英文缩写可定义为“trd”。
按业务过程划分:
当一个数据域由多个业务过程组成时,命名时可以按业务流程划分。
业务过程是从数据分析角度看客观存在的或者抽象的业务行为动作。
例如,交易数据域中的“退款”这个业务过程的英文缩写可约定命名为“rfd_ent”。
数据模型
模型是对现实事物的反映和抽象,能帮助我们更好地了解客观世界。数据模型定义了数据之间关系和结构,使得我们可以有规律地获取想要的数据。例如,在一个超市里,商品的布局都有特定的规范,商品摆放的位置是按照消费者的购买习惯以及人流走向进行摆放的。
数据模型的作用
数据模型是在业务需求分析之后,数据仓库工作开始时的第一步。良好的数据模型可以帮助我们更好地存储数据,更有效率地获取数据,保证数据间的一致性。
模型设计的基本原则
(1)高内聚和低耦合
一个逻辑和物理模型由哪些记录和字段组成,应该遵循最基本的软件设计方法论中的高内聚和低耦合原则。主要从数据业务特性和访问特性两个角度来考虑:将业务相近或者相关的数据、粒度相同数据设计为一个逻辑或者物理模型;将高概率同时访问的数据放一起,将低概率同时访问的数据分开存储。
(2)核心模型与扩展模型分离
建立核心模型与扩展模型体系,核心模型包括的字段支持常用核心的业务,扩展模型包括的字段支持个性化或是少量应用的需要。在必须让核心模型与扩展模型做关联时,不能让扩展字段过度侵入核心模型,以免破坏了核心模型的架构简洁性与可维护性。
(3)公共处理逻辑下沉及单一
底层公用的处理逻辑应该在数据调度依赖的底层进行封装与实现,不要让公用的处理逻辑暴露给应用层实现,不要让公共逻辑在多处同时存在。
(4)成本与性能平衡
适当的数据冗余可换取查询和刷新性能,不宜过度冗余与数据复制。
(5)数据可回滚
处理逻辑不变,在不同时间多次运行数据的结果需确定不变。
(6)一致性
相同的字段在不同表中的字段名必须相同。
(7)命名清晰可理解
表命名规范需清晰、一致,表命名需易于下游的理解和使用。
(8)补充说明
维度表设计要点:
维度是维度建模的基础和灵魂。在维度建模中,将度量称为"事实",将环境描述为"维度",维度是用于分析事实所需要的多样环境。维度所包含的表示维度的列,称为维度属性。维度属性是查询约束条件、分组和报表标签生成的基本来源,是数据易用性的关键。
维度的作用一般是查询约束、分类汇总以及排序等。维度的设计过程就是确定维度属性的过程,如何生成维度属性,以及所生成的维度属性的优劣,决定了维度使用的方便性,成为数据仓库易用性的关键。正如Kimball所说的,数据仓库的能力直接与维度属性的质量和深度成正比。
在整个设计过程中,应当遵循下面一些原则:
维度属性尽量丰富,为数据使用打下基础。
给出详实的、富有意义的文字描述。
沉淀通用维度属性,为建立一致性维度做好铺垫。
严格区分事实与维度,通过使用场景进行区分。
事实表设计要点:
事实表作为数据仓库维度建模的核心,紧紧围绕着业务过程来设计,通过获取描述业务过程的度量来表达业务过程,包含了引用的维度和与业务过程有关的度量。在设计过程中,可以选择不同类型的事实表,它们有各自的适用场景。
在整个设计过程中,应当遵循下面一些原则:
05 建模工具
1、PowerDesigner
PowerDesigner是目前数据建模业界的领头羊。功能包括:完整的集成模型,和面向包含IT为中心的、非IT为中心的差异化建模诉求。
支持非常强大的元数据信息库和各种不同格式的输出。PowerDesigner拥有一个优雅且人性化的界面,非常易懂的帮助文档,快速帮助用户解决专业问题。
2、ER/Studio
ER/Studio 是一个支持多平台环境的直观数据建模工具,并且本地集成了用于处理大数据平台,例如-MongoDB和Hadoop Hive。
它能够进行正向和逆向工程,并且拥有“比较合并”功能,能够输出例如XML、PNG、JPEG等格式文档。内建自动执行任务功能支持当前流行数据库平台。ER/Studio功能非常强大,拥有直观的界面和很好的用户支持特别易于马上开始工作。
3、Sparx Enterprise Architect
Enterprise Architect是一个拥有丰富功能的数据建模工具。自诩是高性价比的明智之选。Enterprise Architect帮助企业用户快速建立强大的可维护的系统,而且很容易在共享项目中扩展到大型的协作团队中去。
Enterprise Architect 同样有动态运行模拟模型的能力,用以验证模型和更加正确和深入的理解原来商业系统运作的方式。
4、CA ERwin
ERwin 也是业界领先的数据建模解决方案,能够为用户提供一个简单而优雅的界面同时处理复杂的数据环境问题。Erwin的解决方案提提供敏捷模型,同时元数据可以放在普通的数据库中进行处理,这样就能够保证数据的一致性和安全性。Erwin支持高度自定义的数据类型、APIs,允许自动执行宏语言等等。Erwin还建有一个很活跃的用户讨论社区,使得用户之间可以分享知识和各种经验。
5、IBM InfoSphere Data Architect
InfoSphere 是一个很创新的、运行在开源平台-Eclipse上的数据建模工具。Infopshere主要聚焦于一下三个主要的特性:高效、简洁、高度集成。
InfoSphere能够帮助商业用户建立逻辑、物理模型图,并且之后能非常方便的在各种不同的应用和系统中进行使用。InfoSphere是一个端到端的解决方案,可以快速高效地用在建立、部署、更新数据模型。同时为非常简易的集成了IBM的其他相关产品。
6、Visio
Visio 是Office 软件系列中的负责绘制流程图和示意图的软件,是一款便于IT和商务人员就复杂信息、系统和流程进行可视化处理、分析和交流的软件。同时它也可以用来数据库建模。
7、Excel Mapping
通过我们最熟悉的Excel进行维护数据模型、血缘关系和元数据管理
06 总结
CIO之家 www.ciozj.com 公众号:imciow