【摘要】:目前,关系数据库基本上可以很好地支持商务数据处理应用。我们用图15.1来说明程序设计思想从面向过程到面向对象的演变。 考虑如下对象:〈i1,939〉;〈i2,{i6,i11}〉;〈i3,{6,7}〉;〈i4,[LF:i7,RF:i8,LR:i9,RR:i10]〉。 考虑如下对象:〈i1,TCL〉;〈i2,[name:Jz,my TV:i1]〉;〈i3,[name:Ying,my TV:i1]〉。
数据库技术的发展速度很快。目前,关系数据库基本上可以很好地支持商务数据处理应用。但是有些高级应用,需要新的数据库管理技术。这类例子如计算机辅助设计(CAD)、办公信息系统(OIS)、多媒体信息系统和人工智能(AI)等。为此,面向对象数据库管理系统应运而生,原因如下。
●这些先进的应用能够明显地存储和操纵更抽象的数据类型(如图像、BIM[1]数据、CAD文档等)与提供用户自己应用特定类型的能力。关系型数据库系统处理单一的对象类型-关系,其属性来自简单的和固定的数据类型域(如数字、字符、字符串、日期等)。它无法支持应用特定类型(如文本、图像、CAD图、视频等)的显式定义和操纵。
●关系模型结构相对比较简单,呈平面型(二维)。平面关系模型中代表的结构在面对这些高级应用时会导致自然结构的丢失,而丢失的东西对于应用来说是十分重要的。例如,在工程设计应用里,被设计对象的结构不是平面型的,而是多维的。在多媒体应用里,需要描述超文本/超媒体结构,这也不是平面型的。
●关系系统提供的语言,SQL语言也存在不足。它所提供的一次一个集合(set-at-a-time)的结构也不满足新应用要求的一次一条记录(record-at-a-time)的需求。
1.对象概念
对象是面向对象数据库管理系统中的一个最基本的概念。
人们认识世界是以一些事和物为基础的,这里的物是指物体,事是指物体间的联系。面向对象中的对象是指物体,消息是指物体间的联系,通过发送消息使对象之间产生相互作用,从而求得所需的结果。总之,对象是由一组数据和与该组数据相关的操作构成的实体。
面向对象技术作为一种大有前途和现今被广泛采用的技术,其基本原则有以下三条。
●一切事物都是对象。
●任何系统都是由对象构成的,系统本身也是对象。
●系统的发展和进化过程都是由系统的内部对象和外部对象之间(也包括内部对象与内部对象之间)的相互作用完成的。
从面向对象技术的实际应用情况来看,Smalltalk语言[2]是坚持这三条基本原则的典型代表。
面向对象方法之所以会如此流行,主要是它非常适合人们认识和解决问题的习惯。首先,它是一种从一般到特殊的演绎方法,这与人们认识客观世界时常用的分类思想非常吻合;其次,它也是一种从特殊到一般的归纳方法,由一大批相同的或相似的对象抽象出新的类的过程,就是一个归纳过程。面向对象既提供了从一般到特殊的演绎手段,如继承;也提供了从特殊到一般的归纳方法,如类。因此,它是一种很好的认知方法。
从狭义上看,面向对象的软件开发包括三个主要阶段:面向对象分析(object-oriented analysis,OOA)、面向对象设计(object-oriented design,OOD)和面向对象程序设计(objectoriented programming,OOP)。其中,OOA是指系统分析员对将要开发的系统进行定义和分析,进而得到各个对象类以及它们之间关系的抽象描述。OOD是指系统设计人员将面向对象分析的结果转化为适用于程序设计语言中的具体描述,它是进行面向对象程序设计的蓝图。OOP则是程序设计人员利用程序设计语言,根据OOD得到的对象类的描述,生成对象实例,建立对象间的各种联系,最终建立实际可运行的系统。
面向对象技术的主要影响表现在编程上,从面向过程编程演变到面向对象编程。这里讨论面向对象对数据库技术的影响,我们称为面向对象数据库系统。
我们用图15.1来说明程序设计思想从面向过程到面向对象的演变。左边代表传统的面向过程的程序设计思想,右边代表面向对象的程序设计思想。

图15.1 程序设计思想从面向过程到面向对象的演变
由图15.1可知,传统的面向过程程序设计是以操作为核心的,以一个加法程序为例(见图15.1左边),围绕这个操作会涉及整型数(Int)的加法、实数(Real)的加法、字符串(String)的加法,甚至整型数和实数的加法、实数和字符串的加法等。因此,程序员会按照操作数的不同分别编写众多函数或程序。而面向对象的程序设计是以另一种形态出现的,例如以整型数(Int)为例(见图15.1),有加法、减法、乘法和除法等各种操作。
所有的面向对象数据库管理系统都是构建在对象的概念上的。
对象在建模系统中代表一个真实的客体。简单来说,它可以用一个〈标识,状态〉(即〈OID,state〉)偶对来表示,其中,OID是对象标识,对应的状态则表示对象的当前状态。对象的标识自其诞生起就始终不变,是区别于所有其他对象的永久性标识。如果它们有相同的OID,则两个对象是等价的;如果它们有相同的状态,则称它们是相等的。
令D为系统定义的域(如整数域)和用户定义的抽象数据类型(ADT)的域的并,I为用于命名对象的标识符的域,A为属性名字的域,则可以有如下定义。
(1)D的一个元素是一个值,称为原子值。
(2)[a1:v1,…,an:vn],其中:ai是A的一个元素,vi是一个值或I的一个元素,称为一个元组值;[]称为元组构成符。
(3){v1,…,vn},其中:vi是一个值或I的一个元素,称为一个集合值;{}称为集合构成符。
这些模型将对象标识看作为值(类似于程序设计语言的指针)。集合和元组是数据构成符,这对于数据库应用来说是本质的。其他构成符如列表或阵列也可加入其中,以增加建模能力。
【例15.1】 考虑如下对象:
〈i1,939〉;
〈i2,{i6,i11}〉;
〈i3,{6,7}〉;
〈i4,[LF:i7,RF:i8,LR:i9,RR:i10]〉。
其中:i1是原子对象,i2和i3是结构对象。i2是对象的OID,它的状态由一个集合构成。i4有一个元组值状态,包括4个属性(或称为实例变量),每个属性是其他对象的值。与值相比,对象支持良型(well-defined)的更新操作,它改变对象的状态而不改变对象标识。
【例15.2】 考虑如下对象:(www.chuimin.cn)
〈i1,TCL〉;
〈i2,[name:Jz,my TV:i1]〉;
〈i3,[name:Ying,my TV:i1]〉。
这些对象描述的语义是:Jz和Ying共享对象记作my TV(即它们共同拥有一台TCL电视机)。如果把对象i1的值从TCL改为Haier,则在对象i2和i3里也自动修改。
模型的行为是用方法来描述的,方法是对象上的操作。方法代表模型的行为特性。
有些对象模型干脆不区分值和对象,一切都称为对象,包括系统定义的实体和用户定义的实体。在这些系统里不再存在集合或元组构成符,对象是其他对象的特指(specializing)或泛化(generalizing)。
与关系模型相比,关系数据库模型以一种一致的方式处理数据值。属性值是原子的,它们可以构成结构值。在一个基于值的数据模型里(如关系模型),数据是用值来标识的。关系用其名字来标识,元组用其键来标识,或者是值的组合。对象模型里的数据用OID标识。
2.抽象数据类型
抽象数据类型(ADT)最初出现于程序设计语言里,后来引入数据库领域,如对象-关系DBMS。抽象数据类型是指拥有这个类型的所有对象的一个模板(template)。这时无需区分基本系统对象(即值)、结构对象(元组或集合)或用户定义对象。ADT通过提供有相同结构的数据域,以及应用于这个域上的操作(方法)来描述数据的类型。ADT的抽象能力通常是指其封装性(encapsulation),它隐蔽了操作的实现细节。这样,每个ADT通过其支持的性质展示给“外部世界”。传统的对象模型里,这种性质包括实例变量(反映对象的状态)和方法(在这类对象上可实施的操作)。有些模型里,方法被抽象为行为。
【例15.3】 下面是Car(汽车)的类型定义样例:


例15.3中的model、year、serial-no、capacity四个属性是基于值的,其他属性则是基于对象的,如engine、bumpers、tires和make。属性bumpers(保险杠)是集合值,tires(轮胎)是枚举元组值,包括左前轮(LF)、右前轮(RF)、左后轮(LR)和右后轮(RR)。我们用首字母为大写的变量来标识类型,所以engine(引擎)是一个属性,Engine是一个类型。
注意,这里为了简便,我们没有把方法列出来。
ADT提供了两个主要好处。首先,系统提供的基本类型可以方便扩展为用户定义的类型,可以方便与关系模型联系起来。其次,ADT操作可以把数据与应用程序很好地联系起来。因此有ADT的对象模型允许同时描述数据和操作。
1)综合
综合是对象模型最常用也是最强大的一个特征,它允许共享一个对象,通过指针(referential)的方式共享对象,这里的指针是指向对象的OID。例如,(i2,[name:Jz,mycar:c1])或(i3,[name:Ying,mycar:c1])就是通过指针指向Jz和Ying拥有的是同一辆车。
还有一个概念是复杂对象。综合对象和复杂对象的区别是前者可以参考共享对象,而后者却不能[3]。例如,汽车类型中可以有一个属性,其类型是一个类Tire(轮胎)。如果Car有两个实例c1和c2,则它们参考的不一定是Tire的相同属性集,因为车商不希望自己的轮胎与其他车用的一样。
2)类
很多对象数据库管理系统不区分型(type)和类(class)。其根源更易追溯到面向对象的程序设计语言,如Smalltalk和C++,其中只有类的概念。那里,类扮演两种角色:共性对象的模板和共性对象的集合。
确切来说,型和类是有区别的,型是共性对象的模板,而类是有相同型的对象实例的集合。
3)子型和继承性
对象系统允许使用用户定义型(user-defined types),由系统来定义和管理,提供可扩展性。这可以从两方面实现:使用型构造器或基于现有基本型通过子型化处理来定义。子型化是型的一种特指(specialization)。如果A接口是B接口的超集,则型A是型B的特指。因此可以说,特指的型比原型定义的内容更多。一个型可以是多个型的特指,可以是型子集的子型。常用is-a来描述子型和型之间的关系,如这里的A is-a B。
除能够扩展型外,子型化也对数据库模式形成的型系统造成了冲击。大多数情况下,可以将型看成是树状的型系统,即根是一个唯一的最小特指型。Smalltalk就是这么一个系统,而且还有限制,即一个型只能是一个型的子型。C++则允许一个型存在多个根。这样,型的产生形成一个图。因此,确切来说,一个型形成的是一个格(lattice),称为型格(type lattice)。
在对象数据库中,型格描述了数据库模式。
【例15.4】 现在分析一个型,命名为Car,用于描述小汽车,它是交通工具(Vehicle)的一个特定型。所以,Car是Vehicle的一个子型。摩托车(Motorcycle)、卡车(Truck)、巴士(Bus)可以是Vehicle的其他子型。这样,Vehicle应当定义其公有性质:

这里,Vehicle被定义为Object的一个子型,就像Smalltalk中常用的那样。Object被看成是型的根。显然,Vehicle是Car的泛化。
Car可以定义为:

这里,Car is-a Vehicle,因此继承Vehicle的属性和方法。说明一个型是另一个型的子型,这就产生了继承问题。
相关推荐