在维度建模的基础上,数据模型又分为三种:星形模型、雪花模型与星座模型,其中最常用的是星形模型。
星形模型中有一张事实表,以及0个或多个维度表,事实表与维度表通过主键外键相关联,维度表之间没有关联。当所有维度表都直接连接到事实表上时,整个图解就像星星一样,故将该模型称为星形模型,如图6-3所示。星形模型最简单,也是最常用的模型。由于星形模型只有一张大表,因此相对于其他模型更适合于大数据处理,而其他模型也可以通过一定的转换,变为星形模型。星形模型是一种非正规化的结构,多维数据集的每一个维度都直接与事实表相连接,不存在渐变维度,所以数据有一定的冗余。例如,在地域维度表中,存在国家A省B的城市C,以及国家A省B的城市D两条记录,那么国家A和省B的信息分别存储了两次,即存在冗余。
图6-3 星形模型建模示意
当有一张或多张维度表没有直接连接到事实表上,而是通过其他维度表连接到事实表上时,其图解就像多个雪花连接在一起,故称为雪花模型。雪花模型是对星形模型的扩展。它对星形模型的维度表进一步层次化,原有的各维度表可能被扩展为小的事实表,形成一些局部的“层次”区域,这些被分解的表都连接到主维度表而不是事实表上,如图6-4所示。雪花模型的优点是通过最大限度地减少数据存储量,以及联合较小的维度表来改善查询性能。雪花模型去除了数据冗余,比较靠近第三范式,但是无法完全遵守,因为遵守第三范式成本太高。
图6-4 雪花模型建模示意
星座模型与前两种模型的区别是事实表的数量,星座模型是基于多张事实表的,且事实表之间共享一些维度表。星座模型与前两种模型并不冲突。如图6-5所示,即为星座模型的一个示例。星座模型基本上是很多数据仓库的常态,因为很多数据仓库都有多张事实表。
图6-5 星座模型建模示意
三种模型对比来看,星形模型因为数据存在很大冗余,所以很多查询不需要与外部表进行连接查询,因此一般情况下效率比雪花模型要高。星形模型不用考虑很多正规化因素,所以设计与实现都比较简单。雪花模型由于去除了冗余,有些统计就需要通过表的连接才能完成,效率也比较低。
通过对比,我们可以看出数据仓库大多时候是比较适合使用星形模型构建底层Hive数据表的,大量数据的冗余可以减少表的查询次数,提升查询效率。星形模型对于OLAP系统是非常友好的,而雪花模型更常用于关系型数据库中。目前在企业实际开发过程中,不会只选择一种,而是根据情况灵活组合,甚至并存(一层维度和多层维度都保存)。但是从整体来看,企业更倾向于选择维度更少的星形模型。尤其是Hadoop体系,减少join就是减少中间数据的传输和计算,性能差距很大。