【数据研发】数据仓库的一些基础知识分享
【数据研发】数据仓库的一些基础知识分享
6Young数据仓库
概念模型、逻辑模型、物理模型
概念模型是面向业务的,可以用E-R图进行构建,比如我们在一个水果网购的业务中,就需要考虑到需要有一个客户的实体,然后订单实体,商家实体,然后考虑这些实体之间的对应关系。
逻辑模型也是面向业务的,是在概念模型上的进一步丰富,这一步就是给各个实体添加详细的信息,比如联系人需要他的昵称、联系方式,地址等信息。就是把概念模型中的实体抽象为一个个数据表。
最后的物理模型是面向技术实现层面的,我们需要考虑各个字段的变量类型,具体的各个表之间的外键链接以及约束关系等等数据库实现方面的要素。
数据仓库的主要特征
数据仓库是面向主题的(Subject-Oriented )、集成的(Integrated)、稳定的(Non-Volatile)和时变的(Time-Variant )数据集合,面向数据分析,用以支持管理决策。
主题性:不同于传统数据库对应于某一个或多个项目,数据仓库根据使用者实际需求,将不同数据源的数据在一个较高的抽象层次上做整合,所有数据都围绕某一主题来组织。
集成性:数据仓库中存储的数据是来源于多个数据源的集成,原始数据来自不同的数据源,存储方式各不相同。要整合成为最终的数据集合,需要从数据源经过一系列抽取、清洗、转换的过程。
稳定性:数据仓库中保存的数据是一系列历史快照,不允许被修改。用户只能通过分析工具进行查询和分析。这里说明一点,数据仓库基本上是不许允许用户进行修改,删除操作的。大多数的场景是用来查询分析数据。
时变性:数据仓库会定期接新的集成数据,反应出最新的数据变化。这和稳定特点并不矛盾。
数据仓库和数据库的区别?
从目标、用途、设计来说
- 数据库是面向事务处理的,数据是由日常的业务产生的,并且是频繁更新的;数据仓库是面向主题的,数据来源多样化,经过一定的规则转换得到的,用于分析和决策。
- 数据库一般用来存储当前事务性数据,如交易数据;数据仓库一般存储的是历史数据,用于对数据进行分析。
- 数据库设计一般符合三范式,有最大的精确度和最小的冗余度,有利于数据的插入;数据仓库设计一般不符合三范式,有利于查询。
数据库与数据仓库的区别本质是 OLTP 与 OLAP 的区别。
数据仓库的出现,并不是要取代数据库。数据库是面向事务的设计,数据仓库是面向主题设计的。数据库一般存储业务数据,数据仓库存储的一般是历史数据。
数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
数据库是为捕获数据而设计,数据仓库是为分析数据而设计。数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它决不是所谓的“大型数据库”。
数据仓库最重要的是什么
个人认为是数据集成和数据质量
企业的数据通常存储在多个异构数据库中,要进行分析,必须对数据进行一致性整合,整合后才能对数据进行分析挖掘出潜在的价值;
数据质量必须有保障,数据质量不过关,别人怎么会使用你的数据?
为什么要进行数据仓库建模
- 性能:良好的模型能帮我们快速查询需要的数据,减少数据的IO吞吐
- 成本:减少数据冗余、计算结果复用、从而降低存储和计算成本
- 效率:改善用户使用数据的体验,提高使用数据的效率
- 改善统计口径的不一致性,减少数据计算错误的可能性
如何控制数据质量
- 校验机制,每天对比数据量,比如count(*),早发现,早修复
- 数据内容的比对,抽样对比
- 复盘、每月做一次全量
元数据
怎么理解元数据
狭义来讲,元数据就用来描述数据的数据。
广义来讲,除了业务逻辑直接读写处理的业务数据,所有其他用来维护整个系统运转所需要的数据,都可以认为是元数据。
在数仓中,元数据可以帮助数仓人员方便找到他们所关系的数据,是描述数仓内部数据的结构和建立方法的数据。按照用途可分为:技术元数据、业务员数据
技术元数据:存储关于数据仓库技术细节的数据,用于开发和管理数仓使用的数据
业务元数据:从业务角度描述了数据仓库中的数据,提供介于使用者和实际系统之间的语义层,使不懂计算机技术的业务人员也能读懂数仓中的数据
四种常见模型
维度模型
星型模型:星型模型主要是维表和事实表,以事实表为中心,所有维度直接关联在事实表上,呈星型分布。
雪花模型:雪花模型,在星型模型的基础上,维度表上又关联了其他维度表。这种模型维护成本高,性能方面也较差,所以一般不建议使用。
星座模型:星座模型是很多数据仓库的常态,因为很多数据仓库都是多个事实表的。所以星座模型只反映是否有多个事实表,他们之间是否共享一些维度表
范式模型
从全企业的高度设计一个3NF模型,用实体加关系描述的数据模型描述企业业务架构,在范式理论上符合3NF。
范式化的表减少了数据冗余,数据表更新操作快、占用存储空间少。反范式的过程就是通过冗余数据来提高查询性能,但冗余数据会牺牲数据一致性。
个人感觉本质就是关系型数据库。
Data Vault模型
- DataVault由Hub(关键核心业务实体)、Link(关系)、Satellite(实体属性) 三部分组成 ,是Dan Linstedt发起创建的一种模型方法论,它是在ER关系模型上的衍生,同时设计的出发点也是为了实现数据的整合,并非为数据决策分析直接使用。
Anchor模型
- 高度可扩展的模型,所有的扩展只是添加而不是修改,因此它将模型规范到6NF,基本变成了K-V结构模型。企业很少使用。
OLAP
OLAP&OLTP
联机事务处理 OLTP(On-Line Transaction Processing,),也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理,像Mysql,Oracle等关系型数据库一般属于OLTP。
分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing)一般针对某些主题的历史数据进行分析,支持管理决策。
OLAP的操作
维度建模过程
1、选择业务过程
维度建模是紧贴业务的,所以必须以业务为根基进行建模,那么选择业务过程,顾名思义就是在整个业务流程中选取我们需要建模的业务,根据运营提供的需求及日后的易扩展性等进行选择业务。比如商城,整个商城流程分为商家端,用户端,平台端,运营需求是总订单量,订单人数,及用户的购买情况等,我们选择业务过程就选择用户端的数据,商家及平台端暂不考虑。业务选择非常重要,因为后面所有的步骤都是基于此业务数据展开的。
2、声明粒度
先举个例子:对于用户来说,一个用户有一个身份证号,一个户籍地址,多个手机号,多张银行卡,那么与用户粒度相同的粒度属性有身份证粒度,户籍地址粒度,比用户粒度更细的粒度有手机号粒度,银行卡粒度,存在一对一的关系就是相同粒度。为什么要提相同粒度呢,因为维度建模中要求我们,在同一事实表中,必须具有相同的粒度,同一事实表中不要混用多种不同的粒度,不同的粒度数据建立不同的事实表。并且从给定的业务过程获取数据时,强烈建议从关注原子粒度开始设计,也就是从最细粒度开始,因为原子粒度能够承受无法预期的用户查询。但是上卷汇总粒度对查询性能的提升很重要的,所以对于有明确需求的数据,我们建立针对需求的上卷汇总粒度,对需求不明朗的数据我们建立原子粒度。
3、确认维度
维度表是作为业务分析的入口和描述性标识,所以也被称为数据仓库的“灵魂”。在一堆的数据中怎么确认哪些是维度属性呢,如果该列是对具体值的描述,是一个文本或常量,某一约束和行标识的参与者,此时该属性往往是维度属性,数仓工具箱中告诉我们牢牢掌握事实表的粒度,就能将所有可能存在的维度区分开,并且要确保维度表中不能出现重复数据,应使维度主键唯一
4、确认事实
事实表是用来度量的,基本上都以数量值表示,事实表中的每行对应一个度量,每行中的数据是一个特定级别的细节数据,称为粒度。维度建模的核心原则之一是同一事实表中的所有度量必须具有相同的粒度。这样能确保不会出现重复计算度量的问题。有时候往往不能确定该列数据是事实属性还是维度属性。记住最实用的事实就是数值类型和可加类事实。所以可以通过分析该列是否是一种包含多个值并作为计算的参与者的度量,这种情况下该列往往是事实。
数据仓库之ETL
建立OLAP应用之前,我们要想办法把各个独立系统的数据抽取出来,经过一定的转换和过滤,存放到一个集中的地方,成为数据仓库。这个抽取,转换,加载的过程叫ETL(Extract, Transform,Load),目的是将企业中分散、零乱、标准不统一的数据整合到一起。
抽取
抽取的数据源分为结构化数据、非结构化数据,半结构化数据。结构化一般采用JDBC、数据库日志方式,非结构或半结构化数据会建通文件变动。
抽取方式:全量抽取:适用于数据量小且不容易判断其数据发生改变的诸如关系表,维度表,配置表等,一般用于初始化数据。增量抽取:适用于数据量大,为了节省抽取时间而采用的抽取策略,一般用于数据更新
清洗
空值处理:将空值替换为特定值或直接过滤掉
验证数据正确性:把不符合业务含义的数据做统一处理
规范数据格式:比如把所有日期都规范成YYYY-MM-DD的格式
数据转码:把一个源数据中用编码表示的字段通过关联编码表转换成代表其真实意义的值
数据标准统一:比如在源数据中表示男女的方式有很多种,在抽取的时候直接根据模型中定义的值做转化。(主要是针对非结构化或半结构化数据)
转换和加载
转换:用ODS中的增量或者全量数据来刷新DW中的表
加载:每insert数据到一张表都可以称为数据加载,就是将处理完的数据导入到对应的目标源里
全量同步与增量同步
当一个数据需要存储多份时,会出现一致性问题,所以就需要进行同步与备份,根据备份时的目标数据,我们可以分为增量和全量,以及结合两者优缺点的一个折中方案——差异备份。