DW2.0包含的内容是非常宽泛的。它包括企业内的所有数据,也包括外部数据;它包括昨天的数据,也包括今天的数据。在一些大型跨国企业中,DW2.0包含内容的范围是相当庞大的。

而且,DW2.0中的数据还要保存到非常细的粒度。

这样,为了满足企业的各种需求,就使得DW2.0的设计和构建变得非常复杂,需要高深的技术。

尽管DW2.0的设计面对的是如此的困难和挑战,事实上它是可以被很好的完成的。这需要在DW2.0的构建过程中很好的平衡大的企业的视角和琐碎的细节之间的关系。

那么,这样的一个DW2.0环境的构建模型是如何来实现的呢?在建立这样一个大的模型时,设计者应该从什么地方入手呢?

构建DW2.0的入手点应该是建模的过程。在构建DW2.0时有两种基本的模型,一种是业务处理过程模型(Process Model),另一种是数据模型(Data Model)。业务处理过程模型包括HIPO图表、功能分解图和数据流向图等内容。数据模型包括ERD图、物理数据规划,数据项集等内容。

业务处理过程模型应用于数据集市环境。数据模型应用于整合区、近线区和归档区。

交互区的设计需要同时参考业务处理过程模型和数据模型。

数据模型

数据模型是DW2.0中整合区、近线区和归档区的核心,它有三个不同的级别。这三个级别分别是ERD级别(Entity Relationship Diagram,实体关系图),DIS级别(Data Item Set,数据项集)和物理模型级别(Physical Model)。其中的每一个级别都有自己独特的地方,并且每一个级别都是数据模型的必要部分。

这种针对不同级别的建模有一个很大的特点,就是虽然各个级别有显著的区别,但是它们之间无论从技术上还是知识上都是相互关联的。每一个级别的建模都提供了数据的不同层次的视角。

ERD级别的数据建模的是最高的级别,反映的也是最高视角的数据特点,它是数据的高度抽象。做一个类比,ERD级别就好比一个地球仪。就像地球仪展示了所有的大陆和所有的国家及其位置关系一样,ERD展示了各个数据集合之间的关系。ERD数据模型的本质是高度抽象的模型的全集。

DIS级别是中等级别的建模,DIS模型好比地球上某一个国家或者国家内某一个州的地图,例如德克萨斯州的地图,人们不会期望这张地图能提供新加坡或者非洲的周边情况。这张地图比地球仪要细节得多,在州地图上记录着一些在地球仪上根本看不到的城市。DIS关注的是地球仪的某一个子集,并且包含地球仪上没有的更详细的信息。

物理模型是低级别的建模,也是最细节的建模。物理模型好比一个城市的地图,它的范围比DISERD要小。从另一个角度讲,物理模型的细节程度要比另两个级别细,物理模型可以记录如邮局、学校、公园等的位置。城市地图包含的范围比州地图要小,但是包含了更多的细节信息。

这三个级别的数据建模之间有着密切的关系。

ERD模型

ERD模型包括两个主要的部分,一个是实体,或者说是企业的主题域,另一个是这些主题域之间的关联。

实体是数据的最高级别的抽象。作为最高级别抽象的一个例子,我们来考虑一个实体,客户实体。客户实体可以包括企业客户,也可以包括个人客户,它可以包括以前的客户,也可以包括潜在的客户等等。总之,各种类型的、各种状态的客户都被高度抽象成一个客户实体。

实体之间的关联也包含在ERD中。关系(Relationship)用来标识这种实体间的关联,通常,需要给这种关联加上一个简短的描述信息。

举几个实体间关系的例子,如客户可能会下一个订单、发货人可能会接受一个包裹、一个订单可能会包含一个产品等等。

关系的一个特点是关系直接关联两个实体,一个关系不可能关联三个或者更多的实体。

一个特殊类型的关系是递归。递归关系描述的是发生在两个相同实体上的关系。递归关系的一个简单的例子是,父亲和女儿的关系。父亲和女儿都是属于同一个实体的,这个实体就是人。所以在人这个实体上就会建立递归的关系。

正因为ERD建立在这么高度抽象的级别上,一般企业内建立的ERD不会很大。在企业建立其他数据模型前,应该首先建立好ERD模型。

DIS模型

DIS模型是数据模型中位于中间级别的一部分。在DIS模型中,属性和键以及其他数据和关系被标识出来。

ERD模型中的每一个实体(或者主题域)对应一个DIS模型。DIS模型细化了ERD模型的每一个实体。

对应于DIS中的每一部分有一个不同的物理数据模型。

每一个DW2.0的开发者都面对着一个问题,就是在开始开发DW2.0的时候,全部的详细的数据模型是否应该先建立完全。答案是不需要。如果要等到所有的数据模型都建立完全才开始进行数据仓库的开发,那么就不会有数据仓库被建立出来了。数据仓库的建立方式是一种增量开发的模式。首先建立数据仓库的一部分,接着建立另一部分。

举例来说,首先完整的ERD模型需要建立好,然后建立ERD模型中某一个实体的DIS模型,然后建立该DIS模型的物理数据模型。这时,ERD数据模型中的其他实体对应的数据模型还没有建立。尽管大部分数据模型还没有建立,但是针对建立好的这部分模型可以先进行开发。

接着,再逐步建立针对其他实体的DIS模型和物理数据模型。

接着再建立下一个。

随着这种逐步的迭代过程,整个数据仓库被建立起来,完整的数据模型也被建立起来。

这种迭代式建立数据仓库的过程可能会经过很多次迭代,由很多个项目共同完成。

从某种观点来看,企业完整的数据模型就好像一个拼图,一次放入一块,最终可以拼成一个完整的图案。

这里有另一个问题,上一章建立方法学中提到正因为迭代是采用的同一个数据模型所以才可以将每次迭代的结果整合在一起,这一章又说不需要建立好全部的数据模型,经过多次迭代的过程逐步建立好完整的数据模型,这看起来是矛盾的。

我的理解是,前一章提到的采用的同一个数据模型指的是ERD模型,InmonERD讲的主题域模型,也就是常说的数据仓库是按主题建立的那个主题的意思。这个模型是高度抽象的数据模型,这个模型应该在数据仓库开始开发时建立好,它是企业完整的数据模型的基础,DIS和物理数据模型是ERD的细化。

而这一章中讲的不需要完整的数据模型的意思是建立数据仓库时不需要将针对所有主题的DIS和物理数据模型都建立好,但是ERD模型是应该先建立好。Inmon这里提到的物理数据模型应该和我们常说的物理数据模型在范围上不太一样,这里的物理数据模型应该对应的是一个表及其相关的物理特性,我们常说的物理数据模型是针对一个项目的全部表的物理模型。

总之,企业的ERD模型即主题域模型应该在建立数据仓库的开始时先建立好,在这个ERD模型的基础上,可以逐步开发针对不同主题的DIS和物理数据模型。

数据模型的来源

企业的数据模型应该如何来建立?有一种方法是根据企业的情况采用客户化定制的方式来设计出来。这种从头设计企业的数据模型的方法是昂贵的,它需要很长的时间。这种做法通常也是没必要的。

我们可以考虑,两个保险公司的数据模型基本上是相同的,两个银行的数据模型基本上也是相同的,两个制造业的数据模型也很相似。也就是说,同一个行业内的数据模型是相似的。

所以如果已经有几个银行已经建立了自己的数据模型的话,我们为什么还要去重新发明车轮呢。为什么不和他们合作呢,完全可以参考他们已经建立好的数据模型。实际中,可以买也可以租他们的数据模型,再根据自己企业的需要来修改、增减。在一个通用的数据模型的基础上建立企业数据模型比自己从头设计要快很多,花费也要节省很多,尤其是当这个行业的数据模型已经比较成熟时。

如果你找不到另一个企业愿意和你共享数据模型,有互联网或者书籍中两个地方可以提供数据模型。第一个地方是一个互联网站,上面有免费的数据模型,这个网站是http://www.inmoncif.com。另一个地方是Len Silverson的书,他的书讲的是通用数据模型,可以在Amazon.com买到。当然还有其他很多地方可以找到通用数据模型。

Len Silverson的书名是《The Data Model Resource Book》,共有两本,这两本书已经被翻译成中文了,书名是《数据模型资源手册》,网上有第一本的英文版可以下载,第二本的英文版还没看到。

当得到或者考虑采用通用数据模型时,需要注意的是通用数据模型对我们来说并不是完善的数据模型。不管通用数据模型是多么完整、多么复杂,我们在使用时都需要根据企业的实际情况来对它进行修改和增减。

事实上,人们更擅长修改和增减,人们不擅长从一张白纸开始设计。通用数据模型的作用就是把人们从创作者的位置推到编辑者的位置。

还有一点需要注意的是,通用数据模型分为两种,一种是通用操作型数据模型,另一种是通用数据仓库数据模型。当我们基于通用数据模型建立数据仓库时,要注意是以通用数据仓库数据模型为基础,而不是通用操作型数据模型。

建立数据模型

建立数据模型的第一步是选择主题,建立主题域模型,也就是高级别的实体模型。当主题域模型建立好之后,接下来要做的是将所有的数据分成两类,分别是原始数据(Primitive Data)和派生数据(Derived Data)。

原始数据是最低粒度的数据,是不能再进行细分的数据。原始数据的例子如,客户名称、客户地址、客户存款金额等等。

派生数据是可以由更细粒度的数据经过计算、汇总等数据处理得到的数据。派生数据的例子如,客户数,月销售额,日交易量等等。

数据模型中不要包含派生数据。有一个很好的理由可以说明数据模型中不应该包含派生数据。这个理由是派生数据变化的非常快。如果数据模型中包括派生数据的话,定义、计算和使用派生数据会导致数据模型经常变化。这种变化会给数据建模者带来很大的问题。因此,派生数据是不应该进入数据模型的。

数据模型中不应该包含派生数据的另一个原因是派生数据会使数据模型过于膨胀。派生数据会使数据模型变得过大而不实用。而且,由于派生数据经常变化,也会使数据模型始终不能完成。

移除派生数据后,下一步要做的是选择一个主题进行开发。有时,一个主题过于庞大,这时可以选择这个主题的一个子集进行开发。

通常来说,建模者对业务的理解越深刻,建立的模型越完善。

选择好主题后,下一步要做的就是针对这个主题开发DIS模型。

DIS模型描述了该主题内的数据。分析与该主题相关的业务需求,找出相关的键、属性、标识、表等内容。这些键、属性、标识等都需要被建立到DIS模型中的不同部分中。

DIS模型中的第一部分数据是根数据(Root Set)。根数据是该主题的一些特点、标识等内容,如当主题是人时,根数据就包括人的标识,如身份证号码。如果主题是企业,根数据就包括企业的唯一标识,如工商注册号。

根数据也包括与主题直接相关的其他属性信息。

DIS模型中的第二部分数据是类型数据(Type of Data)。类型数据描述了该主题的不同类别。例如,如果主题是客户,不同的类别包括客户类别,如历史客户、潜在客户等。也可以包括客户的其他的分类方式,如高消费客户、商业客户、个人客户等内容。客户在每个分类方式中的类别应该是唯一的。

DIS模型中的第三部分数据是重复性的数据(Multiply Recurring Data)。例如,主题是人,重复性的数据包括这个人的多次的教育经历,这个人的多个小孩的信息,这个人曾经参加的工作单位等等。

DIS模型的内容包括

-

-属性

-外键

需要注意到的是,键只是标识,它不一定是唯一的。

重复性的数据以普通的层级关系依赖于根数据。

另外需要注意的是,类型数据中也可能有重复性的数据,重复性的数据中也可能有类型数据。(这句话表达的不清晰,我的理解是,这里的类型数据就是我们常用到的类型表,而重复性的数据是主实体的子表,如前面提到的工作经历情况,一个人有三次工作经历,重复性数据建立工作经历表,里面就会有三条记录。类型表的描述如果复杂的话,类型表的某些属性也可能会建立子表。而像工作经历这样的子表中的某些属性也可能会用类型表来描述。

在数据仓库的开发过程中,所有的纯操作性数据应该被删除掉。例如,电话号码就是典型的纯操作型数据。在DIS模型中没有时间元素的情况下,需要添加时间元素。

DW2.0建模的另一个需要考虑的问题是设置默认值。有时源系统不能提供DW2.0需要的所有数据值,这种情况下,为源系统中没有的数据提供默认值是有必要的。

合并数据项在DW2.0的建模中也是有可能使用到的。在源系统中属于不同地方的数据,如果在DW2.0中经常在一起使用就可以考虑将它们建立在一起。也就是说,如果不同的数据项经常在一起使用,可以考虑建立在同一张物理表中。例如,使用重复组技术。

DW2.0中的DIS模型中的另一项常用的技术是建立概要数据(Summarizations)。如果数据经常在较高的级别被使用,即在较高粒度使用,那么可以为数据建立概要数据。概要数据也是派生数据,通常来说概要数据是不能建立在数据模型中的,但是如果概要数据能被很广泛的使用的话,也可以建立概要数据。

DIS模型建立之后,可以开始建立物理数据模型。物理模型中保存的是有物理特性的各个属性。在建立物理模型时,各种物理信息被包含进来,如表名、相关表、键、索引、属性名、属性类型、属性长度等内容。