数据仓库笔记
数据仓库的作用
数据仓库的特点
- 数据仓库中的数据是面向主题的
- 数据仓库中的数据是集成的
- 数据仓库中的数据是不可更新的
- 数据仓库中的数据是随时间不断变化的
数据仓库的发展历程
- 简单报表阶段: 生成简单报表和汇总数据帮助领导决策
- 数据集市阶段: 根据业务部门需要
- 数据仓库阶段: 根据数据模型, 采集和整理数据, 为各个业务部门提供跨部门且一致的数据报表, 生成对业务有指导意义的数据, 为领导决策提供全面的数据支持.
通过数据仓库建设的发展阶段,我们能够看出,数据仓库的建设和数据集市的建设的重要区别就在于数据模型的支持。因此,数据模型的建设,对于我们数据仓库的建设,有着决定性的意义。
数据库与数据仓库的区别
数据库软件
是一种软件,可以看得见,可以操作。用来实现数据库逻辑功能。属于物理层.
数据库
是一种逻辑概念,用来存放数据的仓库。通过数据库软件来实现。数据库由很多表组成,表是二维的,一张表里可以有很多字段。字段一字排开,对应的数据就一行一行写入表中。
数据仓库
数据库概念的升级.从逻辑上来说与数据库没有区别, 都是通过数据库软件实现的存放数据的地方, 但是从数据量来说, 数据仓库要比数据库庞大许多. 数据仓库主要用于数据挖掘和数据分析, 辅助领导做决策.
在 IT 的架构体系中,数据库是必须存在的。必须要有地方存放数据。比如现在的网购,淘宝,京东等等。物品的存货数量,货品的价格,用户的账户余额之类的。这些数据都是存放在后台数据库中。或者最简单理解,我们现在微博, QQ 等账户的用户名和密码。在后台数据库必然有一张 user 表,字段起码有两个,即用户名和密码,然后我们的数据就一行一行的存在表上面。当我们登录的时候,我们填写了用户名和密码,这些数据就会被传回到后台去,去跟表上面的数据匹配,匹配成功了,你就能登录了。匹配不成功就会报错说密码错误或者没有此用户名等。这个就是数据库,数据库在生产环境就是用来干活的。凡是跟业务应用挂钩的,我们都使用数据库。
数据仓库则是 BI 下的其中一种技术。由于数据库是跟业务应用挂钩的,所以一个数据库不可能装下一家公司的所有数据。数据库的表设计往往是针对某一个应用进行设计的。比如刚才那个登录的功能,这张 user 表上就只有这两个字段,没有别的字段了。但是这张表符合应用,没有问题。但是这张表不符合分析。比如我想知道在哪个时间段,用户登录的量最多?哪个用户一年购物最多?诸如此类的指标。那就要重新设计数据库的表结构了。对于数据分析和数据挖掘,我们引入数据仓库概念。数据仓库的表结构是依照分析需求,分析维度,分析指标进行设计的。
数据库与数据仓库的区别实际讲的是 OLTP 与 OLAP 的区别。
操作型处理, 叫联机事务处理 OLTP(On-Line Transaction Processing),也可以称面向交易的处理系统, 它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。 用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。
传统的数据库系统作为数据管理的主要手段,主要用于操作型处理。
分析型处理, 叫联机分析处理 OLAP(On-Line Analytical Processing)一般针对某些主题的历史数据进行分析,支持管理决策。
数据仓库的架构
基本上可以分为四层
- ODS
- PDW
- DW
- APP
ODS(Operate Data Store)操作数据存储
为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。一般来说ODS 层的数据和源系统的数据是同构的,主要目的是简化后续数据加工处理的工作。从数据粒度上来说 ODS 层的数据粒度是最细的。 ODS 层的表通常包括两类,一个用于存储当前需要加载的数据,一个用于存储处理完后的历史数据。历史数据一般保存 3-6 个月后需要清除,以节省空间。但不同的项目要区别对待,如果源系统的数据量不大,可以保留更长的时间,甚至全量保存;
DW(Data Warehouse)数据仓库
为数据仓库层, PDW 层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。这一层的数据一般是遵循数据库第三范式的,其数据粒度通常和 ODS 的粒度相同。在 PDW 层会保存 BI 系统中所有的历史数据,例如保存 10年的数据。
DM(Data Mart)数据集市
为数据集市层,这层数据是面向主题来组织数据的,通常是星形或雪花结构的数据。
从数据粒度来说,这层的数据是轻度汇总级的数据,已经不存在明细数据了。
从数据的时间跨度来说,通常是 PDW 层的一部分,主要的目的是为了满足用户分析的需求,而从分析的角度来说,用户通常只需要分析近几年(如近三年的数据)的即可。
从数据的广度来说,仍然覆盖了所有业务数据
APP 应用层
为应用层,这层数据是完全为了满足具体的分析需求而构建的数据,也是星形或雪花结构的数据。从数据粒度来说是高度汇总的数据。从数据的广度来说,则并不一定会覆盖所有业务数据,而是 DM 层数据的一个真子集,从某种意义上来说是 DM 层数据的一个重复。
从极端情况来说,可以为每一张报表在 APP 层构建一个模型来支持,达到以空间换时间的目的数据仓库的标准分层只是一个建议性质的标准,实际实施时需要根据实际情况确定数据仓库的分层,不同类型的数据也可能采取不同的分层方法。
为什么要对数据仓库分层
- 用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据。
- 减少业务规则变化带来的影响。如果不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。
- 通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。
数据仓库中的元数据
元数据的作用
在数据仓库中,元数据的主要作用如下。
- 描述哪些数据在数据仓库中,帮助决策分析者对数据仓库的内容定位。
- 定义数据进入数据仓库的方式,作为数据汇总、映射和清洗的指南。
- 记录业务事件发生而随之进行的数据抽取工作时间安排。
- 记录并检测系统数据一致性的要求和执行情况。
- 评估数据质量。
星型模型和雪花模型
星型模型
当所有维表都直接连接到“ 事实表”上时,整个图解就像星星一样,故将该模型称为星型模型。
星型架构是一种非正规化的结构,多维数据集的每一个维度都直接与事实表相连接,不存在渐变维度,所以数据有一定的冗余,如在地域维度表中,存在国家 A 省 B 的城市 C以及国家 A 省 B 的城市 D 两条记录,那么国家 A 和省 B 的信息分别存储了两次,即存在冗余。
雪花模型
当有一个或多个维表没有直接连接到事实表上,而是通过其他维表连接到事实表上时,其图解就像多个雪花连接在一起,故称雪花模型。雪花模型是对星型模型的扩展。它对星型模型的维表进一步层次化,原有的各维表可能被扩展为小的事实表,形成一些局部的" 层次" 区域,这些被分解的表都连接到主维度表而不是事实表。如图所示,将地域维表又分解为国家,省份,城市等维表。它的优点是: 通过最大限度地减少数据存储量以及联合较小的维表来改善查询性能。雪花型结构去除了数据冗余。
雪花模型星型模型因为数据的冗余所以很多统计查询不需要做外部的连接,因此一般情况下效率比雪花型模型要高。 星型结构不用考虑很多正规化的因素,设计与实现都比较简单。雪花型模型由于去除了冗余,有些统计就需要通过表的联接才能产生,所以效率不一定有星型模型高。正规化也是一种比较复杂的过程,相应的数据库结构设计、数据的 ETL、以及后期的维护都要复杂一些。 因此在冗余可以接受的前提下,实际运用中星型模型使用更多,也更有效率。
星型模型和雪花模型的对比
-
数据优化
雪花模型使用的是规范化数据,也就是说数据在数据库内部是组织好的,以便消除冗余,因此它能够有效地减少数据量。 通过引用完整性,其业务层级和维度都将存储在数据模型之中。
相比较而言,星形模型使用的是反规范化数据。 在星形模型中,维度直接指的是事实表,业务层级不会通过维度之间的参照完整性来部署。
星形模型
-
业务模型
主键是一个单独的唯一键(数据属性),为特殊数据所选择。在上面的例子中,Advertiser_ID 就将是一个主键。外键(参考属性)仅仅是一个表中的字段,用来匹配其他维度表中的主键。在我们所引用的例子中, Advertiser_ID 将是 Account_dimension 的一个外键。
在雪花模型中,数据模型的业务层级是由一个不同维度表主键-外键的关系来代表的。而在星形模型中,所有必要的维度表在事实表中都只拥有外键。
-
性能
第三个区别在于性能的不同。雪花模型在维度表、事实表之间的连接很多,因此性能方面会比较低。 举个例子,如果你想要知道 Advertiser 的详细信息,雪花模型就会请求许多信息,比如 Advertiser Name、 ID 以及那些广告主和客户表的地址需要连接起来,然后再与事实表连接。
而星形模型的连接就少的多,在这个模型中,如果你需要上述信息,你只要将 Advertiser的维度表和事实表连接即可。
-
ETL
雪花模型加载数据集市,因此 ETL 操作在设计上更加复杂,而且由于附属模型的限制,不能并行化。
星形模型加载维度表,不需要再维度之间添加附属模型,因此 ETL 就相对简单,而且可以实现高度的并行化。
总结
雪花模型使得维度分析更加容易,比如“针对特定的广告主,有哪些客户或者公司是在线的?”
星形模型用来做指标分析更适合,比如“给定的一个客户他们的收入是多少?”
拉链表: https://blog.csdn.net/zhaodedong/article/details/54177686