数据仓库的星型模型和雪花型模型

最近在一次采访中被问到星星模型和雪花模型,然后我说星座模型是雪花模型...为了巩固这方面的知识,我决定写一篇文章记录下来。

星形模型、雪花模型和星座模型是数据仓库维度建模中的三种重要模型。接下来,我们来说说他们的特点,以及他们之间的关系。

星型模型由一个事实表和几个维度表组成。事实表包括维度表的所有主键(一般是id),以及其他没有放入维度表的内容;维度表存储对应维度的详细信息。

以一个购买表为例。它主要需要记录以下信息:

因为用户、商品、店铺都有自己的详细信息,如果都放到购买表中,会造成很大的冗余,后期很难维护。(想象一下如果用户稍后需要添加字段)所以这个时候,你可以选择星型模型把这些细节放在维度表中,而作为事实表的购买表只保留用户id、商品id、商店id和购买时间。(购买时间不能分维度,所以还是在事实表里。)

整体模型结构如下图所示:

您可以看到有一个事实表和三个维度表,用户、商品和商店。当所有维度表都与事实表相连时,整个模型的形状就像一个星形,所以称为星形模型。

在星型模型中,维度表包含维度的所有信息。因为没有层次结构,所以维度表中可能存在冗余。

为了减少维度表的冗余,此时可以使用雪花模型。雪花模型在星型模型的基础上,进一步拆分维度表中的一些字段,减少冗余,使其更具层次性。

以之前的购买表为例。假设商店表中有几个字段存储着商店的位置信息:{省,市,具体位置}。这时我们可以看到,这些字段实际上可以属于“省”的属性,所以我们可以将这些字段拆分,形成一个新的维度表“省”。该维度表与商店维度表相连接,而不是与事实表本身相连接。从某种角度来说,雪花模型拆分维度表的过程和星型模型拆分事实表的过程有些类似。

对于采购表,拆分雪花模型如下所示:

在这里,您可以看到有一个新的维度表。当维度表比较多的时候,可以看到整个模型图会像雪花一样展开,所以这个模型叫做雪花模型。

星座模型是星型模型的扩展(可以看作是拥有多个版本事实表的星型模型)。其特点之一是多个事实表共享模型中的维度表,适用于比星型模型和雪花型模型更复杂的场合。

之前我把星座模型和雪花模型搞混的原因之一是它们在形状上有些相似。从图形化的角度来看,每个事实表都可以看作是一颗星。如果一个星座中有多颗星,那么就需要有多个事实表。雪花模型可以理解为从雪花的中心不断向外扩展的形状(事实表)。如果你这样记住它们,你就不会再把它们弄混了。