构建数仓的过程中,我们会接触到“星型模型”、“雪花模型”、“星座模型”的概念,对于在这个领域没有相关知识积累的人,可能会感觉到很困惑,今天就对这三个名词进行概念讲解,并简单说一下如何选择,期望大家看完能够有所帮助。
1. 星型模型、雪花模型、星座模型 基础概念
-
星型模型
星型模型是所有维度表都是连接在一个事实表上面,雪花模型是将维度表拆分地更加详细,是多层次的。
在星型模型的维度表里面,一张维度表储存了众多存在冗余的信息,为什么冗余,在哪里冗余,有一个简单的例子:
地域维表 国家a GDP 国家b GDP 国家a 省份a GDP 国家a 省份b GDP 国家a 省份c GDP 国家a 省份a 市级a GDP 国家a 省份a 市级b GDP 国家a 省份a 市级c GDP |
-
雪花模型
在雪花模型的表中,数据是这样存储:
国家表 国家a GDP 国家b GDP 国家a省份表 省份a GDP 省份b GDP 省份c GDP 国家a省份a市表 市级a GDP 市级b GDP 市级c GDP |
这样有一部分信息只需要存储一次,减少了冗余信息。
-
星座模型
星座模型基本上是很多数据仓库的常态,因为很多数据仓库都是多个事实表的。所以星座不星座只反映是否有多个事实表,他们之间是否共享一些维度表。
星座模型并不和前两个模型冲突。
2. 星型模型、雪花模型区别
星型模型 | 雪花模型 | |
特点 | 非正规化; 多维数据集中的每一个维度都与事实表连接(通过主键和外键); 不存在渐变维度; 有冗余数据; 查询效率可能会比较高; 不用过多考虑正规化因素,设计维护较为简单 | 正规化; 数据冗余少; 有些数据需要连接才能获取,可能效率较低; 规范化操作较复杂,导致设计及后期维护复杂; |
3. 模型的选择
首先就是星座不星座这个只跟数据和需求有关系,跟设计没关系,不用选择。星型还是雪花,取决于性能优先,还是避免冗余、灵活更优先。
在实际开发的过程中,不会绝对选择一种,根据情况灵活组合,甚至并存(一层维度和多层维度都保存)。我们可以在数据仓库架构中同时使用这些模型的混合体。比如中间处理层,可以用雪花模型降低冗余度,在数据集市层,采用星型模型方便提取数据,提高查询效率。
整体来看,更倾向于维度更少的星型模型。尤其是hadoop体系,减少join就是减少shuffle,性能差距很大。(关系型数据可以依靠强大的主键索引)
参考资料: