事实表、维度表、维度、度量
事实表:一般为具有可统计量化的信息的表。如订单表适合作为事实表,其中有订购数量、订单金额等可以被统计和量化的列。
维度表:一般为表示分析的业务角度的表。如商品信息表适合作为维度表,其中有商品类别、商品商标等可以作为分析的业务角度的列。时间表通常作为维度表使用,便于按日 / 周 / 月 / 季 / 年统计业务数据。
维度:一般为可分析的业务角度,如订单日期表示日期维度、商品 ID 表示商品维度。
度量:一般为可统计量化的数值信息,如销售总额、销售总量等。通常为可量化的列与函数一起配合使用,如 SUM、COUNT、TOP_N 等。
Index
索引,在数据加载时将构建索引,索引将被用于加速查询。索引分为聚合索引与明细索引。
- Aggregate Index
聚合索引,本质是多个维度和度量的组合,适合回答聚合查询,比如某年的销售总额。(sum函数等聚合函数) - Table Index
表明细索引,本质是大宽表的多路索引,适合回答精确到记录的明细查询,比如某用户的最近 100 笔交易。(select col1,col2 from a;col1,col2为明细索引)
星型模型:
星型模是一种多维的数据关系,它由一个事实表和一组维表组成。每个维表都有一个维作为主键,所有这些维的主键组合成事实表的主键。强调的是对维度进行预处理,将多个维度集合到一个事实表,形成一个宽表。这也是我们在使用hive时,经常会看到一些大宽表的原因,大宽表一般都是事实表,包含了维度关联的主键和一些度量信息,而维度表则是事实表里面维度的具体信息,使用时候一般通过join来组合数据,相对来说对OLAP的分析比较方便。
雪花模型:
当有一个或多个维表没有直接连接到事实表上,而是通过其他维表连接到事实表上时,其图解就像多个雪花连接在一起,故称雪花模型。雪花模型是对星型模型的扩展。它对星型模型的维表进一步层次化,原有的各维表可能被扩展为小的事实表,形成一些局部的 "层次 " 区域,这些被分解的表都连接到主维度表而不是事实表。雪花模型更加符合数据库范式,减少数据冗余,但是在分析数据的时候,操作比较复杂,需要join的表比较多所以其性能并不一定比星型模型高。
星型模型和雪花模型的优劣对比:
属性 | 星型模型 | 雪花模型 |
---|---|---|
数据总量 | 多 | 少 |
可读性 | 容易 | 差 |
表个数 | 少 | 多 |
查询速度 | 快 | 慢 |
冗余度 | 高 | 低 |
对事实表的情况 | 增加宽度 | 字段比较少,冗余底 |
扩展性 | 差 | 好 |
总结:
通过上面的对比,我们可以发现数据仓库大多数时候是比较适合使用星型模型构建底层数据Hive表,通过大量的冗余来提升查询效率,星型模型对OLAP的分析引擎支持比较友好,这一点在Kylin中比较能体现。而雪花模型在关系型数据库中如MySQL,Oracle中非常常见,尤其像电商的数据库表。在数据仓库中雪花模型的应用场景比较少,但也不是没有,所以在具体设计的时候,可以考虑是不是能结合两者的优点参与设计,以此达到设计的最优化目的。