1、数据仓库的架构前端
数据仓库(Data Warehouse DW)是为了便于多维分析和多角度展示而将数据按特定的模式进行存储所创建起来的关系型数据库,它的数据基于OLTP源系统。数据仓库中的数据是细节的、集成的、面向主题的,以OLAP系统的分析需求为目的。数据库
数据仓库的架构模型包括了星型架构(图二:pic2.bmp)与雪花型架构(图三:pic3.bmp)两种模式。如图所示,星型架构的中间为事实表,四周为维度表,相似星星;而相比较而言,雪花型架构的中间为事实表,两边的维度表能够再有其关联子表,从而表达了清晰的维度层次关系。 安全
从OLAP系统的分析需求和ETL的处理效率两方面来考虑:星型结构聚合快,分析效率高;而雪花型结构明确,便于与OLTP系统交互。所以,在实际项目中,咱们将综合运用星型架构与雪花型架构来设计数据仓库。性能优化
那么,下面咱们就来看一看,构建企业级数据仓库的流程。服务器
2、构建企业级数据仓库五步法架构
(一)、肯定主题性能
即肯定数据分析或前端展示的主题。例如:咱们但愿分析某年某月某一地区的啤酒销售状况,这就是一个主题。主题要体现出某一方面的各分析角度(维度)和统计数值型数据(量度)之间的关系,肯定主题时要综合考虑。优化
咱们能够形象的将一个主题想象为一颗星星:统计数值型数据(量度)存在于星星中间的事实表;分析角度(维度)是星星的各个角;咱们将经过维度的组合,来考察量度。那么,“某年某月某一地区的啤酒销售状况”这样一个主题,就要求咱们经过时间和地区两个维度的组合,来考察销售状况这个量度。从而,不一样的主题来源于数据仓库中的不一样子集,咱们能够称之为数据集市。数据集市体现了数据仓库某一方面的信息,多个数据集市构成了数据仓库。设计
(二)、肯定量度代理
在肯定了主题之后,咱们将考虑要分析的技术指标,诸如年销售额之类。它们通常为数值型数据。咱们或者将该数据汇总,或者将该数据取次数、独立次数或取最大最小值等,这样的数据称为量度。
量度是要统计的指标,必须事先选择恰当,基于不一样的量度能够进行复杂关键性能指标(KPI)等的设计和计算。
(三)、肯定事实数据粒度
在肯定了量度以后,咱们要考虑到该量度的汇总状况和不一样维度下量度的聚合状况。考虑到量度的聚合程度不一样,咱们将采用“最小粒度原则”,即将量度的粒度设置到最小。
例如:假设目前的数据最小记录到秒,即数据库中记录了每一秒的交易额。那么,若是咱们能够确认,在未来的分析需求中,时间只须要精确到天就能够的话,咱们就能够在ETL处理过程当中,按天来汇总数据,此时,数据仓库中量度的粒度就是“天”;反过来,若是咱们不能确认未来的分析需求在时间上是否须要精确到秒,那么,咱们就须要遵循“最小粒度原则”,在数据仓库的事实表中保留每一秒的数据,以便往后对“秒”进行分析。
在采用“最小粒度原则”的同时,咱们没必要担忧海量数据所带来的汇总分析效率问题,由于在后续创建多维分析模型(CUBE)的时候,咱们会对数据提早进行汇总,从而保障产生分析结果的效率。关于创建多维分析模型(CUBE)的相关问题,咱们将在下期栏目中予以阐述。
(四)、肯定维度
维度是指分析的各个角度。例如咱们但愿按照时间,或者按照地区,或者按照产品进行分析,那么这里的时间、地区、产品就是相应的维度。基于不一样的维度,咱们能够看到各量度的汇总状况,也能够基于全部的维度进行交叉分析。
这里咱们首先要肯定维度的层次(Hierarchy)和级别(Level)(图四:pic4.bmp)。如图所示,咱们在时间维度上,按照“年-季度-月”造成了一个层次,其中“年”、“季度”、“月”成为了这个层次的3个级别;同理,当咱们创建产品维度时,咱们能够将“产品大类-产品子类-产品”划为一个层次,其中包含“产品大类”、“产品子类”、“产品”三个级别。
那么,咱们分析中所用到的这些维度,在数据仓库中的存在形式是怎样的呢?
咱们能够将3个级别设置成一张数据表中的3个字段,好比时间维度;咱们也可使用三张表,分别保存产品大类、产品子类、产品三部分数据,好比产品维度。
另外,值得一提的是,咱们在创建维度表时要充分使用代理键。代理键是数值型的ID号码(例如图六中每张表的第一个字段),它惟一标识了每一维度成员。更重要的是,在聚合时,数值型字段的匹配和比较,JOIN效率高,便于聚合。同时,代理键对缓慢变化维度有着重要的意义,在原数据主键相同的状况下,它起到了对新数据与历史数据的标识做用。
在此,咱们不妨谈一谈维度表随时间变化的问题,这是咱们常常会遇到的状况,咱们称其为缓慢变化维度。
好比咱们增长了新的产品,或者产品的ID号码修改了,或者产品增长了一个新的属性,此时,维度表就会被修改或者增长新的记录行。这样,咱们在ETL的过程当中,就要考虑到缓慢变化维度的处理。对于缓慢变化维度,有三种状况:
一、缓慢变化维度第一种类型:历史数据须要修改。这种状况下,咱们使用UPDATE方法来修改维度表中的数据。例如:产品的ID号码为123,后来发现ID号码错了,须要改写成456,那么,咱们就在ETL处理时,直接修改维度表中原来的ID号码为456。
二、缓慢变化维度第二种类型:历史数据保留,新增数据也要保留。这时,要将原数据更新,将新数据插入,咱们使用UPDATE / INSERT。好比:某一员工2005年在A部门,2006年时他调到了B部门。那么在统计2005年的数据时就应该将该员工定位到A部门;而在统计2006年数据时就应该定位到B部门,而后再有新的数据插入时,将按照新部门(B部门)进行处理,这样咱们的作法是将该维度成员列表加入标识列,将历史的数据标识为“过时”,将目前的数据标识为“当前的”。另外一种方法是将该维度打上时间戳,即将历史数据生效的时间段做为它的一个属性,在与原始表匹配生成事实表时将按照时间段进行关联,这种方法的好处是该维度成员生效时间明确。
三、缓慢变化维度第三种类型:新增数据维度成员改变了属性。例如:某一维度成员新加入了一列,该列在历史数据中不能基于它浏览,而在目前数据和未来数据中能够按照它浏览,那么此时咱们须要改变维度表属性,即加入新的字段列。那么,咱们将使用存储过程或程序生成新的维度属性,在后续的数据中将基于新的属性进行查看。
(五)、建立事实表
在肯定好事实数据和维度后,咱们将考虑加载事实表。
在公司的大量数据堆积如山时,咱们想看看里面到底是什么,结果发现里面是一笔笔生产记录,一笔笔交易记录… 那么这些记录是咱们将要创建的事实表的原始数据,即关于某一主题的事实记录表。
咱们的作法是将原始表与维度表进行关联,生成事实表(图六:pic6.bmp)。注意在关联时有为空的数据时(数据源脏),须要使用外链接,链接后咱们将各维度的代理键取出放于事实表中,事实表除了各维度代理键外,还有各量度数据,这未来自原始表,事实表中将存在维度代理键和各量度,而不该该存在描述性信息,即符合“瘦高原则”,即要求事实表数据条数尽可能多(粒度最小),而描述性信息尽可能少。
若是考虑到扩展,能够将事实表加一惟一标识列,觉得了之后扩展将该事实做为雪花型维度,不过不须要时通常建议不用这样作。
事实数据表是数据仓库的核心,须要精心维护,在JOIN后将获得事实数据表,通常记录条数都比较大,咱们须要为其设置复合主键和索引,以实现数据的完整性和基于数据仓库的查询性能优化。事实数据表与维度表一块儿放于数据仓库中,若是前端须要链接数据仓库进行查询,咱们还须要创建一些相关的中间汇总表或物化视图,以方便查询。
3、什么是ETL
在数据仓库的构建中,ETL贯穿于项目始终,它是整个数据仓库的生命线,包括了数据清洗、整合、转换、加载等各个过程。若是说数据仓库是一座大厦,那么ETL就是大厦的根基。ETL抽取整合数据的好坏直接影响到最终的结果展示。因此ETL在整个数据仓库项目中起着十分关键的做用,必须摆到十分重要的位置。
ETL是数据抽取(Extract)、转换(Transform)、加载(Load )的简写,它是指:将OLTP系统中的数据抽取出来,并将不一样数据源的数据进行转换和整合,得出一致性的数据,而后加载到数据仓库中。例如:下图就向咱们展现了ETL的数据转换效果。(图七:pic7.bmp)
那么,在这一转换过程当中,咱们就完成了对数据格式的更正、对数据字段的合并、以及新增指标的计算三项操做。相似地,咱们也能够根据其余需求,完善数据仓库中的数据。
简而言之,经过ETL,咱们能够基于源系统中的数据来生成数据仓库。ETL为咱们搭建了OLTP系统和OLAP系统之间的桥梁。
5、项目实践技巧
(一)、准备区的运用
在构建数据仓库时,若是数据源位于一台服务器上,数据仓库在另外一台服务器端,考虑到数据源Server端访问频繁,而且数据量大,须要不断更新,因此能够创建准备区数据库(图八:pic8.bmp)。先将数据抽取到准备区中,而后基于准备区中的数据进行处理,这样处理的好处是防止了在原OLTP系统中频繁访问,进行数据运算或排序等操做。
例如咱们能够按照天将数据抽取到准备区中,基于数据准备区,咱们将进行数据的转换、整合、将不一样数据源的数据进行一致性处理。数据准备区中将存在原始抽取表、转换中间表和临时表以及ETL日志表等。
(二)、时间戳的运用
时间维度对于某一事实主题来讲十分重要,由于不一样的时间有不一样的统计数据信息,那么按照时间记录的信息将发挥很重要的做用。在ETL中,时间戳有其特殊的做用,在上面提到的缓慢变化维度中,咱们可使用时间戳标识维度成员;在记录数据库和数据仓库的操做时,咱们也将使用时间戳标识信息。例如:在进行数据抽取时,咱们将按照时间戳对OLTP系统中的数据进行抽取,好比在午夜0:00取前一天的数据,咱们将按照OLTP系统中的时间戳取GETDATE到GETDATE减一天,这样获得前一天数据。
(三)、日志表的运用
在对数据进行处理时,不免会发生数据处理错误,产生出错信息,那么咱们如何得到出错信息并及时修正呢? 方法是咱们使用一张或多张Log日志表,将出错信息记录下来,在日志表中咱们将记录每次抽取的条数、处理成功的条数、处理失败的条数、处理失败的数据、处理时间等等。这样,当数据发生错误时,咱们很容易发现问题所在,而后对出错的数据进行修正或从新处理。
(四)、使用调度
在对数据仓库进行增量更新时必须使用调度(图九:pic9.bmp),即对事实数据表进行增量更新处理。在使用调度前要考虑到事实数据量,肯定须要多长时间更新一次。好比但愿按天进行查看,那么咱们最好按天进行抽取,若是数据量不大,能够按照月或半年对数据进行更新。若是有缓慢变化维度状况,调度时须要考虑到维度表更新状况,在更新事实数据表以前要先更新维度表。
调度是数据仓库的关键环节,要考虑缜密。在ETL的流程搭建好后,要按期对其运行,因此调度是执行ETL流程的关键步骤。每一次调度除了写入Log日志表的数据处理信息外,还要使用发送Email或报警服务等,这样也方便的技术人员对ETL流程的把握,加强了安全性和数据处理的准确性。
5、总结
构建企业级数据仓库须要简单的五步,掌握了这五步的方法,咱们能够构建一个强大的数据仓库。然而,每一步都有很深的内容须要研究与挖掘,尤为在实际项目中,咱们要综合考虑。例如:若是数据源的脏数据不少,在搭建数据仓库以前咱们首先要进行数据清洗,以剔除掉不须要的信息和脏数据。
ETL是OLTP系统和OLAP系统之间的桥梁,是数据从源系统流入数据仓库的通道。在数据仓库的项目实施中,它关系到整个项目的数据质量,因此马虎不得,必须将其摆到重要位置,将数据仓库这一大厦的根基筑牢!