数据仓库,英文名称为DataWarehouse
,可简写为DW或DWH
。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它出于分析性报告和决策支持目的而创建。为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。
传统数据库面向应用进行数据组织
的特点相对应,数据仓库中的数据是面向主题进行组织
的。数据仓库的数据是从原有的分散的数据库数据抽取来的。操作型数据(原始数据,一般来自于企业操作型系统)与DSS分析型数据(分析型数据/导出数据,是为了提高数据查询和管理效率,根据操作型数据计算得到的数据)之间差别甚大。
数据仓库中的数据不可更新是针对应用来说的,也就是说,数据仓库的用户进行分析处理时是不进行数据更新操作的。但并不是说,在从数据集成输入数据仓库开始到最终被删除的整个数据生存周期中,所有的数据仓库数据都是永远不变的。数据仓库的数据是随时间的变化而不断变化的,这是数据仓库数据的第四个特征。这一特征表现在以下3方面:
数据仓库的发展大致经历了这样的三个过程:
简单报表阶段:
数据集市阶段:
数据仓库阶段:
通过数据仓库建设的发展阶段,我们能够看出,数据仓库的建设和数据集市的建设的重要区别就在于数据模型的支持。因此,数据模型的建设,对于我们数据仓库的建设,有着决定性的意义。
数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别。
联机事务处理OLTP
(On-Line Transaction Processing,),也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理。联机分析处理OLAP
(On-Line Analytical Processing)一般针对某些主题的历史数据进行分析,支持管理决策。二者区别之前笔者已经在文章《OLAP实践 —— OLAP基本概念理解总计小记》对此做了分析,大家想详细了解可以直接看。这里只将结果给出:
OLTP | OLAP | |
---|---|---|
用户 | 操作人员 | 数据分析师、业务分析师、决策人员、高管 |
目的 | 操作处理,支持基本业务运行 | 发现和分析问题,支持决策 |
设计 | 面向应用,如银行业、零售业 | 面向主题,如销售、库存 |
特点 | 处理大量的小交易 | 使用复杂查询处理大量数据 |
数据内容 | 当前的、最新的业务交易数据 | 历史的、聚集的、统一的多维数据 |
查询类型 | 简单的、标准化的查询 | 复杂查询 |
数据操作 | 频繁的增、删、改操作;读取数据量不大 | 很少修改和删除操作;以读为主,读取数据量大。 |
时间要求 | 实时性要求高,通常是毫秒级 | 时间要求不严格,根据数据查询量,可以是秒级、分钟级甚至小时级 |
空间要求 | 通常较小,MB到GB级 | 由于要聚合大量数据,通常较大,GB到PB级 |
模型设计 | 为了保证数据修改的原子性,通常是规范化的数据模型,至少满足第三范式。 | 为了查询性能,通常是非规范化的数据模型 |
存储格式 | 修改操作频繁,通常是行存储 | 查询数据量大,通常是列式存储 |
主要应用 | 数据库 | 数据仓库 |
说到数仓建模就不得不说数据模型,我们就需要了解什么是数据模型、什么是数仓建模、为什么要数仓建模以及如何进行数仓建模。
数据模型是抽象描述现实世界的一种工具和方法,是通过抽象的实体及实体之间联系的形式,来表示现实世界中事务的相互关系的一种映射。在这里,数据模型表现的抽象的是实体和实体之间的关系,通过对实体和实体之间关系的定义和描述,来表达实际的业务中具体的业务关系。
数据仓库模型是数据模型中针对特定的数据仓库应用系统的一种特定的数据模型。一般的来说,我们数据仓库模型分为几下几个层次,如图 :
通过上面的图形,我们能够很容易的看出在整个数据仓库得建模过程中,我们需要经历一般四个过程:
业务建模
,生成业务模型,主要解决业务层面的分解和程序化。领域建模
,生成领域模型,主要是对业务模型进行抽象处理,生成领域概念模型。逻辑建模
,生成逻辑模型,主要是将领域模型的概念实体以及实体之间的关系进行数据库层次的逻辑化。物理建模
,生成物理模型,主要解决,逻辑模型针对不同关系型数据库的物理化以及性能等一些具体的技术问题。因此,在整个数据仓库的模型的设计和架构中,既涉及到业务知识,也涉及到了具体的技术,我们既需要了解丰富的行业经验,同时,也需要一定的信息技术来帮助我们实现我们的数据模型,最重要的是,我们还需要一个非常适用的方法论,来指导我们自己针对我们的业务进行抽象,处理,生成各个阶段的模型。
一般来说,数据模型的建设主要能够帮助我们解决以下的一些问题:
进行全面的业务梳理,改进业务流程。
建立全方位的数据视角,消灭信息孤岛和数据差异。
解决业务的变动和数据仓库的灵活性。
帮助数据仓库系统本身的建设。
建设数据模型既然是整个数据仓库建设中一个非常重要的关键部分,那么,怎么建设我们的数据仓库模型就是我们需要解决的一个问题。这里我们将要详细介绍如何创建适合自己的数据模型。
数据仓库的数据模型的架构和数据仓库的整体架构是紧密关联在一起的,我们首先来了解一下整个数据仓库的数据模型应该包含的几个部分。从下图我们可以很清楚地看到,整个数据模型的架构分成5 大部分,每个部分其实都有其独特的功能。
从上图我们可以看出,整个数据仓库的数据模型可以分为大概5 大部分:
系统记录域(System of Record)
:这部分是主要的数据仓库业务数据存储区,数据模型在这里保证了数据的一致性。内部管理域(Housekeeping)
:这部分主要存储数据仓库用于内部管理的元数据,数据模型在这里能够帮助进行统一的元数据的管理。汇总域(Summary of Area)
:这部分数据来自于系统记录域的汇总,数据模型在这里保证了分析域的主题分析的性能,满足了部分的报表查询。分析域(Analysis Area)
:这部分数据模型主要用于各个业务部分的具体的主题业务分析。这部分数据模型可以单独存储在相应的数据集市中。反馈域(Feedback Area)
:可选项,这部分数据模型主要用于相应前端的反馈数据,数据仓库可以视业务的需要设置这一区域。通过对整个数据仓库模型的数据区域的划分,我们可以了解到,一个好的数据模型,不仅仅是对业务进行抽象划分,而且对实现技术也进行具体的指导,它应该涵盖了从业务到实现技术的各个部分。
我们前面介绍了数据仓库模型的几个层次,下面我们讲一下,针对这几个层次的不同阶段的数据建模的工作的主要内容:
从上图我们可以清楚地看出,数据仓库的数据建模大致分为四个阶段:
业务建模
,这部分建模工作,主要包含以下几个部分:领域概念建模
,这部分得建模工作,主要包含以下几个部分:概念模型具体要求如下:
概念模型 | |
---|---|
界定系统边界 | 1. 明确需求 |
2. 明确需做的决策类型 | |
3. 决策者感兴趣的问题 | |
4. 这些问题需要什么样的信息 | |
5. 要得到这些信息包含源数据的哪些数据 | |
确定主要的主题域及其内容 | 1. 主题域的公共码键 |
2. 主题域之间的联系 | |
3. 充分代表主题的属性组 | |
确定主题域间的关系 | 从企业角度深入了解各个信息系统的业务 |
概念模型理解实例如下:
建筑规划图 vs 概念模型 | ||
---|---|---|
建筑规划图 | 概念模型 | 意义 |
盖什么房子? 住宅?写字楼?医院? |
要解决何种商业问题 | 项目的目的 |
有几口人,都是谁?什么年龄、习惯、爱好... | 在此商业活动中,有哪些人或者组织参与,角色分别是什么?售货员、出纳、商场经理… | 组织 |
有哪些物件需要摆放?汽车、家具、家电… | 在此商业活动中,有哪些物件参与其中?商业、货架、收款机... | 物件 |
常识: 一个起居室、一个厨房、一个餐厅,需要一个二层小楼,一楼起居室、厨房和餐厅,二楼是卧室 特征: 两个车位,一个现在用,一个未来备用,一个游泳池... |
行业经验: 核心业务流程、组织架构、行业术语 定制: 特殊的流程、专有的术语、特有的用户群... |
功能范围 |
逻辑建模
,这部分的建模工作,主要包含以下几个部分:逻辑模型具体要求如下:
逻辑模型 | |
---|---|
分析丰富主题域,确定当前要装载的主题 | 1. 选择的主题域尽量小 |
2. 逐步求精 | |
确定粒度层次划分 | 1. 必须保存最细粒度数据 |
2. 根据业务部门的查询需求考虑多重粒度来提高复杂查询度 | |
确定数据分割策略(表划分,列划分) | 1. 数据量大小是决定是否进行数据分割和如何分割的主要因素 |
2. 数据分析处理的要求是选择数据分割标准的一个主要依据 | |
3. 所选择的数据分割的标准是自然的、易于实施的 | |
4. 考虑数据分割的标准与粒度划分层次式自适应的 | |
关系模型定义 | 1. 一个主题对应多个表 |
2. 确认主题的公共键码,确定各个表的关系模型 | |
记录系统定义 | 记录数据来源以及数据规范化标准 |
逻辑模型理解实例如下:
建筑设计图 vs 逻辑模型 | ||
---|---|---|
建筑设计图 | 逻辑模型 | 意义 |
分多个域,各个区域的面积。 比如:起居室5m * 4m,主卧室3.3m * 4m... |
分多少个主题?每个主题包含的实体 比如:客户、商品、商店、订单... |
实体的定义 |
每个域的功能。 比如:主卧室中要有卫生间,要有衣橱 |
每个实体的属性都有什么? 比如:客户的属性包括客户编码、客户姓名、客户联系方式、家庭住址......其中客户编码为主键 |
实体属性的定义 |
各个区域之间的联系。 比如:各个房间之间的走廊、卫生间和厨房需要相邻、热水器的热水管需要接通到厨房... |
各个实体之间的关系是什么? 比如:订单实体中包括客户编码和商品编码,来自客户实体和商品实体 |
实体间的关系 |
设计时有哪些限制? 比如:剪力墙不可动、空心砖处不可挂热水器等重物... |
各个实体是否有关系约束?单个属性是否有范围限制? 比如:订单与客户之间的关系约束,客户编码唯一... |
约束的定义 |
物理建模
,这部分得建模工作,主要包含以下几个部分:物理模型的具体要求如下:
物理模型 | |
---|---|
确定项目资源 | 1. 更具预算和项目需求,对该项目的成本周期和资源进行估算 |
2. ETL占整个项目的70%,同时确定生命周期 | |
确定软件硬件配置 | 1. 估算数据容量 |
2. 对集群的性能要做心中有数 | |
数仓的存储设计实例 | ODS层: 从应用系统采集而来,只保存一定期限,同时支持部分近实时报表展示 |
DWD层: 保存经过清洗,转换和重新组织的历史业务数据,数据将保留较久,满足系统最细粒度的查询需要。 |
|
DIM层: 主要保存各主题域的维度信息数据 |
|
DWS层: 面向KPI指标计算和分析,支持汇总层面交易级的指标查询,提高汇总级的KPI数据展示速度和数据保存时间,保存较久的历史数据。 |
|
APP层: 基于部门或者一类特定分析主题需要,从企业及数据仓库单独获取的一个数据的逻辑或者物理子集。 |
|
ETL工具选择 | spark、flink |
hive、azkaban、hera | |
datax、sqoop | |
kafka、MQ | |
doris、kylin、clickhouse |
物理模型理解实例如下:
建筑施工图 vs 物理模型 | |
---|---|
建筑施工图 | 物理模型 |
墙体的高度和厚度 比如:墙高5m,厚度30cm |
字符长度的定义 比如:VARCHAR、DATE... |
窗子高、每扇窗子的大小、是否使用定位器 | 字段的其他详细定义 比如:是否可为空,是否有默认值,是否属于某个域 |
各线路的具体位置 比如:水管、电线、网线的走法,以及留下图纸以备未来维修... |
精准详细的定义 比如:某字段为枚举类型,各个枚举值的具体含义,比如STATUS_CD |
设计时遵循行业标准以及一定准则 比如:墙面漆的颜色配置和谐、卫生间的防水标准 |
约束的定义 唯一主键、唯一值、强关系约束等 遵循术语表 统一的缩写表,一致的参照术语表 |
从我们上面对数据仓库的数据建模阶段的各个阶段的划分,我们能够了解到整个数据仓库建模的主要工作和工作量,希望能够对我们在实际的项目建设能够有所帮助。
数据仓库的建模方法同样也有很多种,每一种建模方法其实代表了哲学上的一个观点,代表了一种归纳,概括世界的一种方法。目前业界较为流行的数据仓库的建模方法非常多,这里主要介绍范式建模法,维度建模法,实体建模法等几种方法,每种方法其实从本质上讲就是从不同的角度看我们业务中的问题,不管从技术层面还是业务层面,其实代表的是哲学上的一种世界观。我们下面给大家详细介绍一下这些建模方法。
范式建模法
是我们在构建数据模型常用的一个方法,该方法的主要由Inmon 所提倡的集线器的自上而下(EDW-DM)的数据仓库架构
,主要解决关系型数据库的数据存储,利用的一种技术层面上的方法。目前,我们在关系型数据库中的建模方法,大部分采用的是三范式建模法。关系型模型的核心
:规范化,规范化是把数据库组织成在保持存储数据完整性的同时最小化冗余数据的结构的过程。关系模型可以从第一范式到第五范式进行无损分解,这个过程也可称为规范化
。在数据仓库的模型设计中目前一般采用第三范式,它有着严格的数学定义。从其表达的含义来看,一个符合第三范式的关系必须具有以下三个条件:
范式是基于整个关系型数据库的理论基础之上发展而来
。我们来看下我们在数据仓库中常用的三大范式。第一范式(1NF)
(针对表的某一列也就是某个字段):第一范式就是无重复的域
。第二范式(2NF)
(针对某一列与复合主键的一部分有关):2NF是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)
。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。 选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。
例如在员工表中的身份证号码即可实现每个一员工的区分,该身份证号码即为候选键,任何一个候选键都可以被选作主键(表的唯一主键)。在找不到候选键时,可额外增加属性以实现区分,如果在员工关系中,没有对其身份证号进行存储,而姓名可能会在数据库运行的某个时间重复,无法区分出实体时,设计辟如ID等不重复的编号以实现区分,被添加的编号或ID选作主键。(该主键的添加是在ER(Entity Relationship Diagram,实体-联系图)设计时添加,不是建库时随意添加)。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键
。第三范式(3NF)
(针对某一列与主键无关,但是与某一非主键列有关):根据 Inmon 的观点,数据仓库模型得建设方法和业务系统的企业数据模型类似。在业务系统中,企业数据模型决定了数据的来源,而企业数据模型也分为两个层次,即主题域模型和逻辑模型。同样,主题域模型可以看成是业务模型的概念模型,而逻辑模型则是域模型在关系型数据库上的实例。
从业务数据模型转向数据仓库模型时,同样也需要有数据仓库的域模型,即概念模型,同时也存在域模型的逻辑模型。这里,业务模型中的数据模型和数据仓库的模型稍微有一些不同。主要区别在于
:
以笔者的观点来看,Inmon 的范式建模法的最大优点就是从关系型数据库的角度出发,结合了业务系统的数据模型,易于维护,高度集成,能够比较方便的实现数据仓库的建模。但其缺点也是明显的,由于建模方法限定在关系型数据库之上,在某些时候反而限制了整个数据仓库模型的灵活性,性能等,结构死板,部署周期较长,特别是考虑到数据仓库的底层数据向数据集市的数据进行汇总时,需要进行一定的变通才能满足相应的需求。因此,笔者建议读者们在实际的使用中,参考使用这一建模方式。
这里举一个建模的基本实例,我们知道:
ODS(贴源层)
:即这里存放的数据与原系统保持一致,将采集公司所有的系统产生的数据以及外部数据(包括合作数据以及爬虫获得的数据),将所采集的数据汇总到一起,供EDW和DM使用;EDW:这一层分为两个,即ADM(共性加工层)和FDM(主题模型层)
。其中FDM将从ODS层不同系统不同表的字段进行分类,同一主题的字段都归为一类,目前流行的十大主题;ADM是加工一些共性的指标,指标从ODS或者FDM的字段加工来,这层主要供集市层使用;DM:数据集市层
,这一层是将业务部门所关注的指标进行汇总,形成的数据,不同的业务部门可以形成不同的集市,具体情况可以视情况而定;集市层的架构可以细分为:基础层、汇总层和分析层。这样的层次结构,虽然层次很清晰,但是如果越靠近底层数据出现问题,那么就会越影响到后面的;同时时间上做不到实时更新,一边都是T+1,或者越到后面时效性都可能是T+2/3的情况。因此当我们考虑到我们的应用的场景是否需要考虑时效性的时候,我们也要做出相应的调整。
最流行的数据仓库概念是多维数据模型。这种模型可以以星型模式,雪花模式,或事实星座模式的形式存在。
星型模型(Star schema):
雪花模型(Snowflake schema):
事实星座模型(Fact constellations):
星形模型(Star Schema)和雪花模型(SnowflakeSchema)是数据仓库中常用到的两种方式,而它们之间的对比要从四个角度来进行讨论。
对比项 | 星型模型 | 雪花模型 |
---|---|---|
数据优化 | 星形模型实用的是反规范化数据。在星形模型中,维度直接指的是事实表,业务层级不会通过维度之间的参照完整性来部署。 | 雪花模型使用的是规范化数据,也就是说数据在数据库内部是组织好的,以便消除冗余,因此它能够有效地减少数据量。通过引用完整性,其业务层级和维度都将存储在数据模型之中。 |
业务模型 | 而在星形模型中,所有必要的维度表在事实表中都只拥有外键。主键是一个单独的唯一键(数据属性),为特殊数据所选择。外键(参考属性)仅仅是一个表中的字段,用来匹配其他维度表中的主键。 | 在雪花模型中,数据模型的业务层级是由一个不同维度表主键-外键的关系来代表的。主键是一个单独的唯一键(数据属性),为特殊数据所选择。外键(参考属性)仅仅是一个表中的字段,用来匹配其他维度表中的主键。 |
性能 | 星形模型在维度表、事实表之间的连接相对较少,因此性能较高 | 雪花模型在维度表、事实表之间的连接很多,因此性能方面会比较低。 |
ETL | 星形模型加载维度表,不需要再维度之间添加附属模型,因此ETL就相对简单,而且可以实现高度的并行化。 | 雪花模型加载数据集市,因此ETL操作在设计上更加复杂,而且由于附属模型的限制,不能并行化。 |
总体来说,雪花模型使得维度分析更加容易,比如“针对特定的广告主,有哪些客户或者公司是在线的?”星形模型用来做指标分析更适合,比如“给定的一个客户他们的收入是多少?”
上图的这个架构中是典型的星型架构。星型模式之所以广泛被使用,在于针对各个维作了大量的预处理,如按照维进行预先的统计、分类、排序等。通过这些预处理,能够极大的提升数据仓库的处理能力。特别是针对3NF 的建模方法,星型模式在性能上占据明显的优势。
同时,维度建模法的另外一个优点是,维度建模非常直观,紧紧围绕着业务模型,可以直观的反映出业务模型中的业务问题。不需要经过特别的抽象处理,即可以完成维度建模。
总的来说就是,相对范式性能高,构建迅速,最快的看到投资回报率,与业务紧密结合,敏捷灵活。
但是,维度建模法的缺点也是非常明显的,由于在构建星型模式之前需要进行大量的数据预处理,因此会导致大量的数据处理工作。而且,当业务发生变化,需要重新进行维度的定义时,往往需要重新进行维度数据的预处理。而在这些与处理过程中,往往会导致大量的数据冗余。
另外一个维度建模法的缺点就是,如果只是依靠单纯的维度建模,不能保证数据来源的一致性和准确性,而且在数据仓库的底层,不是特别适用于维度建模的方法。作为企业资源不太好维护,结构复杂,数据集市集成困难。
因此以笔者的观点看,维度建模的领域主要适用与数据集市层,它的最大的作用其实是为了解决数据仓库建模中的性能问题。维度建模很难能够提供一个完整地描述真实业务实体之间的复杂关系的抽象方法。
实体建模法并不是数据仓库建模中常见的一个方法,它来源于哲学的一个流派。从哲学的意义上说,客观世界应该是可以细分的,客观世界应该可以分成由一个个实体,以及实体与实体之间的关系组成。那么我们在数据仓库的建模过程中完全可以引入这个抽象的方法,将整个业务也可以划分成一个个的实体,而每个实体之间的关系,以及针对这些关系的说明就是我们数据建模需要做的工作。
虽然实体法粗看起来好像有一些抽象,其实理解起来很容易。即我们可以将任何一个业务过程划分成3 个部分,实体,事件和说明,如下图所示:
上图表述的是一个抽象的含义,如果我们描述一个简单的事实:“小明开车去学校上学”。以这个业务事实为例,我们可以把“小明”,“学校”看成是一个实体,“上学”描述的是一个业务过程,我们在这里可以抽象为一个具体“事件”,而“开车去”则可以看成是事件“上学”的一个说明。
从上面的举例我们可以了解,我们使用的抽象归纳方法其实很简单,任何业务可以看成3 个部分:
由于实体建模法,能够很轻松的实现业务模型的划分,因此,在业务建模阶段和领域概念建模阶段,实体建模法有着广泛的应用。从笔者的经验来看,再没有现成的行业模型的情况下,我们可以采用实体建模的方法,和客户一起理清整个业务的模型,进行领域概念模型的划分,抽象出具体的业务概念,结合客户的使用特点,完全可以创建出一个符合自己需要的数据仓库模型来。
但是,实体建模法也有着自己先天的缺陷,由于实体说明法只是一种抽象客观世界的方法,因此,注定了该建模方法只能局限在业务建模和领域概念建模阶段。因此,到了逻辑建模阶段和物理建模阶段,则是范式建模和维度建模发挥长处的阶段。
因此,笔者建议读者在创建自己的数据仓库模型的时候,可以参考使用上述的三种数据仓库得建模方法,在各个不同阶段采用不同的方法,从而能够保证整个数据仓库建模的质量。
特性 | Kimball | Inmon |
---|---|---|
数据摄取 | yes | yes |
stage | yes | yes |
ETL | yes | yes |
数据集市 | yes | yes |
商业需求 | yes | yes |
数据时间属性 | yes | yes |
数据仓库优先 | no | yes |
事实维度拆分 | yes | no |
关系表维护 | no | yes |
处理导向 | yes | no |
数据模型泛化 | no | yes |
精心设计 | no | yes |
缓慢变化维 | yes | no |
连续变化维 | no | yes |
我们主要从时间、开发难度、维护难度、技能要求、数据要求五个方面对比:
特性 | Kimball | Inmon |
---|---|---|
时间 | 快速交付 | 路漫漫其修远兮 |
开发难度 | 小 | 大 |
维护难度 | 大 | 小 |
技能要求 | 入门级 | 专家级 |
数据要求 | 特定业务 | 企业级 |
我们主要从定义、数据集数据存储、开发周期、维护成本等四个方面进行对比:
对比项 | 维度模型 | 范式建模 |
---|---|---|
定义 | 维度建模源于Kimball提出的总线式的自下而上(DM-DW)的数据仓库架构。 | 范式建模源于Inmon提出的集线器的自上而下(EDW-DM)的数据仓库架构。 |
数据及存储 | 模型结构简单,星型模型为主 | 同一份数据只存放在一个地方,因此只能从一个地方获取,没有数据冗余,保证了数据一致性 |
开发周期 | 开发周期短,能够快速迭代 | 开发周期较长,开发成本较高 |
维护 | 维护成本较高 | 解耦(系统级与业务级),方便维护 |