做过国外或者外企项目的可能了解过,
数据仓库DW(不含ODS和集市), 在项目往往分为几个阶段,
EDW, CDW和Staging Area, 并不是DW就一块东西,
大型项目这三个层很可能是三个库分三个机器运行,
加上ODS, DM,
也就是说大型数据仓库项目的数据库至少需要5个数据库.
其中EDW, Inmon的理论已经阐述过, 它的全称是Enterprise
Data Warehouse, 在这个库里,
可以采用3NF设计数据库,目的就是进一步清洗、整理数据,面向主题。
CDW全称是Corporate Data Warehouse,由IBM公司最先提出,
它的任务是把EDW的数据按照星型/雪花模型组织数据,最后生成Kimball提出的conform
table。最后Staging Area,
它作为DW到DM的承上启下的层,主要任务是对事实表、维表根据数据集市的需要进行重组,也就是说从这里到数据集市后,客户就可以通过集市直接享用成果了。
当然中小项目不用这么复杂的设计,就想很多小web系统一样,
架构越简单越好。而大家可能会怀疑大项目数据量大,层次太多会不会效率更低。其实这是误解。我把中间的CDW和staging
area比喻成软件项目的中间件,如果把EDW直接建成星型模型,然后放入DM,就有点象以前软件的两层结构,适合小项目。中间件的作用,就是灵活,扩展性强,并能提高效率。在CDW中,完全可以拆分成比较小的事实表逐个ETL,这样的效率将大大提高,因为CDW相对就比较独立了,包括他们的关联,也是用重新设计的代理键,不用非得把一个主题的维和指标都放在一起。因为没有关系,CDW的主要任务是ETL嘛,在Staging
Area可以根据数据集市的需求再组合一下。从这点来看,功能、模式和普通软件项目的中间件一模一样,
上承EDW, 下输出给数据集市。
最后说明一下,未来部门级的数据集市只是过度,因为针对部门的集市局限性很大,而最终决策需要各个部门的数据联合发掘。同时,如果不同的部门建设的话,很多数据是重复的,这样到后来就可能有重复建设了。但是也不得不通过部门级数据集市过度,因为公司对数据仓库未成熟的东西不敢一次性投资是很正常的考虑。
...
做过国外或者外企项目的可能了解过,
数据仓库DW(不含ODS和集市), 在项目往往分为几个阶段,EDW, CDW和Staging Area, 并不是DW就一块东西,大型项目这三个层很可能是三个库分三个机器运行,加上ODS, DM,也就是说大型数据仓库项目的数据库至少需要5个数据库.
...
于是IBM于90年代提出了CDW的概念,作为其中的桥梁。只是刚开始失败率比较高,主要是成本提高,工期沿后。但随着项目经验的提高,现在渐渐被接受。CDW是承接EDW的,也是企业级数据仓库,只是是维度建模的方式,数据源来自EDW,而staging
area就是缓冲区,它是面向数据集市的,作为中心数据仓库和数据集市的桥梁,很多特殊的个性化的ETL在缓冲层完成。
这种设计要求很高,首先是项目有建设企业级数据仓库的需要,也就是说企业的部门级数据集市已经不能满足日益增长的分析需求了,而设计者要熟悉Inmon的EDW思想,建设中心数据仓库。其次要了解部门级各部门或总部、分公司的分析需求,以建数据集市模型。然后再考虑CDW的建设。显然,如果中心数据仓库是EDW,数据集市是维度建模型方式的话,ETL会比较复杂,量也会比较大。如果有CDW的组建,将数据量很大,业务复杂的主题,分散ETL,然后再按主题组合成面向主题的事实表,这样要灵活很多。
。。。
首先要说,在企业级项目中, 有没有必要一定要建EDW,
如果有必要,是否象Inmon那样, 用3NF模型建设?
这样建设后, 应该是按Inmon说的,
它是历史的、不易变的、面向主题的。那么ODS肯定代替不了EDW。
那么数据集市是面向前端应用的,包括固定报表、即席查询、OLAP、Data
Mining,那么EDW是否能代替数据集市呢?显然也不行,因为即席查询、报表、OLAP等应用,要频繁使用数据库,客户越多,数据库压力越大,特别是复杂查询,3NF模型下需要多表关联,效率始终是个问题,更多更多Kimabll已经阐述过了。
于是剩下的问题就是把EDW的数据拿到数据集市去,数据仓库的设计一般是比较通用的设计,而数据集市则是面向特殊的需求。大家都知道前端工具都含有丰富的SQL功能,能满足你去运算一些客户特定的指标。但是多数人还是不赞成那样,因为这样多了后前端压力很大,而且效率毕竟不如后台,扩展性也差,一旦需求改变和增加,N多固定报表开发或者OLAP开发都得修改,开发维护量非常大。于是数据集市势必要解决绝大多数问题。
然后同一行业不同客户的需求是不同的,很多客户有MTD,QTD,YTD的需求,也就是Month
to
Date这样的,需要数据不定期累加,那么数据仓库肯定没有必要为这些特殊需求而设计,因为数据仓库是代表高一层次的东西,不是针对具体需求的。那么数据集市就需要有对应的事实表去满足这些需求,他们来自哪里?一般建议数据集市不做ETL,为啥,因为很多ETL工作是跨主题的,那么这种情况数据集市就成了数据孤岛,怎么能轻松ETL?那么EDW行不行,显然不行,因为需要一个维度建模方式的DW才行,于是中间层的需求就出现了。
这个中间层要求是以维度建模方式的,也是企业级的数据仓库,IBM称之为Corporate
Data Warehouse.
它继承了EDW的有点,被清洗好了的,面向主题的(不用再重新划分主题),但是建模方式不同。但是它毕竟还是企业级Data
warehouse,并不能满足具体部门级别客户的特殊需求,而不同数据集市也许需要同样的事实表(包括维化事实表),于是针对这些特殊情况,staging
area将在CDW确定后的(不需要ETL)比较分散的事实表合并成面向一个主题的事实表,增加特殊的指标放在事实表里。
这样中间层的作用就是继承EDW,去一步步满足数据集市的需求,到数据集市的时候,我们能看到的是干净、功能齐全的维表、事实表,你既然可以把他们再合并成一个含有丰富维信息的大表,也可以再聚合成报表需要的中间表,也能满足即席查询需求,基本上可以说功能齐全。扩展性上,需求定义一旦变化,你改变前面的CDW既可。数据集市也保留了最低粒度,能满足客户最苛刻的即席查询。
--CDW全称是Corporate Data Warehouse,由IBM公司最先提出,
--它的任务是把EDW的数据按照星型/雪花模型组织数据,
--最后生成Kimball提出的conform table。
如果采用CIF架构来实现数据仓库的话,类似于Kimball的conform
table的功能
在EDW中已经实现了,为什么还要在EDW和DM之间添加一个CDW层来实现这个功能呢?
--最后Staging Area,
它作为DW到DM的承上启下的层,主要任务是对事实表、
--维表根据数据集市的需要进行重组,也就是说从这里到数据集市后,
--客户就可以通过集市直接享用成果了。
如果在CDW和DM间需要这个Staging
Area的话,那么在EDW和CDW之间是否也应该
有一个层,EDW和CDW之间的差别应该更大一些。而在源数据和EDW之间的那个部件
应该叫做什么?
CDW是否保留全部的历史记录呢?
如果建立五层的话,当源数据发生变化时,一般需要多久反映到DM层?
如果建立五层的话,都哪些层可以提供给用户访问呢?
至于是不是每一个项目都需要这样,我看不一定,只有更合适的,没有最合适的,要不然数据仓库界就没有这么多争论了,就一统天下了。
我这里只是介绍给大家一个新的思路,而且用这个新思路的项目我也参加过,仅作参考。这里有国外网站对此的文章,看看人家的看法,也许能多一些理解。
http://www.dmreview.com/article_sub.cfm?articleId=1040087
ETL是跨主题的,数据集市就成了数据孤岛吗?那MD架构中的conformed
table和bus architecture
是做什么用的?
--那么EDW行不行,显然不行,因为需要一个维度建模方式的DW才行,于是中间层的需求就出现了。
EDW为什么不行呢,ETL最关键的就是数据的整合和清洗,而EDW就是ETL的结果,在EDW上建立数据集市
应该是最舒服的事了。
--因为前提是EDW不是按照维度建模的,是3NF方式,所以无论如何,到数据集市都要经过一个模型的转换。
Kimball提出的conformed table分为两种,分别是conformed
dimension(一致性维度)
和conformed fact(一致性事实),这两个概念是和bus
architecture(总线结构)
一起提出的,目的性应该很明显。因为Kimball建立数据仓库的方法是先建立数据集市
再合成数据仓库,为了保证能合并成数据仓库而不是一个烟筒集市,需要在Staging
Area
(数据准备区)先分析好整体的结构包括总线矩阵、一致性维度等。这样才能保证在
建立下一个数据集市时保证合成一个企业的视角。
而Inmon的CIF架构中的EDW中已经建立好的整个企业视角的数据,该整合、该清洗的都完成了,
直接建立数据集市就可以,没有必要再添加一个CDW层做中间过渡。
个人感觉CDW应该是数据仓库发展过程中的一个中间概念,和EDW应该指的是一个东西。
当然了,数据仓库的架构每个企业都有自己的实现方式,也一定各有优缺点,既然IBM有这样的
设计,也一定要他的道理。
随便说了几句,欢迎大家拍砖,呵呵。
ODS区:
通过数据通路(接口文件或数据库直连,但首选接口文件),存入ODS.
ODS完成数据合并.其数据结构跟接口需求一致,编码使用类似如下的规范:
C1的 用户ID = "C1"+C1系统的用户ID
C2的用户ID ="C2"+C2系统的用户ID 等.
ODS采用文件存储或数据库存储,不保留历史信息.
EDW:
1. ODS的数据进入EDW的Staging区. Staging区转换为数据库存储,并在装入时进行数据标准化,如费用类型代码标准化.
2. 通过ETL,Staging区的数据进入EDW的数据存储区(EDW提供3NF的模型方式存储)
模型包括: 客户、事件、账务、合约等主题。其中用户信息进入合约主题;客户信息进入客户主 题;帐单信息进入账务主题;通话记录进入事件主题。
客户主题下可能包含 客户、客户协议历史、客户状态历史、客户轮廓历史(人口地理信息)、客户级别历史等;账务主题包含费用历史等;。。。
CDW:不太认同它作为单独的层次。作为到DM的过渡层次,可以在EDW中通过视图来实现某一时点的数据视图。它为DM的事实表提供基础数据,将分散、致密的3NF模型连接成平面表。实际也就是恢复成例如用户费用表(包含用户ID、用户入网时间、用户状态、号码、对方号码、通话时间、通话时长、>呼叫类型、>通话地区、通话费、批价时间等属性);
Staging Area:与上面一样作为过渡。
DM: 星型模式
例如完成用户费用分析
维度包括:入网时间区间(5年以上、3到5年、1-3年、1年以内):根据用户入网时间计算;
用户状态;
通话时长区间(1分钟以内、1-10分钟、10分钟以上等):根据时长分段;
呼叫类型;
通话地区(分区内、区间、长途等);
等等;
度量包括:通话费
采用CIF架构设计
1.建立数据准备区(Staging Area),也称集成转化层。
建立临时表,将接口文件导入临时表,进行整合和清洗,导入给数据仓库准备数据的临时表,这部分客户不能访问
整合和清洗的方法略,goldenfish3的方法就很好
2.操作数据存储(ODS),如果有必要的话
操作数据存储的模型和数据仓库基本上是一样的,只是保存的数据量新一些,小一些
根据需要,可以两个小时导入一次(如果源系统能提供的话),保存一天或者一个月或者更多
这部分用户可以访问。
这部分其实我不太清楚,没有在项目中建立过,DW2.0里ODS的概念和以前好像也不一样了,不建议建立ODS。
3.数据仓库(EDW)
将临时表中准备好的数据导入数据仓库(3NF)
对于变化的数据,增加时间标识(开始时间)和原主键共同作为主键,建立新的记录,进一步增加截至时间。
比如前面提到的用户和客户。
对于帐单和通话详单通过发生时间或者记录时间可以和用户、客户表中的开始时间和截至时间相比,找到当时的用户
或者客户信息。
这样生成的数据仓库访问起来不太容易,一般不建议用户访问,对于用户的各种需求,由开发人员将数据仓库中的数据
导入相应的数据集市或者探索仓库
4.建立数据集市
数据集市采用维度建模,对于象用户和客户这样要建立成维度表的信息,根据需求来决定是否反映变化情况,
数据仓库中保存着所有的历史信息和变化情况,有什么样的需求都可以加载到相应的数据集市。
对于在数据仓库和数据集市之间需不需要staging,我觉得没必要,
staging的意思就是将数据写到硬盘上,Staging
area的意思就是我要保存数据,不管是以文件形式还是数据库形式,
这部分如果通过工具或存储过程可以直接将数据导过去,如果中间非要加一层来存临时数据的话,不能说不可以,
但是总觉得没必要。
对于是否有必要建立CDW,我觉得也没必要,这里如果建立CDW,并且不能用户访问的话,其实就是Staging
area。
kimball提出conformed
table目的就是建立多个数据集市时数据要统一,CIF架构中的表本来就是建立在一起的,
也就是说建立多少个数据集市,都是从一个地方出的数据,
如果要保证在每个数据集市中的相同维度显示的文本都要统一的话,可以在数据仓库中直接把描述信息统一就可以了,
没必要非得建立一个象CDW这样一个大的中间层。
dimensional
model直接建立在数据集市中,数据都是在EDW中出,EDW中的数据已经是一致的了。
采用MD架构设计
1.建立数据准备区(Staging Area)
建立临时表,将接口文件导入临时表,进行整合和清洗,导入给数据集市准备数据的表。根据需要来决定保存数据的时间长短。
建立查找表,加载到内存,用来替换代理键。
建立一致性维度,给其他数据集市做准备。
从功能上来说,MD的staging area 相当于 CIF 的staging
area+EDW。
目的是做好不出烟囱集市的准备后就可以直接建立数据集市,不用等所有的数据都进入数据仓库后再建立数据集市。
这部分用户不能访问。
2.建立数据集市
维度建模来实现数据集市,使用一致性维度。
可以和其他的数据集市一起组合成数据仓库。
bty,这个虚拟的场景有点简单,不能很好的区分CIF和MD的差别和优缺点。
如果是多种情况, 我们不用说太具体的例子,
不然就说太长了. 比如一个500强制造业,
需要一个全方位企业级数据仓库的建设,
数据源有来自ERP的, 有来自CRM的, 有来自OA的,
还有来自手工录入的调查资料等等.
数据内容含盖采购、生产、库存、销售、定单、物流、财务,以及客户关系数据等。同时客户的部门级以及总部的很多需求(假设之前客户采用数据集市的方式分别满足需求,现在需要统一建立中心企业数据仓库)。
就拿大的分析需求方向来讲,每个大区分公司的重点可能是不同的,总公司的关心点也得考虑。为了节约成本,采购、生产、库存、物流肯定都得分析,为了占领市场制高点,销售、客户关系环节非常重要,
而财务则需要综合以上所有因素得出结果。比如产品这个dimensional-fact,
将会贯穿生产、物流、销售、客户关系、财务等多个主题方向;客户/代理商维贯穿物流、销售、客户关系、财务多个主题。当然,时间、地点维贯穿几乎所有主题。
在我们建设企业级数据仓库的时候,这些通用的事实/维是统一集成ETL,他们不再是孤立的。要过度到数据集市,所谓的conformed
table的建设是必要的,这个时候要在多个不同的数据集市各自形成conformed
table是不符合其特点的,也就是说它还是得在企业级环境下形成,最后分发给数据集市。试问,如果有没这层,conformed
table在哪里形成,是在EDW么?那不是显得不伦不类?
Godenfish:
接口->ODS->Staging Area->EDW->DM
ODS:和接口结构相同,作一定的统一编码,不保留历史
Stage Area:?
EDW:3NF建模,保存历史,统一编码
CDW:无
DM:维度建模
Jerome
CIF:
接口->Staging Area->ODS->EDW->DM
Staging Area:和接口结构完全一样,进行数据清洗
ODS:不保存历史,统一编码
EDW:3NF建模,保存历史
CDW:无
DM:维度建模,只有一个
首先要说的是,我不认为staing area应该拿出来与ODS/EDW/DM等并列。它位于EDW内的第一层。如果划的更细点,EDW还可以
先landing area(数据降落,就是接口数据落地存储,落地过程中可能会做数据标准化处理)再staing area(登台 文件转入数据库中)。
在ODS中进行统一编码,是说将用户ID等统一编码。而不是编码标准化。例如对于客户类别,
A1系统中使用 1. 大客户 2.中小客户 区分;
A2系统中使用 1.大中型客户 2 小客户 区分;
那么在ODS中,对于客户类别可能采用: 1. A1大客户 2. A1中小客户 3.A2大中客户 4 A3小客户 这种代码统一编码方式。
编码的标准化放在了EDW的Staging过程中了,因为ODS是比较薄的一层。要考虑硬件性能等能否支持高效的数据标准化。(如果DW的硬件性能更好,不如放在DW。)当然在ODS进行编码标准化也无不可,也就是将客户类型统一成1.大客户 2 中客户 3 小客户。
也可以有权衡的做法,例如,即记录级的标准化工作在ODS完成,跨记录的标准化在staing area完成。
还有EDW如果与CDW都存在的话,CDW也保留历史,肯定要考虑存储代价。当10T的源数据却需要20T的存储时,决策者很难认同这种方案。也听说过DW采用维度建模而不使用CIF的思路的,只有几个事实表,但有100多个维度。听起来很不可思议,不知道细节是什么样的。
所谓staging area,
在这里拿到CDW的dimensional数据,根据数据集市的需要再进行一定的ETL,最后生成大家都知道conformed
tables。要知道一个conformed table,
可不止一个数据集市需要,N多数据集市都可能需要,所以在每个数据集市里去处理,显然很不明智。
再次提到很具体而且必须考虑的问题,试想,如果没有过渡,数据集市需要的conformed
tables怎么去形成?如果这个问题不解决,利用Kimball的思想建设数据集市就是空话。
我想我可能是表达的不太清楚,我只是就着这个例子说几句,没有假设比较单一的情况,呵呵。
觉得单一可能是因为关于数据整合、清洗部分我没有发表言论。
这个例子是比较简单,没必要建立EDW,只是借用这个例子来说明一下架构。
很遗憾,我对电信业务不熟悉,
所以举出的例子中涉及电信业务的内容写不出东西来,
只是泛泛的谈了谈架构。
--再次提到很具体而且必须考虑的问题,试想,如果没有过渡,数据集市需要的conformed
--tables怎么去形成?如果这个问题不解决,利用Kimball的思想建设数据集市就是空话。
innovate511 能详细介绍一下conformed
table要实现的功能或具体的实现方法吗?
我想了解一下为什么在EDW中不能实现同样的功能。
confomed table当然不能在dm中实现,但dimension
model是建立在dm中的。
如果建立EDW的话,不见得要建立confomed
table,但是类似confomed table
的功能是一定要在EDW中实现。
kimball在staging area中就能实现confomed table,
为什么inmon不能在staging
area+edw中实现同样的功能,还要再加一层来实现呢?
如果不考虑费用和复杂性的话,建立CDW当然是一个很好的选择,
可以把这部分功能再细化一下到CDW中。
但是EDW已经够复杂的了,要多大的工程才能允许我们建立更复杂的架构?
个人更倾向于直接建立MD架构。
--Jerome
--CIF:
--接口->Staging Area->ODS->EDW->DM
-- Staging Area:和接口结构完全一样,进行数据清洗
-- ODS:不保存历史,统一编码
-- EDW:3NF建模,保存历史
-- CDW:无
-- DM:维度建模,只有一个
--总线架构:
--接口->Staging Area->DM
-- Staging
Area:先建和接口一样的临时表(或者从文件),进行维度建模,统一编码,建立一致维度
-- DM:维度建模
Staging
Area只是为了处理数据方便建立的一个存储区,建不建立完全看自己的需要,觉得直接能导过去,
就不要staging,觉得中间建立一些表,处理数据方便的话,就可以staging,ETL架构师凭自己的经验来做决定。
当然也可以有一些其他的考虑,如给审计用,保留数据来源的历史记录,导入失败的话重新开始方便一些等。
建不建立要看具体情况,复杂的情况下,可以包括下面几部分,
1.和接口结构一样,装载数据。
1.5中间整合业务等根据需要建立一些表。
2.和EDW结构一样,保存处理好的数据,以便一次性装载入EDW,因为处理的过程有可能是记录级的处理,
一条一条的写入EDW不太好。
简单的情况,就不用staging了。直接用etl工具或写存储过程导。
ODS只是一个可选的。
CIF架构中,DM是不止一个的,在理论上说,数据集市和探索仓库应该是不限数目的。
因为CIF的思想就是,在EDW中是整合好的最全的数据,有什么需要
都可以单独建立数据集市或者探索仓库给他用。
--我也提出一种以往电信经营分析项目中用过架构,当然,几乎是从总线架构派生出来,只是名称不同而已:
--接口->ODS->DW->DM
--
ODS:几乎跟接口接口一摸一样,但进行数据清洗和统一编码,代码表完全转换成维表
-- DW:维度建模,保存历史
-- DM:维度建模
-- CDW:无
-- Staging Area:无
我觉得在这个架构里,ODS就是Staging
Area。只是概念上的不统一。
--首先要说的是,我不认为staing
area应该拿出来与ODS/EDW/DM等并列。它位于EDW内的第一层。如果划的更细点,EDW还可以
--先landing
area(数据降落,就是接口数据落地存储,落地过程中可能会做数据标准化处理)再staing
area(登台 文件转入数据库中)。
把Staging
Area归入EDW,这个只是概念上和物理位置的不同吧。功能应该是一样的。
另外这个ODS是用户可以访问的吗?ODS这个概念尤其的不统一。
--也听说过DW采用维度建模而不使用CIF的思路的,只有几个事实表,但有100多个维度。听起来很不可思议,不知道细节是什么样的。
这怎么可能呢,几个事实表能分析些什么。
简单的说,首先建设EDW的项目,到底数据集市是否使用dimensional设计思路,
如果数据集市也是3NF结构,那么我们的讨论点就有很大的出入了,也就没有讨论下去的必要了.
如果数据集市是使用dimensional设计思路,
那么是否把EDW的数据直接影射到数据集市,不需要过度?我想反对者的观点应该是直接把EDW
ETL好的,具有一致性的数据导入数据集市.
我就比较奇怪了,
3NF结构和dimensional结构相差很大,如何能一步到位?
一般来说, 数据集市使用dimensional设计是最好的方法,
现在简单说一下几点不可能直接从EDW到数据集市一步到位的原因:
1. 数据集市需要的很多数据, EDW不能提供,
因为EDW面向企业通用的基本信息,
而数据集市面向客户刁钻的具体应用.
举一个简单的例子,
一家全球性企业需要定义一些特别的时间,
不同国家不同日期为假期, EDW比较难实现,
因为它没有专门的时间维表去记录这些特殊的标志,
如果每个有时间的表都要ETL, 那这个系统估计得死了.
如果直接从EDW到数据集市,
那么放到数据集市去处理如何? 前面我们说过,
由于这是企业级通用的,
应该在数据集市之前就搞定conformed table,
供所有数据集市使用, 不适合数据集市单独使用.
2. EDW不适合使用代理键技术,
因为这个技术是建立在维度建模方式上的.
但如果仅仅在数据集市使用代理键, 那一致性就完了,
也就是说局限了不能使用代理键, 多好的技术呀.
其他的一时没想起来,现在也太晚了,晚上加班才回来看到回帖.
但是如果能解决实际问题,
比如效率、准确性和扩展性, 作为工程,
只要好使就可以, 没有绝对的事情.
但是大项目中加层是很普遍的现象, 因为效率原因,
我们不能让复杂的ETL在海量数据中一步到位,
那是知名的. 但是由于CDW也是面向企业级的,
而又是维度建模方式, 所以显得很特别.
"我也提出一种以往电信经营分析项目中用过架构,当然,几乎是从总线架构派生出来,只是名称不同而已:接口->ODS->DW->DMODS:几乎跟接口接口一摸一样,但进行数据清洗和统一编码,代码表完全转换成维表DW:维度建模,保存历史DM:维度建模CDW:无Staging Area:无"
正如软件的发展,CS结构不可以么,为啥有的产品或者项目非要用BS结构?结构越来越复杂,并不是搞个花样,而是解决实际的问题。分层处理有几个最大的优点,复杂的业务、海量数据容易处理;新需求容易满足、扩展性强;查询错误容易查询。而且采用conformed
tables模型设计的时候,已经注定企业通用的事实、维是可信的,可重用的,新需求一出来,如果仅仅是部门级特别的需求,可以重用conformed
tables,那么一旦有数据质量问题,我们查询的范围也就缩小了。