数据仓库设计
前言
数据仓库一般针对 olap(在线分析处理)的业务,olap和oltp参考https://my.oschina.net/u/2969788/blog/2875200,重点用于处理大规模数据集的分析工作,通常的操作只有添加和查询,不会涉及到严格事务要求和实时的并发操作.
数据库的设计一般是针对 oltp业务,即在线事务处理,要求事务的一致性和实时性以及并发访问
数据仓库的设计的目的
- 屏蔽底层逻辑,可以简单 完整的提供业务数据给应用层使用
- 解耦底层逻辑与应用层逻辑
- 清楚的管理数据血缘关系
数据仓库分层
数据仓库有很多分层的方式,但是都大同小异, 分层的目的是为了让数据仓库的结构更清晰,也是通过分层来实现我们数据方库设计的目的,我们希望数据能够有层次,有规律的合理的分布在我们的磁盘上,并且能够优雅的应对各种业务场景的需求.
两种常见的层次划分
- 第一种,数据明细和数据汇总层为上下游关系
- 第二种,数据明细层和数据汇总层平行
具体选择,需要根据每个数据仓库的业务场景进行抉择,或者来说 没有严格意义上的分层,只是为了让逻辑跟清晰,如果dm 数据集市里面需要,数据明细层表中的数据,那么则将数据明细表开放给dm也无妨,
各数据层简介
命名规则和存储格式
- 命名规则建议统一使用, 层级_主题__表内容_分区规则 的命名方式
- stg/ods/dwd/dws 存储格式 parquet,有利于MapReduce计算
相关概念
数据库设计三范式 3nf 直白的说明
- 列原子性,列为最小属性不可拆分
- 行唯一性 一个表里面的每一行都是唯一不能重复
- 数据库内不允许冗余字段(列)
事实表和维度表
事实表是记录事实记录的表(md -_-! 写的有些绕口),通常包含很多行,每一列大多为客观数值或者维度表的外键,比如说 淘宝交易记录表,里面包含了 交易的时间 金额 数量 这些都是客观事实,还有包括 用户账号 商品id 支付手段id 等这些都是维度表的外键
维度表反映的事物的维度,通常不会包含很多列,只会记录维度信息, 通常以dim前缀命名,维度表饱含了事实表中属性的详细信息,比如商品属性,客户的属性等等,
星型模型和雪花模型 通常在设计dm数据集市层的时候要考虑这两种模型
星型模型是一种不完全符合3nf的模型,通常为一个事实表关联多个维度表,维度表不在关联其他维度表,好处是查询可以减少join,坏处是冗余了一部分数据,类似于下图
雪花模型通常是一张事实表会关联多张维度表但是维度表还可能关联其他维度表,这样好处是减少了数据冗余,坏处是查询的时候可能join表太多,雪花模型更符合3nf一些,但是二者的选择要结合具体业务来看,雪花模型如下图
宽表和窄表
宽表顾名思义就是一张非常宽的表,通常包含多个维度字段和很多事实数据,宽表通常是在数据汇总层dws,宽表设计要考虑到尽可能的覆盖业务范围,通常一张表要包含全部业务需要的汇总字段,宽表是对事实表的丰富,如果事实表包含汇总信息的话就叫做汇总表
宽表不符合3nf,宽表的设计是为了服务于olap业务,尽量一张表满足全部查询需求,宽表一般只包含插入和查询操作,窄表不是为了oltp业务服务,要去符合3nf,通过表之间的关联反映业务逻辑