|
当维度建模遇上3NF近来一个热门话题是谈数据仓库架构中的分层,谈到几种不同的分法,整个帖子已经非常长了,还有继续的趋势,于是这里重启一个话题。 goldenfish 20060523 我觉得,EDW中关键是解决如何“保留历史”的问题。例如,对于一个客户信息表: <客户ID ,客户姓名,客户住址,客户性别,婚姻状态、客户话费余额、客户欠费余额> 我们至少有三种方法: 1.建一个包含上述信息的客户信息表,当客户任何一项信息变动时,均插入一条记录(仓库中的客户信息表使用代理主键。) 2.将客户信息分类,分为“偶然变动”的信息和“频繁变动”的信息。将偶然变动的信息定义为整个数据生命周期只发生数次变动的;频繁变动则随时间周期变动。 将客户信息分成了三个表:客户基本信息表和客户的话费余额变动信息表、客户欠费余额变动信息表。在基本信息表中,只要一项基本信息变动,则增加一条记录;在频繁变动表中,随每次变动就增加一条记录。 3.对于任何一项可能变动的属性,均使用单独的表(除非变动周期一致)。这样就出来性别历史表、住址历史表、婚姻状态历史表、话费余额历史表、欠费余额历史表等等。 可以看出,从1到3是逐步减少冗余,符合3NF的要求的,减少了数据的不一致,减少了存储空间。但在使用这些信息的时候,则不可避免会付出更多的时间代价。(方案1相当于是对方案3预先做了各个表的连接。) 说仓库是3NF的,则它应该是符合方案3的。但实施的时候可以变通权衡,使用方案2的思路。说来说去这和仓库的处理能力又相关了,能力强就当场算,不强就冗余存用空间换时间。 越是满足3NF,离星型模式就越远,中间要做的工作就越多。星型模式的事实表,必须连接每个属性的历史状态表才能取得某一时点的视图。这可能是CDW存在的原因? innovate 20060523 比如我一个前同事问我,如果变化维的时间长了,会不会留下垃圾维度。我觉得这个问题没关系,因为数据仓库的信息保留可以分几个阶段,最近阶段(如1天/周或月),近期阶段(1月/年或者2、3年),以及历史阶段(1年,或者n年以前的数据),一般历史阶段就要放到磁带库备份了,那么我们的变化维也需要这样的处理,不然同期的事实表都处理了,维度表还保留着有何意义呢? 其实有没有必要,我们需要拿事实说话,如果哪位做过EDW数据仓库项目,且数据集市是维度建模,但是是直接过渡过去,没有使用中间层,那是否有成功案例?至少我在国内没有听说过,我见过一个国内的EDW项目数据集市没有采用维度建模方式,客户的感觉我不是很了解,但是我看得出扩展性很差。由于没有专门的维度描述,每生成一个汇总表,都会把像零次用户、使用长途用户等需要ETL出来的维的名称和对应的指标写在程序里,这样的扩展性是可想而知的,而且很难维护,因为可能多个主题需要用到这些维,你一个一个去算? 如果说EDW是否使用了大量的维度建模思想,比如建立专门的维表去描述一个维、专门的事实表去描述某个主题。不是这样的,那会产生大量冗余。比如一个主题的维、指标多达上百甚至几百,按照EDW的设计思想不应该用一个表去描述,而是不同的表关联共同组成一个主题,这样冗余很小,而采用较好的数据仓库产品也能保证较高的效率(如Teradata)。 所以如果在EDW思想里采用维度建模需要谨慎,弄不好就不伦不类,即有大量冗余而影响多表查询的效率,又没有采用Kimball的思想使维表和事实表保持一致,这样的项目可能会背离高效、高数据质量、高扩展性的终极目标。
责编:姜玲 微信扫一扫实时了解行业动态 微信扫一扫分享本文给好友 著作权声明:畅享网文章著作权分属畅享网、网友和合作伙伴,部分非原创文章作者信息可能有所缺失,如需补充或修改请与我们联系,工作人员会在1个工作日内配合处理。 |
热门博文 |
|