数据仓库:模型设计和维度建模

数据仓库模型

数据仓库中有几种经典的数据模型:范式模型、维度模型、DataVault。

很多模型的设计都在同构化,而且在工作中也不是单独地用一种模型,会根据业务场景做出选择。

范式模型

范式是数据库逻辑模型设计的基本理论,一个关系模型可以从第一范式到第五范式进行无损分解。

在数据仓库的模型设计中目前一般采用第三范式。

一个符合第三范式的关系具有以下三个条件:

  • 数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值。
  • 数据库表中的每个实例或行必须可以被唯一区分。
  • 数据库表中不包含已在其它表中已包含的非主关键字信息。

范式模型由数据仓库之父Inmon提倡,可以大致地按照OLTP设计中的3NF来理解,它在范式理论上符合3NF,它与OLTP系统中的3NF的区别在于数据仓库中的3NF是站在企业角度面向主题的抽象,而不是针对某个具体业务流程的实体对象关系抽象,它更多的是面向数据的整合和一致性治理。

关于范式模型,也叫ER模型、实体模型。

维度模型

维度模型是Ralph Kimball所倡导,他的-The DataWarehouse Toolkit-The Complete Guide to Dimensona Modeling,是数据仓库工程领域的数据建模经典。按照书中所讲:

维度建模并不要求维度模型必须满足第3范式。数据库中强调的 3NF 主要是为了消除冗余。规范化的 3NF 将数据划分为多个不同的实体,每个实体构成一个关系表。比如说订单数据库,开始可能是每个订单中的一行表示一条记录,到后来为了满足 3NF会变成蜘蛛网状图,也许会包含上百个规范化表。而且对于 BI 查询来讲,规范化模型太复杂,用户会难以理解和记录这些模型的使用。 而维度建模解决了模式过分复杂的问题。

维度模型的典型代表是星形模型,以及一些特殊场景下使用的雪花模型和星座模型。

维度模型里面有两个非常重要的概念:事实表和维度表。

事实表:

发生在现实世界中的操作型事件,其所产生的可度量数值,存储在事实表中。从最低粒度级别来看,事实表行对应一个度量事件。

维度表:

每个维度表都包含单一的主键列。维度表的主键可以作为与之关联的任何事实表的外键,当然,维度表行的描述环境应与事实表行完全对应。维度表通常比较宽,是扁平型非规范表,包含大量的低粒度的文本属性。

Data Vault

Data Vault是Dan Linstedt发起创建的一种模型方法论,现在应该叫做Data Vault 2.0了,它也是一套完整的数据仓库理论,其中也有专门的一部分关于数据模型设计。

Data Vault 模型,应该说是范式模型和维度模型的一种混合,它兼容了两种模型的优势。

Data Vault 通常可以分为三种类型:中心体,链接体和附属体。它主要由:Hub(中心表)、Link(链接表)和 Satellite(卫星表) 三部分组成 。

中心表:

中心表主要是存储一些日常用的业务关键码,比如客户号,发票号,流水号等。它包括三个要素:

  • 代理键:这就是一些操作性的组件,包括客户号,发票号等
  • 装载时间戳:可以理解为ETL进行日加载的时间
  • 数据源:就是可以追溯到的原系统,比如:CRM、ERP等

链接表:

是3NF的多对多关系的物理表现形式,它表现的是多个业务键之间的关系。它和范式模型的最大区别是,将关系作为一个独立单元抽象出来,可以提升模型的扩展性。

它主要包含以下特征:

  • 代理键
  • 代理键间的映射关系
  • 装载时间戳:可以理解为ETL进行日加载的时间
  • 数据源:就是可以追溯到的原系统,比如:CRM、ERP等

卫星表:

业务领域中的其余信息可能随着时间而变化,所以卫星表必须有能力存储新的或者变化的各种粒度的数据,它们将被存储在卫星表内。

卫星表是中心表的详细描述内容,一个中心表会有多个卫星表,它由中心表的代理键、装载时间、来源类型、详细的中心表描述信息等组成。

关于数据模型,在实际的场景中会有很多个性化的设计,有时还不得不做一些反模式的设计。

维度建模

我们在进行维度建模的时候会建一张事实表,这个事实表就是星型模型的中心,然后会有一堆维度表,这些维度表就是向外发散的星星。

事实表:

发生在现实世界中的操作型事件,其所产生的可度量数值,存储在事实表中。从最低的粒度级别来看,事实表行对应一个度量事件。

比如是电商平台中的订单表,每条订单就相当于是一个事实,它在表中的体现就是一条记录。

维度表:

每个维度表都包含单一的主键列。维度表的主键可以作为与之关联的任何事实表的外键,当然,维度表行的描述环境应与事实表行完全对应。 维度表通常比较宽,是扁平型非规范表,包含大量的低粒度的文本属性。

比如关于订单表的商品类别表、供应商表等都属于维度表,这些表都有一个唯一的主键,然后在表中存放了相应维度的详细的数据信息。

度量值:

度量值是对一次行为的度量,可以是一个订单的订单金额等。

维度建模是一种十分优秀的建模方式,它有很多的优点,但是我们在实际工作中也很难完全按照它的方式来实现,都会有所取舍。

比如说,为了业务,我们还是会需要一些宽表,有时候还会有很多的数据冗余。

Author: VinxC
Link: https://vinxikk.github.io/2018/06/24/datawarehouse/dw-model/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.