一:数据库的诞生背景
互联网已经高速发展了很多年,各大企业都根据自己的业务搭建了自己的门户网站,拥有自己的服务器,以及自己的用户。用户在对企业的服务进行交互访问时,用户给企业反馈的信息去哪里了?比如说我们最常见的注册信息,企业给到我们的资源从哪里来的?比如说最常见的商品列表。其实这些数据都存放在企业级的数据库当中,离开了数据库,在优秀的架构设计,在优秀的代码都是没有灵魂的。目前企业主流的数据一般分为关系型数据库和非关系型数据库,常见的关系型数据库:mysql,oracle,sqlserver等,常见的非关系型数据库:redis,hbase,mongodb等。数据库的存在,其主要作用是满足在用户和企业服务交互时,满足低时延的增删改查操作。
二:数据仓库的诞生背景
大数据,数据赋能这些词近些年来在it圈子火起来了。其实大数据的概念很早就有人提出来了,很早就有人发现,数据会说话,但是由于当时的计算机的硬件条件限制,处理海量数据的框架也不成熟,数据的发展受到限制。近几年迎来了hadoop时代,以及伴随着整个hadoop生态圈其它框架的发展,包括离线的和实时的,让更多的企业可以用廉价的机器进行横向扩展来满足海量数据的计算要求,优秀的开源框架可以让企业以更少的人力成本高效管理和使用数据。海量数据想要真正使用起来,能让其给企业带来收益,我们就需要给数据制定规范,这时数据仓库就诞生了。
三:数据仓库的建设意义
企业要建立自己的数据仓库和数据集市,一般来讲最主要的目的是为了给上层数据应用产品提供强有力的数据支撑。当然对一个是否合理的数据仓库检验的标准不外乎以下这几点:
- 性能
一个良好的数据仓库能够帮助我们快速查询所需要的数据,减少数据的I/O成本。可能对于刚入数据仓库这行的人来说,这点有点难以理解,所以加以解释:之前提到过数据仓库是支撑上层BI应用的,这些应用可能涵盖了成百上千的指标,那么我们在对这些指标进行ETL的时候,如果都从最原始的数据去加工(即从生产系统同步过来的ods层数据),那么这个加工逻辑是非常复杂的,难以维护,肯定是存在计算逻辑重复,那么我们要改善这一点,在数据仓库里面其实就是建立数据模型,进行分层,将共有逻辑进行抽象下沉(非本文重点),这样就可以避免计算重复的逻辑,即减少数据的I/O成本。 - 成本
在数据仓库的世界里,成本不外乎计算成本,存储成本,一个好的数据仓库模型,即能满足低计算成本的前提下,减少不必要的数据冗余带来的存储开销,不必要这个词很关键,并不是说完全不冗余,合理的冗余可以带来较好的计算速率,比如说退化纬度,整合多个事务过程的大宽表等等。 - 效率
良好的数据模型能极大的改善用户使用数据的体验,提高使用数据的效率。一个优秀的数据仓库模型设计,对于上层用户可以将ods,dwd,dws层都黑盒封装起来,暴露出ads层(应用数据层)的数据给用户使用,用户不用在乎底层数据的实现,这样就可以屏蔽了底层复杂的逻辑,让上层用户方便使用。 - 质量
良好的数据模型能改善数据统计口径不一致的问题,减少数据数据计算错误的可能性。
四:如何建设数据仓库
大概仓库模型见下图:
一套科学的数据仓库建模,需要强有力的理论支撑,本文主要以kimball的建模理论进行阐述。大概的建模步骤可以分为:
需求调研-》业务调研-》划分数据域-》构建指标体系-》加工dim层-》ods层-》dwd层-》dws层-》ads层(数据集市),以上非本文重点,简要描述下分层模型。
dim层
该层为纬度层,主要目的是加工成型一些纬度表,纬度表是整个数据仓库建设的核心。可以从各个业务线的数据库当中加工得到,一般构建步骤如下:
- 确定主纬表
- 确定从纬表
- 确定纬度表属性
- 规范化和反规范化
- 特殊纬度和事实性纬度的处理
ods层
线上生产系统所使用的数据库:mysql,hbase,oracle,sqlserver等,我们需要将其数据单独抽取到我们数据仓库的ods层(操作数据层),ods层数据是整个数据建设的基石,要保证数据的可靠性,要尽可能避免出现以下情况:
1.数据缺失
2.数据不准确(与线上业务系统不匹配)
3.字段命名应该达到统一规范定义(多业务线为了满足自身的需求,往往很难做到命名统一)
4.字段类型的规范统一
5.度量单位的统一
6.应该将每个字段都写上注释,特别是带有枚举的字段
7.库表名的命名要规范,每个企业可能都不太一样,但是要做到见名知意
dwd层
dwd层的数据表往往是一些整合了多个业务过程的一些大宽表,根据一张表存放的业务过程来划分,又有单事务事实表和多事务事实表的区分,根据事实描述方式的不同,又可以分为事务型事实表和累积型快照事实表。dwd的数据往往从ods层加工得来,为的就是方便计算多个事务过程存在联系的指标。
dws层
该层的意义主要是为了计算一些带有汇总含义的指标,比如说最近一个月的销售额,所以主要是加工一些周期型快照事实表,关于这个周期可以是一个小时,一天,一个星期,一个月等等都可以,但是要根据实际的业务需求来。
ads层
应用数据层已经是对整个数据仓库的最高度抽象,一般来讲该层建设紧贴上层应用,也是直接服务于上层业务的,对于数据的使用人员,直接使用ads层的数据就可以了,完全不用理会底层的数据情况,不同的业务线可以建设自己的数据集市,但是这些数据的来源都离不开整个数据仓库的建设。
纯手打,喜欢给个赞,争取以后多多创作!