前言

提到数据建模,接触过数仓的同学很容易就能说出:关系模型(Inmon)和维度模型(Kimball)。如果要去细究这两种模型具体有什么区别的时候,就有点说不清楚了。我还特意去找了《数据仓库》这本书的相关章节,感觉内容比较晦涩,估计看的也不是很明白。

这里我结合自己实践和理解,尝试用 一个业务场景 + 两张图 的方式描述一下两种模型之间的区别,供大家参考。

一个业务场景

以电商场景中用户购物为例,主要涉及三类数据:

  • 用户 用户 ID、性别、地区和姓名等;

  • 商品 商品 ID、类型、厂家和名称等;

  • 订单 订单 ID、用户 ID和商品 ID等;

分析需求:

  • 按性别统计用户的购物情况
  • 按地区统计用户的购物情况
  • 按类型统计商品的出售情况
  • 按厂家统计商品的出售情况

我们分别使用关系模型和维度模型来看一下:数据是如何存取的和需求是如何实现的。

两张图

关系模型和维度模型之间的主要区别体现在 数据组织形式 的不同。

关系模型

用户表和性别表、地区表之间分别使用性别 ID、地区 ID 建立连接。 商品表和类型表、厂家表之间分别使用类型 ID、厂家 ID 建立连接。 订单表和用户表、商品表之间分别使用用户 ID、商品 ID 建立连接。

这些 ID 被称之为 外键,数据表之间通过 外键 建立关联关系。

如果要按性别统计用户的购物情况,需要 连接 查询订单表、用户表和性别表。 如果要按地区统计用户的购物情况,需要 连接 查询订单表、用户表和地区表。 如果要按类型统计商品的出售情况,需要 连接 查询订单表、商品表和类型表。 如果要按厂家统计商品的出售情况,需要 连接 查询订单表、商品表和厂家表。

维度模型

订单表和用户表、性别表、地区表、商品表、类型表和厂家表之间通过 外键 建立关联关系,订单表被称之为 事实表,其它表被称之为 维度表

如果要按性别统计用户的购物情况,直接查询订单表。 如果要按地区统计用户的购物情况,直接查询订单表。 如果要按类型统计商品的出售情况,直接查询订单表。 如果要按厂家统计商品的出售情况,直接查询订单表。

可以看出,维度模型的订单表相比于关系模型的订单表 冗余 存储了额外的性别 ID、地区 ID、类型 ID和厂家 ID,虽然需要使用更多的 存储空间,但是查询的时候可以直接得出结果,节省了数据表之间的 连接开销

维度模型可以细分为 星型模型(如上图)、雪花模型星座模型,雪花模型相比于星型模式,维度表之间可以有关联关系;星座模型相比于星型模型,可以有多张事实表。

结语

关系模型和维度模型之间没有绝对的好坏之分,业务复杂的场景下,更多的是理论参考,严格按照模型定义去实践的意义不大,有时候整合应用的效果也是不错的。

results matching ""

    No results matching ""