14.4.2 面向对象数据模型

2025-06-09 00:11:25 更新

数据模型是现实世界对象或实体,以及对象的约束和对象间联系的逻辑组织。面向对象数据模型借鉴了面向对象的概念,是面向对象数据库系统所必须支持的数据模型。

面向对象数据库系统是以面向对象数据模型为基础的,是当今数据库技术发展的一大趋势。对于面向对象数据模型,己经有许多基本概念达成了共识,但是仍然缺少一个统一的严格的定义。面向对象数据模型可以看作是一个更高层次上的实现数据模型的新成员,它经常被用作高层概念模型,尤其在软件工程领域中更是如此。

一系列面向对象的概念构成了面向对象数据模型的基础。概括起来,面向对象数据模型的基本概念有对象、类、继承、对象标识、对象嵌套等,下面将一一加以介绍。

1. 对象结构

我们可以认为一个对象对应着E-R模型中的一个实体。对象中封装的属性和方法对外界是不可见的,对象之间的相互作用要通过消息来实现。一般来讲,一个对象有如下相关内容:

(1) 属性集合:一个对象的属性值构成了该对象的状态,类似于关系数据库中关系元组的属性。属性的值域可以是任何类,包括原子类,如整型值、字符串等。一个属性可以有一个单—值,也可以有一个来自于某个值域的值集,即一个对象的属性可以是一个对象,从而形成了跋套关系。

(2) 方法集合:一个对象的方法作用于该对象的状态上,同一类对象所有操作的实现相同。方法的定义和实现:定义规定了方法名称、参数的个数和类型、返回值的类型,以及可能的语义描述;实现是一段代码,用来实现方法的功能。方法的定义和实现是相互分离的,为程序员提供了极大的灵活性,甚至可以用不同的语言实现不同的操作。

(3) 消息集合:消息是发送给对象以存取属性值的,除了通过对象所指定的公共界面外,没有其他方法可以访问该对象。对象接收外部传送的消息,执行相应的操作,操作的结果同样可以以消息的形式返回。

2. 对象类

在面向对象数据库中,类是一系列相似对象的集合,对应于E-R模型中的实体集概念。类是面向对象系统和数据库系统之间最重要的连接。首先,类直接说明了一个实例及其所属类之间的实例关系;其次,类提供了构成查询的基础;再次,类可以用来增加面向对象数据库的语义完整性;最后,类提出了所有对象的属性和方法的规格说明,便于生成对象。每个对象是它所在类的一个实例。类的概念类似于关系模式,类的属性类似于关系模式中的属性;对象类似于元组,类的一个实例对象类似于关系中的一个元组。如果把类本身看作一个对象,则称之为类对象。与其相关的属性集和方法集适用于该类对象而不适用于该类的实例,这样的属性和方法称之为类属性和类方法。一个类的类属性常常用来描述该类的实例的聚集特性。例如,所有学生实例的“平均年龄”就是一个聚集特性的例子。

3. 继承与多重继承

在面向对象数据模型中,所有类形成了一个有限的层次结构或者是有根的无环有向图,我们称之为类层次。如有一个类C和一个连接到C的一组较低层类的集合S,则集合S中的类称为类C的子类,而类C又称为集合S中类的父类。集合S中的任何类继承类C的所有属性和方法,并可以有自己定义的属性和方法。一个父类可以有多个子类,一个子类也可以有多个父类,都存在直接关联或者间接关联的现象。

在面向对象数据模型中存在着两种继承:继承(单继承)和多重继承.在大多数情况下,类的继承足以满足应用的要求,典型的树型结构组织用来表示类层次。在树型结构组织中,每个类最多有一个父类,即一个子类只能继承一个父类的属性、方法和消息。然而,有些情况用树型结构并不能很好地表达类层次。多重继承允许一个类从多个直接父类中继承属性、方法和消息,此时类层次可以用一个有向无环图来表示。

在图14-10中给出了一个学校数据库的类层次结构图,通过它我们分别来解释类层次、继承和多重继承。

在这个学校应用的面向对象数据库系统中,“人”是其他所有类的父类,它是这个有向无环图的报,是一个最高的类层次;在下面的一个类层次中,教工和学生是人的子类,它们继承了人的所有属性、方法和消息,同时又有本身的特殊属性、方法和消息;在最低的一个类层次中,教师、行政人员、工人和在职研究生是教工的子类,它们继承了教工和人的所有属性、方法和消息,在职研究生、研究生和本科生是学生的子类,它们继承了学生和人的所有属性、方法和消息。值得一提的是,在职研究生既是教工的子类,也是学生的子类,它同时继承了教工

和学生两个父类的所有属性、方法和消息。

类的继承带来很多的优点,子类在继承父类特性的同时,还可以定义自身的属性、方法和消息,但这样就可能和父类的属性、方法和消息发生冲突。这类冲突可能发生在子类和父类之间,通常由系统解决。对于子类和父类之间的同名冲突,一般是以子类定义的为准。但是在多

继承中,一个子类可以有多个父类,如果这些父类中存在同名冲突,就会发生二义性。例如,教工和学生都有方法"显示信息",它们共同的子类在职研究生就不知道应该继承哪一个方法了。在多继承中有三种处理二义性的方案:一是由用户选择继承的优先次序;二是由系统指定继承某一个父类的定义;三是如果出现了二义性问题,就不允许多继承,甚至有些面向对象数据库系统根本不允许多继承。

4. 对象标识

每个对象有一个唯一的、由系统生成的对象标识(Object Identifier, OID)。OID的值对外部用户来说是不可见的,但是系统会在内部用这个值唯一地标识每个对象,并用这个值创建和管理内部对象引用。

相对于非面向对象数据模型和程序设计语言来说,对象标识给出了一种更强的标识概念,几种常用的标识形式如下:

(1) a:用于标识的一个数据值,这种形式的标识常在关系数据库中使用。如一个元组的主码标识了这个元组。

(2) 名称:用于标识的用户提供的一个名称。在程序设计语言中,用户赋予每个变量一个名字来标识它:在文件系统中,用户给每个文件赋予一个名称来唯一地标识这个文件。

(3) 内置名:以上两种标识是由用户给出的,而内置名则是一种由系统来提供的标识。这种形式的标识在数据模型或程序设计语言中使用。不同的标识符其持久性程度是不同的,主要有以下几种:

(1) 过程内持久性:标识只有在单个过程的执行期间才是持久的,如过程内的局部变量。

(2) 程序内持久性:标识只有在单个程序或查询执行期间才是持久的,如程序设计语言中的全局变量、内存指针,SQL语句中的元组标识符。

(3) 程序间持久性:标识在从一个程序的执行到另一个程序的执行期间都保持不变,如指向磁盘上的文件系统数据的指针提供了程序之间的标识,SQL语句中的关系名也具有程序间持久性。

(4) 永久持久性:标识的持久性不仅仅跨越了各个程序的执行,还跨越了数据结构的重新组织。这种持久性正是面向对象系统所要求的。

对象标识符必须具有永久持久性,也就是说,特定对象一经产生,系统就赋予一个在全系统中唯一的对象标识符,应该是固定不变的,一直到它被删除。面向对象数据库系统必须具有生成对象标识并维护其永远不变性的机制。

标识符通常是由系统自动生成的,不需要用户来完成这项工作。然而在使用这种功能时要注意:系统生成的标识符通常是特定于这个系统的,如果要将数据转移到另一个不同的数据库系统中,则标识符必须进行转化。而且,如果一个实体在建模时已经有一个系统之外的唯一标识符,则系统生成的标识符就可能是多余的。如身份证号码可以作为个人的唯一标识符。

早期的面向对象数据模型要求把所有的一切表示为对象,无论是一个简单的值还是一个复杂的对象,导致这样的情况出现:两个整型数值10和20,需要创建两个具有不同OID的对象。

这种模型需要生成很多的对象标识符,很不实用。因此,大多数的面向对象数据库系统允许有对象和值两种表示方法,即每个对象必须有一个永远不变的OID,但是值没有OID,值只是代表它自己。

5. 对象嵌套

对象嵌套是面向对象数据库系统中的一个重要概念。

在面向对象数据模型中,对象的一个属性可以是一个单一值,也可以是一个来自于值域的值集,即一个对象的属性可以是一个对象,形成了嵌套关系,产生了一个嵌套层次结构。一个对象被称为复杂对象,如果它的某个属性的值是另一个对象。复杂对象主要分为两类:

非结构化的复杂对象和结构化的复杂对象。非结构化的复杂对象通常是数据库系统不明结构、需要大量存储空间的数据类型,如图像或大文本对象。结构化的复杂对象是指数据库系统清楚对象内部结构,并可以通过递归生成的对象。

关系模式是对一个二维关系的描述,具有平面的结构。前面讲到的类层次结构形成了对象间的纵向关系,这里的对象嵌套层次结构则形成了对象间的横向关系,我们通过图14-11来说明。每台笔记本电脑包括:产地、型号、外部设备和内部器件等属性。其中产地和型号的数据类型是字符串,外部设备和内部器件都不是标准数据类型,而是对象。外部设备包括:外接鼠标和外接光驱等属性;内部器件包括:显示器、CPU、内存、硬盘等属性:外接光驱也是一个对象,包括:产地、型号、功率等属性。这样一种嵌套层次结构允许不同的用户采用不同的粒

度来观察对象,突出了对象的特征,隐藏了不必要的信息,简化了查询。