数据仓库
什么是数据仓库
数据仓库(Data Warehouse)是一个面向主题的、集成的、稳定的且随时间变化的数据集合,用于支持管理人员的决策
基础知识
- 事实表
事实表是指保存了大量业务数据的表,或者说保存了一些真实的行为数据的表。例如:销售商品所产生的订单数据。 - 维度表
维度指的就是一个对象的属性或者特征,例如:时间维度,地理区域维度,年龄维度这是维度的概念。维度表里面存放的其实就是刚才所说的那些维度相关的信息。例如:商品表。 - 数据库三范式
- 第一范式(1NF):数据库表的每一列都是不可分割的原子数据项。
不满足
学生ID | 姓名 | 性别 | 地址 |
001 | 王小慕 | 男 | 北京市朝阳区望京街10号 |
满足
学生ID | 姓名 | 性别 | 省份 | 城市 | 街道 |
001 | 王小慕 | 男 | 北京市 | 朝阳区 | 望京街10号 |
- 第二范式(2NF):在满足1NF的基础上,数据库表中每一列都和主键相关,不能只和主键的某一部分相关(针对联合主键而言)。
不满足 因为分数依赖于学生ID和课程,但是班级和班主任只依赖于学生ID
学生ID | 班级 | 班主任 | 课程 | 分数 |
001 | 计科1 | 王小慕 | 2001 | 98 |
满足
学生ID | 班级 | 班主任 |
001 | 计科1 | 王小慕 |
学生ID | 课程 | 分数 |
001 | 2001 | 98 |
- 第三范式(3NF):在满足地2NF的基础上,要求一个数据库表中不包含已在其它表中包含的非主键字段,针对刚才满足第二范式的表,其实还可以进行拆分,班主任可以有班级推导出来。
满足
学生ID | 班级 | 班主任 |
001 | 计科1 | 王小慕 |
班级 | 班主任 |
计科1 | 王小慕 |
学生ID | 课程 | 分数 |
001 | 2001 | 98 |
- 星型模型vs雪花模型
对于雪花模型,维度表的设计更加规范,一般符合3NF;而星型模型,一般采用降维的操作,利用冗余来避免模型过于复杂,提高易用性和分析效率
冗余:雪花模型符合业务逻辑设计,采用3NF设计,有效降级数据冗余;星型模型的维度表设计不符合3NF,反规范化,维度表之间不会直接相关,牺牲部分存储空间。
性能:雪花模型由于存在维度间的关联,采用3NF降低冗余,通常在使用过程中,需要连接更多的维度表,导致性能偏低;星型模型违反3NF,采用降维的操作将维度整合,以存储空间为代价有效降低维度表连接数,性能比雪花模型高。
实际工作中多采用星型模型,尽可能的多构建一些宽表,以提高数据的查询性能和方便查询。
数据仓库分层设计
- ODS层:原始数据层,数据源中的数据,采集过来之后,原样保存。
- DWD层:明细数据层,这一层是对ODS层的数据进行清洗,解决一些数据质量问题和数据的完整度问题。
- DWS层:这一层是对DWD的数据进行轻度聚合汇总,生成一系列的中间表,提升公共指标的复用性,减少重复加工,并且构建出来一些宽表,用于提供后续的业务查询。
- APP层,根据业务需要,由前面三层的数据统计而出的结果,可以直接提供查询展现,一般会把APP层的数据导出到MySQL中供线上系统使用,提供报表展示,数据监控及其它功能。也可以称为DM层。
DWD层对数据进行清洗的时候,一般需要遵循以下原则:
- 数据唯一性校验(通过数据采集工具采集的数据会存在重复的可能性)
- 数据完整性教研(采集的数据中可能会出现缺失字段的情况,针对缺失字段的数据建议直接丢掉,如果可以确定是哪一列缺失也可以进行补全,可以用同一列上的前一个数据来填补或者同一列上的后一个数据来填补)
- 数据合法性校验-1(针对数字列中出现了null,或者-之类的异常值,全部替换为一个特殊值,例如0或者-1,这个需要根据具体的业务场景而定)
- 数据合法性校验-2(针对部分字段需要校验数据的合法性,例如:用户的年龄,不能是负数)
典型的数据仓库系统架构
下图是一个典型的企业数据仓库系统,通常包含数据源,数据存储与管理,数据的访问三个部分。在实际工作中,数据仓库分为离线数据仓库和实时数据仓库