通俗易懂数仓建模—Inmon范式建模与Kimball维度建模
在数据仓库领域,有两位大师,一位是“数据仓库”之父 Bill Inmon,一位是数据仓库权威专家 Ralph Kimball,两位大师每人都有一本经典著作,Inmon大师著作《数据仓库》及Kimball大师的《数仓工具箱》,两本书也代表了两种不同的数仓建设模式,这两种架构模式支撑了数据仓库以及商业智能近二十年的发展。今天我们就来聊下这两种建模方式——范式建模和维度建模。
本文开始先简单理解两种建模的核心思想,然后根据一个具体的例子,分别使用这两种建模方式进行建模,大家便会一目了然!
一、两种建模思想
对于 Inmon 和 Kimball 两种建模方式可以长篇大论叙述,但理论是很枯燥的,尤其是晦涩难懂的文字,大家读完估计也不会收获太多,所以笔者根据自己的理解用通俗的语言提炼出最核心的概念。
范式建模
范式建模是数仓之父 Inmon 所倡导的,“数据仓库”这个词就是这位大师所定义的,这种建模方式在范式理论上符合3NF,
Inmon 模型从流程上看是自上而下的,自上而下指的是数据的流向,“上”即数据的上游,“下”即数据的下游,即从分散异构的数据源 -> 数据仓库 -> 数据集市。以数据源头为导向,然后一步步探索获取尽量符合预期的数据,因为数据源往往是异构的,所以会更加强调数据的清洗工作,将数据抽取为实体-关系模型,并不强调事实表和维度表的概念。
维度建模
Kimball 模型从流程上看是自下而上的,即从数据集市-> 数据仓库 -> 分散异构的数据源。Kimball 是以最终任务为导向,将数据按照目标拆分出不同的表需求,数据会抽取为事实-维度模型,数据源经ETL转化为事实表和维度表导入数据集市,以星型模型或雪花模型等方式构建维度数据仓库,架构体系中,数据集市与数据仓库是紧密结合的,数据集市是数据仓库中一个逻辑上的主题域。
两种建模方式的理论概念就简单介绍到这,因为纯理论知识说再多,大家也可能有点迷惑,所以下面用一个具体的例子来实践两种建模方式。
二、两种建模实践
通过上一小节两种建模核心思想,相信大家对这两种建模方式已经有了大概的理解,接下来我们通过具体的例子,让大家有具体的感受。
以电商举例
大家都网购过,知道购买物品的流程,因此以电商购物为例,更易于大家的理解。
真实的电商购物的流程较复杂,此处表数量和表字段做简化处理。
1. 源表的结构及数据
对于我们大数据平台来说,源表指的电商系统中后台数据库中的表,这种表一般都是OLTP类型的表:
① 用户信息表:

② 城市信息表:

③ 用户等级表:

④ 用户订单表:

2. 使用 Inmon 模式建模
使用 Inmon 模式对以上源表数据进行建模,需要将数据抽取为实体-关系模式,根据源表的数据,我们将表拆分为:用户实体表,订单实体表,城市信息实体表,用户与城市信息关系表,用户与用户等级关系表等多个子模块:
① 用户实体表:
(注:ETL已过滤掉注销用户)

② 支付成功订单实体表:

③ 城市信息实体表:

④ 订单与用户关系表:

⑤ 用户与城市信息关系表:

⑥ 用户与用户等级关系表:

通过以上我们可以发现,范式建模就是将源表抽取为实体表,关系表,所以范式建模即是实体关系(ER)模型。数据没有冗余,符合三范式设计规范。
3. 使用 Kimball 模式建模
使用 Kimball 模式,需要将数据抽取为事实表和维度表,根据源表数据,我们将表拆分为:订单事实表,用户维度表,城市信息维度表,用户等级维度表。
① 支付成功订单事实表:

② 用户维度表:

③ 城市信息维度表:

④ 用户等级维度表:

可以看出,在 Kimball 的维度建模中,不需要单独维护数据关系表,因为关系已经冗余在事实表和维度表中。
我们用图的方式将以上表之间的关系简单展示出来:

三、两种建模对比
两种建模方式特点
建模方式对比

四、两种建模混合场景
最后
注:本文首发于InfoQ,禁止转载。