2.2 星型模型和雪花型模型
这里我们只对星型模型和雪花型模型进行介绍,对星座模型不做介绍,毕竟用得太少。
2.2.1 星型模型
星型模型是一种多维的数据关系,它由一个或多个事实表(Fact Table)和一组维表(Dimension Table)组成,所有维表都直接连接到“事实表”上,整个图就像星星一样。每个维表都有一个维作为主键,所有这些维的主键组合成事实表的主键。
事实表的非主键属性(即非维度)称为事实(Fact),它们一般都是数值或其他可以进行计算的数据;而维大都是文字、时间等类型的数据,按这种方式组织好数据,我们就可以按照不同的维(事实表主键的部分或全部)来对这些事实数据进行求和(summary)、求平均(average)、计数(count)、百分比(percent)的聚集计算。这样就可以从不同的角度通过数字来分析业务主题的情况。
星型模型是一种非正规化的结构,多维数据集的每一个维度都直接与事实表相连接,不存在渐变维度,所以数据有一定的冗余,比如在地域维度表中,存在国家A省B的城市C以及国家A省B的城市D两条记录,那么国家A和省B的信息分别存储了两次,即存在冗余。
2.2.2 雪花型模型
当有一个或多个维表没有直接连接到事实表上,而是通过其他维表连接到事实表上时,这个时候的图就像多个雪花连接在一起,故称雪花型模型。
雪花型模型是对星型模型的扩展,它对星型模型的维表进一步层次化,原有的各维表可能被扩展为小的事实表,形成一些局部的“层次”区域,这些被分解的表都连接到主维度表而不是事实表。比如,可以将国家地域维表分解为国家、省份、城市等维表。它的优点是:通过最大限度地减少数据存储量以及联合较小的维表来改善查询性能。雪花型结构去除了数据冗余,但是在进行事实表和维表之间的连接查询时,其效率就比星型模型低了。在冗余可以接受的前提下,实际运用中星型模型使用更多,也更有效率。
2.2.3 星型模型示例
Apache Kylin中采用的模型为星型模型,即事实表与多张维表进行关联。
为了更好地理解,我们拿一张经典的商品销售事实表来进行阐述星型模型,如图2-1所示为商品销售事实表和一组维表。
图2-1
这是一个简单的星型模型的示例,由一张商品销售事实表以及五张维表组成。
事实表里面主要包含两方面的信息:维和度量。维的具体描述信息记录在维表,事实表中的维属性只是一个关联到维表的键,并不记录具体信息;度量一般都会记录事件的相应数值,比如这里的产品的销售数量、销售额等。维表中的信息一般是可以分层的,比如时间维的年月日、地域维的省市县等,这类分层的信息就是为了满足事实表中的度量可以在不同的粒度上完成聚合,比如2016年商品的销售额,来自上海市的销售额等。
事实表里面主要包含两方面的信息:维和度量,维的具体描述信息记录在维表,事实表中的维属性只是一个关联到维表的键,并不记录具体信息;度量一般都会记录事件的相应数值,比如这里的产品的购买数量、实付金额。维表中的信息一般是可以分层的,比如时间维的年月日、地域维的省市县等,这类分层的信息就是为了满足事实表中的度量可以在不同的粒度上完成聚合,比如2016年商品的销售额,来自上海市的销售额,2016年来自上海的销售额等等。销售事实表和时间维度表关联查询如图2-2所示。
图2-2