Skip to content

维度建模入门

1. 数据仓库建模意义

如果把数据看作图书馆里的书,我们希望看到它们在书架上分门别类地放置;如果把数据看作城市的建筑,我们希望城市规划布局合理;如果把数据看作电脑文件和文件夹,我们希望按照自己的习惯有很好的文件夹组织方式,而不是糟糕混乱的桌面,经常为找一个文件而不知所措。
数据模型就是数据组织和存储方法,它强调从业务、数据存取和使用角度合理存储数据。只有将数据有序的组织和存储起来之后,数据才能得到高性能、低成本、高效率、高质量的使用。
高性能:良好的数据模型能够帮助我们快速查询所需要的数据。
低成本:良好的数据模型能减少重复计算,实现计算结果的复用,降低计算成本。
高效率:良好的数据模型能极大的改善用户使用数据的体验,提高使用数据的效率。
高质量:良好的数据模型能改善数据统计口径的混乱,减少计算错误的可能性。

2. 数据仓库建模演进

2.1 ER模型

数据仓库之父Bill Inmon提出的建模方法是从全企业的高度,用实体关系(Entity Relationship,ER)模型来描述企业业务,并用规范化的方式表示出来,在范式理论上符合3NF。

  1. 实体关系模型
    实体关系模型将复杂的数据抽象为两个概念——实体和关系。实体表示一个对象,例如学生、班级,关系是指两个实体之间的关系,例如学生和班级之间的从属关系。
  2. 数据库规范化
    数据库规范化是使用一系列范式设计数据库(通常是关系型数据库)的过程,其目的是减少数据冗余,增强数据的一致性。这一系列范式就是指在设计关系型数据库时,需要遵从的不同的规范。关系型数据库的范式一共有六种,分别是第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF)。遵循的范式级别越高,数据冗余性就越低。
  3. 三范式
    第一范式1NF核心原则就是:属性不可切割。
    第二范式2NF核心原则:不能存在"部分函数依赖"。(比如:通过AB能得出C,通过A也能得出C,或者通过B也能得出C,那么说C部分依赖于AB。)
    第三范式3NF核心原则:不能存在传递函数依赖。(比如:通过A得到B,通过B得到C,但是C得不到A,那么说C传递依赖于A。)

为什么要降低数据冗余性?

  • 十几年前,磁盘很贵,为了减少磁盘存储。
  • 以前没有分布式系统,都是单机,只能增加磁盘,磁盘个数也是有限的。
  • 一次修改,需要修改多个表,很难保证数据一致性。
    缺点: 范式的缺点是获取数据时,需要通过Join拼接出最后的数据。

下图为一个采用Bill Inmon倡导的建模方法构建的模型,从图中可以看出,较为松散、零碎,物理表数量多。 Alt text 这种建模方法的出发点是整合数据,其目的是将整个企业的数据进行组合和合并,并进行规范处理,减少数据冗余性,保证数据的一致性。这种模型并不适合直接用于分析统计。

2.2 维度模型

维度建模也是一种数据仓库的建模技术, 维度建模由Ralph Kimball所倡导。维度模型将复杂的业务通过事实和维度两个概念进行呈现。事实通常对应业务过程,而维度通常对应业务过程发生时所处的环境。
Alt text 上图为一个典型的维度模型,其中位于中心的SalesOrder为事实表,其中保存的是下单这个业务过程的所有记录。位于周围每张表都是维度表,包括Date(日期),Customer(顾客),Product(产品),Location(地区)等,这些维度表就组成了每个订单发生时所处的环境,即何人、何时、在何地下单了何种产品。从图中可以看出,模型相对清晰、简洁。
维度建模以数据分析作为出发点,为数据分析服务,因此它关注的重点的用户如何更快的完成需求分析以及如何实现较好的大规模复杂查询的响应性能。

3. 维度模型分类

在维度建模的基础上又分为三种模型:星型模型、雪花模型、星座模型。

3.1 星型模型

Alt text 星型模型的核心是一个事实表(Fact Table),周围连接多个维度表(Dimension Table),这种结构呈星形。星型模型结构简单,呈放射状。

3.2 雪花模型

Alt text 在设计维度表时,如果对其进行规范化,得到的维度模型称为雪花模型。雪花模型,比较靠近3NF,通过规范化,减少了数据冗余和存储空间的使用。
雪花模型与星型模型的区别主要在于维度的层级,标准的星型模型维度只有一层,而雪花模型可能会涉及多级。

3.3 星座模型

Alt text 星座模型与前两种情况的区别是事实表的数量,星座模型是基于多个事实表
基本上存在多个事实表是很多数据仓库的常态,因为很多数据仓库都是含有多个事实表的。判断是否是星座模型要看是否里面含有多个事实表,多个事实表之间是否共享一些维度表。星座模型并不和前两个模型冲突,也就是存在星座雪花模型和星座星型模型。

3.4 模型的选择

首先就是星座不星座这个只跟数据和需求有关系,跟设计没关系,不用选择,也就是肯定要用到。
星型还是雪花,取决于性能优先,还是灵活更优先。
目前实际企业开发中,不会绝对选择一种,根据情况灵活组合,甚至并存(一层维度和多层维度都保存)。但是整体来看,更倾向于维度更少的星型模型。尤其是Hadoop体系,减少Join就是减少Shuffle,性能差距很大。(关系型数据可以依靠强大的主键索引)