420 likes | 618 Views
第 12 章 面向对象数据库. 12.1 面向对象数据库概述 12.2 面向对象数据模型 12.3 面向对象数据库管理系统 12.4 对象 - 关系数据库. 12.1 面向对象数据库概述. 12.1.1 面向对象数据库的产生背景 12.1.2 面向对象数据库设计思想 12.1.3 面向对象数据库的应用和功能 12.1.4 面向对象数据库的发展前景. 12.1.1 面向对象数据库的产生背景.
E N D
第12章 面向对象数据库 • 12.1 面向对象数据库概述 • 12.2 面向对象数据模型 • 12.3 面向对象数据库管理系统 • 12.4 对象-关系数据库
12.1 面向对象数据库概述 • 12.1.1 面向对象数据库的产生背景 • 12.1.2 面向对象数据库设计思想 • 12.1.3 面向对象数据库的应用和功能 • 12.1.4 面向对象数据库的发展前景
12.1.1 面向对象数据库的产生背景 • 关系数据库有许多优点,但它存在以下局限性:数据模型强调数据的高度结构化,面向机器而不是面向用户;数据类型简单、固定;结构与行为分离,语义表达能力差;将复杂对象分解为多个基本关系来管理,查询实现复杂等等。 • 随着计算机应用领域的拓广,关系数据库系统已不能满足新的应用领域如计算机辅助设计/制造(CAD/CAM)、计算机辅助软件工程(CASE)、地理信息系统(GIS)、办公自动化系统(OAS)等的需要,这些应用领域面临的共同问题是大型工程复杂数据的管理问题。新一代应用系统提出了以下要求:
12.1.1 面向对象数据库的产生背景 • (1)支持复杂的数据类型。新一代应用领域的数据往往是几十种或上百种元素组成的对象,具有许多传统数据库中没有的数据类型,如变长数据、非结构化字符串、图形、图象、声音、动画信息等,这些信息在传统数据库中一般难以描述、操纵和检索。 • (2)支持复杂的数据结构。工程设计往往是采用分层的设计方法(自顶向下或自底向上),分层设计不仅要求有层次结构,而且对于不同的设计对象,层次数目也不一样。 • (3)对象实例和类的演进。工程设计是一个渐进的过程,特别是在大规模应用中,类是随着环境、需求、研究人员研究的深入而发生变化的,这些变化称为模式演进。
12.1.1 面向对象数据库的产生背景 • (4)支持工程事务管理。工程事务的特点表现为长时间、协作性和试探性。传统数据库的并发控制策略无法满足这类事务的要求。 • (5)一个复杂对象有许多子对象组成,而这些子对象又有多个版本,这就需要用版本配置来组合成一个合理的复杂对象。持久性对象也同样存在版本的管理问题。 • (6)航式查询和关联查询访问。复杂应用中的对象-关系是大型的树状结构,需要系统提供在对象图中的高效导航能力,特别是多媒体对象实时性强,要求更高的交互性能。另一方面,大型应用通过关联查询来访问对象也是必须的。
12.1.1 面向对象数据库的产生背景 • (7)支持分布式系统中独立于平台的大型对象的存储。新一代应用领域表现为数据密集,如图形图象等多媒体对象需要占用大量的存储空间,所以系统提供有效的存储和控制手段是十分必要的。 • (8)对约束、触发、规则等方面的支持。新一代应用系统的特点是对象的结构和操作非常复杂,有着丰富的语义信息。为了保证数据库的完整性和一致性,引入约束机制是非常必要的。 • 因此,把先进的面向对象机制和方法与数据库技术相结合而形成新一代的面向对象数据库系统是面向对象技术和数据库技术发展的必然产物。
12.1.2 面向对象数据库设计思想 • 面向对象数据库的基本设计思想是一方面把面向对象语言向数据库方向扩展,使应用程序能存取并处理对象,另一方面扩展数据库系统,使其具有面向对象的特征,提供一种综合的语义数据建模概念集,以便对现实世界中复杂应用的实体和联系建模。具体的策略或方案有以下几种: • (1)建立全新的数据库模型和数据语言。不借助现有任何系统,开发一个全新的面向对象的数据库语言和数据库管理系统。
12.1.2 面向对象数据库设计思想 • (2)用对象能力扩充数据库SQL语言。在SQL语言中加入面向对象机制的方法多为关系数据库厂商所采用,目前流行的关系数据库系统如Oracle、Sysbase、Informix等都按这种方式进行了扩充,使其具有一定的面向对象功能。 • (3)用数据库能力扩充面向对象程序设计语言(OOPL)。OOPL本身就具有抽象数据类型、继承、封装等特征,扩展仅需加入数据库特征,如持久性、事务管理、查询等。 • (4)提供一个可扩充的面向对象的数据库管理系统类库。这些类库包含若干系统类,用于提供事务控制、对象簇聚的方法等。
12.1.2 面向对象数据库设计思想 • (5)把面向对象语言结构嵌入到传统的宿主语言中。这类似于把SQL语言嵌入到C、FORTRAN等语言中,用这种方法实现的典型产品是O2 。 • (6)为特定的应用领域提供一个底层的面向对象数据库管理。这种方案无法提供一个通用的数据库环境,所以只能针对特定应用领域。
12.1.3 面向对象数据库的应用和功能 • 1.面向对象数据库的应用 。面向对象数据库的应用主要集中在以下几个方面 : • (1)计算机辅助设计/制造(CAD/CAM) • (2)计算机集成制造系统(CIMS) • (3)计算机辅助软件工程(CASE) • (4)地理信息系统(GIS) • (5)办公自动化系统(OAS) • (6)超大规模集成电路设计(VLSI Design)
12.1.3 面向对象数据库的应用和功能 • 2.面向对象数据库的功能 : • (1)复杂的信息建模能力 (2)语义模式的设计 • (3)丰富的约束管理 (4)动态模式演进 • (5)大规模数据管理 (6)对象的版本管理 • (7)可伸缩性事务管理 (8)计算完整的数据库编程语言
12.1.4 面向对象数据库的发展前景 • 十多年中,面向对象数据库领域得到了很大的发展,已有许多实用的面向对象数据库系统面世。面向对象的方法尤其适合于表示结构化的知识的特点,预示着面向对象数据库向智能型数据库即知识库的方向发展。智能型数据库的许多领域已开始使用面向对象数据模型技术,并产生了巨大的效果。 • 但是,目前面向对象数据库系统还存在一些问题,如缺乏坚实的形式化理论支持,没有一个切实可行的标准,缺乏数据库的许多功能,产品之间的兼容性和可移植性较差;不能与关系数据库系统兼容,没有提供使关系数据库和面向对象数据库相互转换的“通道”;缺乏关系数据库系统成功使用的一些功能特点,如非过程化查询语言、视图、授权等等。
12.1.4 面向对象数据库的发展前景 • 为了解决以上这些问题,面向对象数据库还需更深一步的研究。以下是几个研究方向: • 1.标准化和形式化。对面向对象的数据模型和相应的程序接口语言进行标准化是必要的。在面向对象的数据库建立之前,强调对面向对象核心概念的某些方面进行形式化也是必要的。 • 2.性能改进 。从一代数据库技术向另一代转变,程序员的工作变得相对容易的同时,数据库系统的性能成为要考虑的主要问题。因此需要投入相当多的研究和开发力量,改善新一代数据库的性能,使其达到一种可接受的水平。
12.1.4 面向对象数据库的发展前景 • 3.数据库的异质混合。管理异质数据库混合是面向对象数据库系统付诸实现的过程。 • 4.数据库工具 。面向对象数据模型的丰富语义是它的优势所在。一方面,它使用户很容易建立他们的应用系统,但另一方面,具有类等级和类复合等级的面向对象数据库模式的复杂性使数据库的逻辑设计和物理设计问题变得相当复杂。所以,为面向对象数据库的逻辑设计和物理设计提供有效的设计工具比关系数据库更为迫切。
12.1.4 面向对象数据库的发展前景 • 5.附加的数据库特征 。在视图、演绎能力、语义模型、长事务处理模型等数据库特征方面进行附加。 • 6.可扩充的结构 。(1)支持不同的数据模型。在面向对象数据库中,对面向对象数据模型做小的改变可能会引起数据库系统结构产生重大变化。 (2)支持语义扩充。由于版本的语义在设备之间存在着不同程度的差异,所以一种比较有价值的方法是对版本提供一个分层结构,在低层支持一个通用的低级版本语义的基本机制,将高层作成可扩充的适合各种特定设备的版本语义。
12.2 面向对象数据模型 • 12.2.1 对象 • 12.2.2 类 • 12.2.3 类层次 • 12.2.4 继承 • 12.2.5 多重继承性 • 12.2.6 对象标识 • 12.2.7 对象包含
12.2.1 对象 • 对象(Object)是现实世界中的一个实体在计算机系统中的抽象表示。一切概念上的实体都可以称作对象,如一个数字、一个人、一本书、一所学校。对象是包含属性和方法的封装结构。一个对象包括以下几个部分: • (1)实例变量集合。实例变量也称属性。所有实例变量的集合构成对象数据的数据结构,每个实例变量的值本身也是一个对象。 • (2)消息集合。消息指的是不考虑特定实现细节情况下对象间请求的传递,每个消息都能由该对象接收和响应,是对象对外提供的界面。 • (3)方法集合。方法是指加在对象上的操作。每个方法都是实现一个消息的程序编码,它返回一个值作为对消息的响应。
12.2.2 类 • 类(Class)是具有相同特征(相同数据结构和相同操作)的对象的集合。每一个对象成为它所在类的一个实例。一个类中的所有对象共享一个公共的定义,尽管它们对变量所赋予的值不同。 • 类与对象是相对的,可以把类本身也看作一个对象,称为类对象,它包含如下内容: • (1)一个集合变量,它的值是该类的所有实例对象所组成的集合。 • (2)消息new,表示建立这个类的一个新实例。 • (3)实现消息new的方法及其程序代码。
12.2.3 类层次 • 在面向对象模型中,一个类可以是另一个类的子类,或反之,一个类可以是另一个类的父类(又称超类)。这样,面向对象模型的一组类可以形成一个有限的层次结构,称为类层次。在一个类层次中,一个类继承其所有超类(包括超类的超类)的全部实例变量、方法和消息。 • 在类层次结构中,从上而下是一个特殊化的过程,子类是超类的特例。反之,自下而上是一个普遍化、抽象化的过程,超类是子类的概括,子类与超类之间的关系是IS-A关系。
职工 工人 管理人员 清洁工 焊工 钳工 • 图12.1 类层次结构图 12.2.3 类层次 • 图12.1是一个企业职工数据库的类层次结构的例子:
12.2.4 继承 • 继承(Inheritance)是面向对象系统中最重要的概念,是自动地共享类、子类和对象中的实例变量和方法的机制。上层对象具有的变量和方法,下层对象可以继承,从而使得具有不同结构但有层次联系的对象可以共享它们共同部分上的方法。 • 在面向对象系统中,对象是封装的,如果没有继承机制,类中的实例变量和方法就可能出现大量重复。 • 例如,工人类和管理人员类同为职工类的子类,都有姓名、性别、年龄等属性,因而可以将工人和管理人员共有的属性和方法在职工类中定义,工人特有的属性和方法在工人类中定义,管理人员特有的属性和方法在管理人员类中定义。
12.2.5 多重继承性 • 在多数情况下,类的树形层次结构可以满足实际应用需要,在这些树形结构中,一个类的所有超类都在层次结构中互为祖先或后代,即任何两个超类之间都是祖先和后代的关系。但也有一些应用场合,仅有树形层次结构是不够的。 • 多重继承性可以解决此类问题。它是指一个类具有从多个超类中继承变量、方法和消息的能力。在多重继承情况下,类―子类的关系可用一个有向无环图(DAG)来表示,其中一个类可有多于一个的超类。
12.2.6 对象标识 • 面向对象模型提供了一种机制,使得系统中任何对象都是唯一的,每个对象实例都被赋予一个唯一的标识符,作为对象的标识。在对象创建时由系统自动生成的,在概念上独立于对象的状态和行为。对象标识一旦生成是不能改变的,即使对象的状态发生了变化而对象标识不变,还是被看作同一对象。用户可以查看、查询对象标识,但不能改变它的值。 • 对象标识的概念是一个比在程序设计语言或不是基于面向对象的数据模型中所用到的标识概念更强的概念。 • 内置标识是数据模型或程序设计语言中内置的一种标识方法,不需要用户提供标识符。面向对象模型使用这种标识,每个对象在创建时由系统自动赋予一个标识符。
台式计算机 主机 显示器 键盘 鼠标 机箱 电源 硬盘 软驱 • 光驱 • 图12.2 台式计算机结构的包含层次 12.2.7 对象包含 • 对象的变量的值也是一个对象,这就在对象之间产生一个嵌套层次结构。假设Object1和Object2是两个对象,如果Object2是Object1的某个变量的值,则称Object2属于Object1,或Object1包含Object2,也称Object2是Object1的子对象。 • 包含其他对象的对象称为复杂对象或复合对象。可以存在多层包含,图12.2所示的情形就产生了对象间的包含层次。
12.2.7 对象包含 • 包含是面向对象模型的一个重要概念,它允许不同的用户从不同的角度来观察数据。如一个显示器制造商可以只专注于显示器对象,而不用去关心主机类的对象。 • 在某些应用中,一个对象可能要包含在多个对象中,这时包含关系要用一个有向无环图(DAG)而不是用层次来表示。
12.3 面向对象数据库管理系统 • 12.3.1 类管理 • 12.3.2 对象管理 • 12.3.3 对象控制
12.3.1 类管理 • 类管理主要负责对类的定义、类的操作进行管理,具体包括: • (1)类定义。包括定义类的属性集、类的方法、类的继承性以及完整性约束条件等,通过类定义可以建立一个类层次结构。 • (2)类层次结构的查询。包括对类的数据结构、类的方法、类间关系的查询等。 • (3)类模型演进。面向对象数据库模式是类的集合,类模式为适应需求的变化而随时间不断变化称为类模式演进,它包括创建新类、删除或修改已有的类属性和方法等。
12.3.1 类管理 • OODB应用环境对OODB类模式演进提出了许多新的要求(如需要频繁地改变OODB数据库模式且类模式的演进是动态的等),使得OODB模式的修改比关系模式的修改更加复杂。类模式演进的主要内容有: • (1)类中内容变化,如增、删、修改类中的属性和方法等; • (2)类间关系的变化,如类间继承关系的改变等; • (3)类结构重组,如在类层次结构中增加、删除类等。 • (4)类管理中的其他功能。如类的权限建立与删除、显示、打印等。
12.3.2 对象管理 • 对象管理主要完成对类中对象的操纵管理,主要内容有: • (1)对象的查询。即在类层次结构中,通过查询路径查找所需对象。查询路径由类、属性、继承路径等部分组成,一个查询可用一个路径表达式。 • (2)对象的增加、删除和修改操作。 • (3)索引与簇集。为提高对象的查询效率,按类中属性及路径建立索引以及对类及路径建立簇集。
12.3.3 对象控制 • 对象控制所采用的基本方法与传统数据库系统有相似之处,但OODBMS为实现新的功能使具体处理变得更为复杂。对象控制包括以下内容: • (1)通过方法与消息实现完整性约束条件的表示及检验。 • (2)引入授权机制等实现安全性功能。 • (3)并发控制与事务处理的具体实现更为复杂,事务处理还需要增加长事务及嵌套事务处理的功能。 • (4)故障恢复。
12.4 对象-关系数据库 • 12.4.1 对象-关系数据库系统的定义 • 12.4.2 对象-关系数据库系统的特点 • 12.4.3 对象-关系数据库系统的实现方法
12.4.1 对象-关系数据库系统的定义 • 在传统的关系数据模型基础上,提供元组、数组、集合一类丰富的数据类型以及处理新的数据类型操作的能力,并且具有继承性和对象标识等面向对象特点,这样形成的数据模型,称为对象-关系数据模型。基于对象-关系数据模型的数据库系统称为对象-关系数据库系统,简称ORDBS。 • ORDBS为那些希望使用具有面向对象特征的关系数据库用户提供了一条捷径。在对象-关系模型中,ER模型的许多概念,如实体标识、多值属性、泛化/细化等,无需经过变换转化可直接引用。
12.4.2 对象-关系数据库系统的特点 • 对象-关系数据库系统兼有关系数据库和面向对象数据库两方面的特征,它除了具有原来关系数据库的特点外,还具有以下特点: • (1)允许用户扩充基本数据类型,即允许用户根据应用需求自己定义数据类型、函数和操作符,而且一经定义,这些新的数据类型、函数和操作符将放在数据库管理系统核心中供所有用户公用。 • (2)能在SQL中支持复杂对象,即由多种基本类型或用户定义类型构成的对象。ORDBS通过对SQL语言的 SELECT句型使用方式稍加修改就能处理带有复合类型、嵌套和引用类型的ORDB查询。
12.4.2 对象-关系数据库系统的特点 • (3)能够支持子类对超类的各种特性的继承,支持数据继承和函数继承,支持多重继承,支持函数重载。如在ORDBS中支持类型一级的继承性,也可实现表级继承性。 • (4)能够提供功能强大的通用规则系统,而且规则系统与其他的对象—关系能力是集成为一体的。例如,规则中的事件和动作可以是任意的SQL语句,可以使用用户自定义的函数,规则能够被继承等。
12.4.3 对象-关系数据库系统的实现方法 • 实现对象-关系数据库系统的方法主要有以下5种: • (1)从头开发ORDBMS。这种方法费时费力,不太现实。 • (2)从现有的关系型DBMS基础上进行扩展。扩展方法有两种: • ①对关系型DBMS核心进行扩充,逐渐增加面向对象特性。这是一种比较安全的方法,新系统的性能往往比较好。 • ②不修改现有的关系型DBMS核心,而是在现有关系型DBMS外面加一个包装层,由包装层提供对象-关系型应用编程接口,并负责将用户提交的对象-关系型查询映象成关系型查询,送给内层的关系型DBMS处理。采用这种方法实现的系统其效率会因包装层的存在而受到影响
12.4.3 对象-关系数据库系统的实现方法 • (3)将现有的关系型DBMS与其他厂商的ORDBMS连接在一起,使现有的关系型DBMS直接而迅速地具有了对象-关系特征。连接的方法主要有两种: • ①关系型DBMS使用网关技术与其他厂商的ORDBMS连接。但网关这一中介手段会使系统效率打折扣。 • ②将对象-关系型引擎与关系型存储管理器结合起来。即以关系型DBMS作为系统的最底层,具有兼容存储管理器的对象-关系型系统作为上层。
12.4.3 对象-关系数据库系统的实现方法 • (4)将现有的关系型DBMS与其他厂商的ORDBMS连接在一起,将面向对象DBMS引擎与持久语言系统结合起来。即以面向对象的DBMS做为系统的最底层,具有兼容持久语言系统的对象-关系性系统作为上层。 • (5)扩展现有的面向对象的DBMS,使之成为ORDBMS。
12.4.3 对象-关系数据库系统的实现方法 • 以Oracle 8i/9i为例,它被设计成能像处理关系型数据那样存储对象数据。在Oracle 8i/9i中,SQL和PL/SQL可用来同时操纵关系型数据和对象型数据。以下是操纵对象型数据的几个具体例子: • (1)定义对象 • ①建立对象类型employee_object • CREATE TYPE employee_object AS OBJECT ( • employee_no char(6), • employee_name varchar2(8), • …… • ) ;
12.4.3 对象-关系数据库系统的实现方法 • ②声明employee_object对象的一个实例 • DECLARE employee1 employee_object ; • ③对employee1进行初始化 • BEGIN • employee1.employee_no=’020102’ ; • employee1. employee_name=’张学军’ ; • …… • END ; • (2)删除对象 • DROP TYPE employee_object ;