1、数据仓库分层
ODS(原始数据层):对数据的一个备份。例如从MySQL中导入数据表到HDFS中,只是把MySQL中的表复制一份到HDFS中。
DWD(明细数据层):对ODS层表中的数据进行清洗。例如对表中一些脏数据进行过滤或不符合指标的数据进行过滤。
DWS(服务数据层):以DWD层数据为基础,进行汇总。例如一个用户的当日收藏数初步统计。
ADS(数据应用层):一般情况下,以DWS为基础,或其他层级的表数据为基础,为各种指标统计报表提供数据。
对于各个层级表的命名都是以ods、dwd、dws、ads为前缀。
总结:
ODS、DWD、DWS、ADS每层都有表来存储要维护的数据。前边的层级中的数据为下一层做铺垫,通过SQL转化成MR进行计算,最后得出想要的数据报表。
2、数据仓库表的分类
首先分为2大类,维度表和事实表。维度表又分为实体表和维度表;事实表又分为事务性事实表和周期性事实表。
实体表:实体对象。例如用户,商品,店家等。
维度表:业务状态,状态的码表,类似于字典表。例如订单状态分为未发货、已发货、未收货、已收货;商品分类分为一级分类、二级分类、三级分类。
事务性事实表:一旦发生不再改变。例如交易流水,操作日志。
周期性事实表:随业务不断产生的数据周期性的变化。例如订单状态,分为未发货——已发货——未收货——已收货——已完成。
那么数据同步策略是如何呢?
实体表 ——> 每日全量同步
维度表 ——> 每日全量同步
事务性事实表 ——> 每日增量同步
周期性事实表 ——> 每日新增或修改的数据进行同步,制作拉链表
维度表:只能是事实表的一个分析角度。
事实表:表里没有存放实际的内容,它是一堆主键的集合,这些ID分别能对应维度表中的一条记录。
(维度表之间的中间表) 事实表的度量值通常是数值类型(条/个/次)
事实表行对应一个度量事件。
缓慢变化维:随时间的变化维度属性也发生变化。
直接覆盖、增加维度行、增加维度属性列、增加微型维度
拉链表:
对于每个订单,每条订单数据每天都会发生变化,对于hive数仓来说,数据变化是对表的插入。若每日去对新增或修改的数据进行同步的话,对文件存储系统来说,会存在很大的隐患的,那怎么办呀?
这就引入了拉链表,那么什么是拉链表呢?今天我们就说说拉链表,它是对新增或变化的数据进行定期合并。例如我3日下了一个订单它的状态是未发货,那么4日的状态是已发货,6号的时候我收到货了,就对6号我的这个订单的数据进行同步,有了拉链表我们只需要同步一条数据,就是同步这条订单的最终状态 。要不然的话就会同步4条数据,你们想想,一个订单就同步4条数据,那么10万条呢?是不是浪费文件系统的存储资源,所以这种场景最适合拉链表了。
3、数据库三范式
第一范式:属性不可分割;
第二范式:不存在部分函数依赖;
第三范式:不存在传递性函数依赖;
4、关系建模和数仓的维度建模
关系建模:主要应用与OLTP系统中,为了保证数据的一致性以及避免冗余,所以大部分业务系统的表都遵循第三范式。
维度建模:主要分为星型模型、雪花模型、星座模型。
星型模型:维度表只有一层。
雪花模型:维度表有多层。
星座模型:星座模型与前两种的区别在于事实表的数量,星座模型是基于多个事实表。
数据仓库尽量做成星型模型,要不然还要对它们进行降维。
最后抛出一个问题,请大家留言:
为什么维度建模要设计成宽表,而关系模型要把表设计成不可划分的也就是遵循三范式?