一、概念
宽表:把多个维度的字段都放在一张表存储,增加数据冗余是为了减少关联,便于查询,查询一张表就可以查出不同维度的多个字段。
窄表:和我们MySql普通表三范式相同,把相同维度的字段组成一张表,表和表之间关联查询其他维度数据。
维度表:包含维度编码和该维度下的多个属性。
事实表:包含一个业务事件的相关属性。
二、宽表
2.1 宽表概念
宽表,顾名思义,就是比普通的数据表宽的表,比如数据库表一,在数据库中是五个字段,表二是四个字段,宽表就是把这两个有业务联系的表通过关联字段弄到一个大表中,这样列数自然就变多了,表也就宽了,所以就有了宽表。
2.2 为什么要用宽表
业务人员在做数据分析时,所需要的数据往往会存储在数据库的多张数据表中,比如订单表中存储了订单编号、商品编号、订购日期等,商品表中存储了商品名称、单价等商品信息,如果要同时查看订单和商品信息,业务人员不知道数据结构,也很难做表间关联,所以就要技术人员将两个表提前关联好形成宽表。
在olap技术发展过程中主要有MOLAP和ROLAP两种形式,MOLAP中的数据文件通常叫做“CUBE”,这个名字大家都比较熟悉了,一般是各个olap产品自己的数据文件格式。而随着数据库性能的提升,ROLAP 产品逐渐流行起来(本文后续用到的产品润乾报表就是一个典型的 ROLAP 产品),ROLAP 中数据保留在关系数据库的事实表中,在使用用途上来说宽表约等于 CUBE。
通过宽表的使用,既能解决多维分析时多表的关联问题又能提高数据查询的速度和分析操作的便捷性。
2.3 宽表的生成
要基于上述业务表生成如下宽表,用来分析销售数据:
此时业务数据通常来自同一个数据库,那么可以直接通过一个 sql 语句生成:
CREATE TABLE oders_analyse AS (SELECT o.orderid,
o.amount,
o.discount,
p.proname,
p.price,
b.typename,
s.sipname,
s.linkname,
k.stockamount FROM
orders o
LEFT JOIN
product p ON o.proid = p.proid
LEFT JOIN
proctype b ON p.protype = b.typeid
LEFT JOIN
supplier s ON p.supid = s.supid
LEFT JOIN
stock k ON o.proid = k.proid)
如果是异构数据库,那么还需要 ETL 工具进行处理。