关于上面说的主题设计,以及前端展现,这是给客户的最终用户看的,他们只关心你能给他们带来什么,是否满足他们的报表、查询和分析需求。但是对于厂商自己来说,需要清楚自己实施项目时要干什么,就像复杂的ETL开发需要元数据去规范和指引一样,项目的数据流逻辑,是否有设计规范。
对于一个大型数据仓库项目来说,如果粗犷地设计为ODS,DW,DM三大层次,那么在具体实施的时候,可能会因为数据量大,需要过渡层,于是随手在DW层增加些分表,到DM后,前端应用觉得查询太慢,于是也增加一些分表,再汇总。这样就陷入了无休止的维护和盲目地修改中。据我所知,能知道增加分表作为过渡层,已经算是不错的,有的项目看着ETL太慢,只是找寻数据库和ETL代码的原因,于是经常有工程师到处问,几亿的数据量如何增加效率呢,数据库还需要什么优化呢?其实即便你除了2亿纪录的那个表,那么随着客户信息的增加,以后3亿、4亿纪录你能按时ETL完成?
我看到很多朋友,包括比较资深的朋友,一提到那种架构就摇头,太空矿了,没法入手,也没法讨论。其实很多项目开发的时候,分了一些事实表分表,我看有的电信行业架构设计还把主题分为经营分析和大客户两个业务层,这不也是一种设计的进步么?
国外大项目之所以把Architecture工作和data
model的工作分开,就是因为两者完全可以独立,一个优秀的架构设计,可以应用在不同行业,而不是做一个行业的项目,设计一个架构。可能有人要问,不同客户的数据量和业务复杂程度都不一样,你如何规范?那么一个合格的架构设计,应该是分层的,比如,首先分出ODS,DW,DM,标出ODS接受哪些数据源,ODS如何把数据流向DW,DW如何流向DM,具体点可以把一些逻辑上的数据库标上,就像元数据管理图一样。第二层就是各个逻辑层内部设计,ODS一个或者数个数据库,对应到哪些DW对应的逻辑数据库,DW在处理ETL过程中,需要几个过渡层,如果数据量不大的话,只需要一个confirm层ETL到confirm
fact
table足够,如果数据量大,看来还需要一个过渡层才能流向DM层。DM层是面向各个前端应用的逻辑层,大型项目一般都是DW的一个事实表对应多个DM层的事实表。第三层设计是把业务逻辑融入架构中,说明各个逻辑层中业务逻辑的变化。
由此可见,数据仓库项目并不是完全是纯粹的业务驱动,也不是完全的数据驱动,应该是两者同时驱动的MATRIX架构。一个合格的数据仓库架构设计,不但要清除业务流程,还应该清楚数据流程,光有元数据驱动ETL开发也不能让数据仓库更有条理。当然一个项目要实施很合格,光靠架构也不够,具体的开发和测试这样的具体工作也很关键,不在此次讨论范围。
在这只是抛砖引玉,只是提醒下,数据仓库架构设计,并不是空旷,虚无的东西,也不只是业务的驱动和主题的划分。"ETL※DW※OLAP"只是些表面的东西,作为设计者,应该需要知道内部更多,更深入的东西。
在各个网站和论坛,一说到数据仓库,基本都想到了"ETL※DW※OLAP",一说到数据仓库设计,就是按照行业规范和客户需求调研,设计主题,然后设计对应的事实表、维表。但是,这就是真正的数据仓库总体设计么?
与架构设计相关联的是仓库的容量规划。包括用什么样的硬件、软件、多大的存储,满足什么样的性能,在未来1年、至若干年如何扩充以适应需求增长。数据仓库的容量规划也可以是个单独的话题,但在我们的实施中,它属于架构设计部分,而且是个难点。
谢谢
happy
-----Original Message-----
>在各个网站和论坛,一说到数据仓库,基本都想到了"ETL※DW※OLAP",一说到数据仓库设计,就是按照行业规范和客户需求调研,设计主题,然后设计对应的事实表、维表。但是,这就是真正的数据仓库总体设计么?
>
--------------------------
thanks!
happy
xinin...@prient.com
2006-02-23
从业务角度讲,有两种情况,一是客户比较盲目,没有明确的分析需求,这个时候主要就是从现有的数据源出发,再到前端应用的一种从底到顶的一种设计;二是客户有明确的分析需求,这个时候既要从现有从底到顶的设计,还要看现有数据源是否能满足客户特殊的分析需求,如果不能满足,需要尽早提出,并和客户解决数据源的问题,从这个角度说,又是从顶到底的一种模式。
从数据角度讲,如何把数据源到前端应用的线牵起来,通俗的说是一个大的ETL过程,但是庞大的系统需要考虑ETL后的数据质量、一致性、效率等很多因素,于是这个问题需要厂商自己处理,客户不会非常关心,所以才有很多遗留问题。
所以分表,就是同一个数据源,本来可以放在一个事实表,但由于数据量太大,或者业务太复杂,一个事实表很难包含所有主题的信息,于是考虑按照某种业务需求分成多个相似主题的事实表。这个没有统一的定论,需要按实际需求设计。比如一个主题分为日报、周报、月报等不同的分析周期,那么可以分为xx_day_fact,xx_wkly_fact,month_wkly_fact;如果用户经常察看的日分析是2个月的数据,那么你的当前事实表只存2个月的数据,其他的放在xx_his_fact中,再久的放到磁带库(比如2年前的)。类似的分类分表的方法很多,就不一一介绍了。
而所谓的中间数据,也并不是简单的汇总,以前的一些项目,很多根本没用国外很成熟的概念confirm
fact
table聚合一个涵盖丰富信息的事实表,而直接汇总,是一个很典型的案例。一般标准点的项目会把confirm
tables作为一个层,出现在总体架构设计中,成为前端应用汇总信息的重要通道。
这个confirm table,一直没整明白是干啥的。按照Innovate的描述,它是一种"聚合一个涵盖丰富信息的事实表"。如此,我理解的confirm table,恐怕就是那种主题表,例如用户信息表(一系列),这些表的粒度是其描述的实体决定的,针对这种实体的汇总信息表。常见的实体包括用户、客户、渠道、产品、资源、竞争对手等。
至于"分表"这种叫法,觉着是个比较含糊的术语。在项目实施中,存在一种现象。为了满足用户新需求的时候,或提高性能,去修改模型,可能就需要"分表",但通常会出现诸如tmp_xxx的临时表,甚至是以设计者名字命名的表,将他们当作临时表,但很可能他们并非临时的,会融入到实际的流程当中,导致混乱。这是因为在架构的时候缺乏概念设计的结果。整个系统的架构应该能够形成一个概念体系,底层物理的每个表,每个操作都能够归属到某个逻辑或是概念上。
例如增加一个临时的汇总表,那么就严格规定,此表不能放入常规的ETL流程当中,因为那样会导致概念混乱。如果按照周期分表,同样在上层应该是有"不同周期主题表"的概念。
分表目前在很多项目中已经使用,只是还是比较随意,没有在总体架构设计中作为一个层出现。
而且在实际项目中,分表和你说的中间数据是两回事,而且规范的数据仓库不会把任务流程中的数据放在临时表中,那是非常不规范的,因为如果一旦有问题,中间的数据就断了,数据质量无法保证。
...
>分表和你说的中间数据是两回事,而且规范的数据仓库不会把任务流程中的数据放在临时表中,那是非常不规范的,因为如果一旦有问题,>中间的数据就断了,数据质量无法保证。
innovate兄提到如果中间数据按照上面的操作是非常不规范的,因为在ETL过程中断时会产生数据质量的问题。这一点我还不是很明白。因为我在ETL了的过程中,有一些数据质量的控制方法。如果ETL过程中断,我会在日志中记录中断的情况,包括涉及哪些数据,在哪一环节出现错误。这些数据是不会再进入下面的环节的。我会通过对日志的分析来重新对这些数据进行ETL,并修改ETL的结果。我想这样是不是可以解决数据质量的问题呢?
我理解的中间数据不是按照业务来区分的,它只是为了某些原因,比如ETL的性能优化、更好维护等等才采取的方式,不知道这样方式是否确实存在数据不规范的隐患呢?还请innovate兄帮我再分析一下吧。
>而所谓的中间数据,也并不是简单的汇总,以前的一些项目,很多根本没用国外很成熟的概念confirm
>fact
>table聚合一个涵盖丰富信息的事实表,而直接汇总,是一个很典型的案例。一般标准点的项目会把confirm
>tables作为一个层,出现在总体架构设计中,成为前端应用汇总信息的重要通道。
查了一下,没有找到confirm fact table的资料,希望innovate兄再多解释一下。如果在设计数据仓库时做到一个数据仓库的事实表可以和多个数据集市的事实表包含1:n的关系的话,那当然好了。不知如何在实际中满足这样的设计?是否要全面了解企业的需求,对业务理解很深才行啊?我们现在其实很多时候都在根据一堆业务指标来构造数据仓库的事实表,构造完后,如果有新的需求、新的指标,就会在原来的事实表上修改或者新建一个事实表。请问如何避免这样的现象?
谢谢
happy
-----Original Message-----
>分表目前在很多项目中已经使用,只是还是比较随意,没有在总体架构设计中作为一个层出现。
>而且在实际项目中,分表和你说的中间数据是两回事,而且规范的数据仓库不会把任务流程中的数据放在临时表中,那是非常不规范的,因为如果一旦有问题,中间的数据就断了,数据质量无法保证。
>
>所以分表,就是同一个数据源,本来可以放在一个事实表,但由于数据量太大,或者业务太复杂,一个事实表很难包含所有主题的信息,于是考虑按照某种业务需求分成多个相似主题的事实表。这个没有统一的定论,需要按实际需求设计。比如一个主题分为日报、周报、月报等不同的分析周期,那么可以分为xx_day_fact,xx_wkly_fact,month_wkly_fact;如果用户经常察看的日分析是2个月的数据,那么你的当前事实表只存2个月的数据,其他的放在xx_his_fact中,再久的放到磁带库(比如2年前的)。类似的分类分表的方法很多,就不一一介绍了。
>
>而所谓的中间数据,也并不是简单的汇总,以前的一些项目,很多根本没用国外很成熟的概念confirm
>fact
>table聚合一个涵盖丰富信息的事实表,而直接汇总,是一个很典型的案例。一般标准点的项目会把confirm
>tables作为一个层,出现在总体架构设计中,成为前端应用汇总信息的重要通道。
>
--------------------------
thanks!
happy
xinin...@prient.com
2006-02-24
大家很多都看过Inmon和Kimball的书,他们都或多或少提到过confirm
table的概念和思路,就像刘庆说的,confirm
table的出现的主要目的就是能够满足用户可能变化的分析需求和查询性能的需求,增加数据仓库的灵活性、稳定性和高效性。至于为啥ODS层用作前端查询不好,我也大概说过,ODS层的作用应是承上(数据源)启下(DW)的作用,如果你非要给个接口给前端查询,还做个类似confirm
table的事实表,那不是功能和DW、DM有重叠了?客户访问要大大增加系统压力,作为数据前沿的接口,系统压力也很大,你如果保证高效?既然ODS到DW还可能经过1到多次的ETL,你怎么能保证客户最终查询和分析的数据一致性?
我不知道“建立一个若干维度若干度量的汇总表”是建立一个汇总表,还是聚集事实表,这是两个不同的概念。confirm
table既聚集事实表是指经过了所有设计好的ETL后,再把相似的事实表聚集在一起,也就是他还是事实表,不是经过sum,count的汇总表。
说到这里,不得不说分表了。前面说到了ETL完成后相关主题的事实表要聚集到一个事实表里,那么意味着前面我们已经做过拆分,这就是所谓的一个大主题的事实表拆分成分表了。我们这里说的分表,和刘庆提到的很多项目,包括大型项目中的tmp表有类似的作用,但是并不是我做到项目做到一半,突然发现数据量太大,得找个分表分散ETL压力,而是在开始设计中设计好的一个步骤,一个层,要不然为啥总体设计要一个有经验有理论的人设计,随便找个做过大型项目ETL的人设计不就完了?
再细说的分表的命名,如果资深的DW人,一看到分表基本都是tmp_xxx命名的话,只能说明这个项目是“修补型项目”,也就是走一步看一步,发现问题,我再改建模,我再改ETL,元数据管理也得修改。之所以后来项目都很重视元数据管理,是啥原因?没有元数据管理,ETL不照做么?因为大家都知道元数据有效的管理,能让你“站得高,看得远”,能把握ETL全局。那么一个“修补型项目”好,还是你前期架构设计好了,按照设计开发就是好呢?一看就明白了,这也是我最近各大论坛和网站提到的架构设计的重要性,我想我不提出来,也有人出来,就像当年很多人提出元数据管理的重要性一样。
对于过渡分表,很多国内公司使用tmp_xx,我觉得很遗憾,且不说感觉这是个临时表,就命名来说,项目里其他人可能不知道这个表是干嘛的。最主要的是,过渡分表并不是tmp的,应该属于项目的一个重要环节,它们在完成ETL使命后需要重新回到一起,最后到所谓的confirm
fact table里面。
再说一下业务分表,所谓业务分表,并不是我们想怎么分就怎么分,而是根据实际情况。比如客户有固定的日、周、月、季、年等多个周期,那么周数据完全可以自己有一个事实表、年数据也可以。同样,举个简单例子,大客户的分析维和普通客户的维有很多不同之处,但是分析的指标却有很多共同点,而且如果调研结果是大客户信息全部来自大客户系统的话,难道你不觉得大客户和普通客户的事实表分开,是非常合理的么?领导最后可能需要一个总体客户的分析,这个时候你在完成所有ETL后,可以再汇总到一个confirm的聚集事实表里,这样既方便管理、效率高、数据质量有保障,而且方便安全管理,因为客户很可能不希望某些部门的员工不能看大客户的信息,大客户部门只能看大客户信息,而老总都能看。
至于confirm table的相关定义和资料,Kimball的Data warehouse
life cycle
toolkit里边就有。而且我以前在文章中也举个具体的例子,如何实现分表后又能高效聚集到confirm
fact table中。
刚才我说到的这些设计细节,项目的Architecture或者consultant应该可以通过详细调研后预测这些问题,然后设计出架构来,然后data
modeler根据相关架构设计去建模。而不是上面提到的,项目遇到困难了,于是需要修改相关设计,作出很多临时表来应付。作为设计者最好是很资深的人,或者有更资深的顾问帮助设计,不说预测好几年情况,能预测3-5年客户应该就很满足了,但是如果项目才开始实施几个月就发现不对,那预测了什么呢?
那么我说的情况,都是客户有批量查询、随时对各个主题查询的可能。在大项目中,Operational
Data Store,从定义来讲,结构还是OLTP,所以被认为“The
ODS stage is sometimes skipped if it is a replication of the
operational
databases”,那么如果数据源很复杂,有多个数据源的话,将是必须的。
有一点我要说明的是,如果有的ODS层也有事实表什么的拿给前端查询,就和本身的定义不符,已经是DW的概念,作为前端应用,那是data
mart的责任。所以我的建议是,不要把查询看作是独立的应用,也不要把ODS轻易忽略掉。
我刚才说的重点,并不是他命名,命名只是个表面现象,因为既然项目需要一个中间层来过渡,为啥设计的时候没有考虑到呢,非要临到应用才临时搞个临时表过渡?
DW项目的项目质量保证还有个重点,就是开发和测试,我可以另外开一个话题讨论。至于也是至关重要的客户交流、调研,做个N多项目的人都有经验,我就不另外开话题了。
之所以最佳的办法是在DM这一层供客户查询,就是考虑到了客户复杂的,批量的查询需求。在ODS查询的话,客户需要一个复杂的查询,难道你需要关联好多大表,如果实在太难,你就对客户说,不好意思,逻辑太复杂,实现不了?客户肯定就会纳闷,既然你能实现复杂的报表和OLAP分析,为啥我复杂的查询不行呢?
还有,ODS层在绝大多数项目中,是供DW的数据源,不知道你把ODS作为查询数据源后,DW是否通过直接通过各个数据源直接装载呢,还是ODS也担当这个功能呢?
至于如何保证装载和转换的性能,在设计中,设计者总体思路是估量项目的数据量和业务量,然后就可以定论如何分层,分表如何分。kimball他们在书中只是写了大概要有staging
area,
conform层等,其实现实的大型项目中,还可以多加一些过渡层,以保证效率。因为不同项目选择ETL方式不同,有的选择使用工具,有的选择自己开发。如果自己开发的话,所有转换都在存储过程中进行,对于海量数据来说不是最好的办法,因为占用数据库的资源太大。建议把数据拿到c/java等程序里转换后,再load回去,减少数据库负担。这里说到了部分软件工程的问题了。
II 类ODS,与应用系统的数据延迟为2~4小时
III 类ODS,与应用系统的数据延迟为12~24小时
IV 类ODS,数据仓库中部分决策分析数据回流至ODS中
目前应用的比较多的是IV
类ODS,因为一旦将决策分析结果加载到ODS中,重要决策信息的高性能联机支持将成为可能,举例如下:
客户细分与评价
银行客户贷款
ODS与数据仓库的重要区别如下:
ODS只存储明细数据
ODS中存储的数据一般不超过一个月
ODS支持事务更新操作
在ODS中存在3种不同的时间窗处理:
OLTP时间段,与应用系统保持同步更新(通常采用消息机制)
批处理时间段,从应用系统中接收批量数据(通常采用ETL的方式)
DSS时间段,从数据仓库中接收决策支持数据
由于ODS需要满足上述不同处理类型的性能要求,导致ODS无法对任何一种类型进行优化,只能进行折衷考虑,这也正是ODS的技术复杂原因所在。
please reference page 41 for more detail information in <Dimension
Modeling - the Data warehouse toolkit> by Ralph Kimball.
还有比较反感的定义就是什么实时数据仓库,无论你怎么设计数据仓库,始终脱离不了“历史的”特性,何来实时之说,蒙客户呢?现在客户懂得可比以前多了。
Since DW has been developed over 20 years, concepts and methods have
been prompted too, so for whatever DOC of whoever wrote, we need
analyze first, which can solve our problem, which is the best method
for our customer.
我想大家早就了解了概念的相对性,例如实时,现在的客户不好蒙哦,但是和他们说实时也不至于让他们如此狂躁,呵呵。
不说了,到此为止,言语如有不敬之处,innovate511休怪,非我本意,就技术问题讨论讨论而已。
所以我对现在很多人对概念的操作深恶痛绝,搞了半天本质的东西还是没变。IV类ODS就是我说的那种形式的DM,非要说成ODS,.....
ODS正如几位所讨论的,在数据仓库架构中是非常重要的,我们这么花精力讨论是很值得的,也希望有更多的话题把我们聚到一起。:)
thanks
致
礼!
happy
2006-02-27
_ _ _ _
/_/_/_/_/\
/_/_/_/_/\/\
/_/_/_/_/\/\/\
\_\_\_\_\/\/\/
\_\_\_\_\/\/
\_\_\_\_\/
丁西宁
数据仓库咨询顾问
蓬天信息系统(北京)有限公司
Prient Corporation
Power Realtime Intelligent ENTerprise
北京市朝阳区东大桥路8号尚都国际中心25层
电话:8610-58700800 ext 843
传真:8610-58700800 ext 808
手机:86-13910959723
E-mail:xinin...@prient.com
MSN:happ...@hotmail.com
BLOG:http://java.mblogger.cn/happyjava
http://www.prient.com
其次,既然ODS是OLTP系统到DW之间的一个逻辑层,那就没有经过复杂的ETL,对不?举个很简单的例子,某大客户经理要查某区县欠费100元-200元之间的属于某大型单位的年龄在30岁以上客户详细资料已经最近的消费明细,那是否要在ODS中关联好几个表来达到他们频繁的查询目的呢?
我也做过很多国内项目,客户的有的及时性需求是存在的,但是不普遍,没有非要给出个新概念给客户感觉这个新概念肯定ok的必要吧,除非这些客户对数据仓库的了解都比较业余。所谓near
realtime只是针对某个很棘手的分析主题,能快速相应客户信息的变化,这种情况一般为单一主题的情况,完全可以和“传统DW”分开来设计和实施(看具体情况,只是逻辑上至少要分开)。这样的需求一般数据量不会很大,这是能快速相应,接近事实的前提,技术和设计上没有什么需要革新。