文档库 最新最全的文档下载
当前位置:文档库 › 面向对象数据库

面向对象数据库

面向对象数据库
面向对象数据库

第 2 章 面向对象数据库
随着计算机技术发展和应用需求驱动, 面向对象数据库技术受到人们广泛关注。 面向对 象数据库对现实世界中复杂事物具有较强描述能力, 同时也具有高效开发应用系统和实现软 件重用的功能, 在传统数据库技术难以有效支持的应用领域获得了成功应用。 面向对象数据 库的研究始于 20 世纪 80 年代, 当时主要是针对关系数据库的一些弱项, 例如有限的数据类 型,没有基于系统的全局标识,不支持用户或系统可扩充的函数及运算,难以处理复杂数据 对象等。 虽然人们在面向对象数据库技术的概念和原理上都还没有取得完全一致理解, 但大 都认为下述基本概念是面向对象数据库所应该具有:对象、类、继承和封装等。进入 20 世 纪 90 年代,从事研制面向对象数据库管理系统的厂商组成了 ODMG 集团(object database management group,ODMG)开始制定面向对象数据系统标准,并于 1993 年 8 月公布了第一 个 ODBMS 工业化标准——ODMG-93。此后,又相继 ODMG 1.2 、ODMG 2.0(1997)和 ODMG 3.0 (2000) 。本章先介绍一般面向对象数据库系统基本概念,然后是 ODMG 3.0 中基本内容。
2.1 面向对象技术方法
2.1.1 新应用需求推动
自从 20 世纪 80 年代以来, 数据库在传统商业事务处理领域获得了巨大成功, 随之带来 了其它各种领域对数据库技术应用需求的巨大增长。 这些领域主要包括计算机辅助设计、 计 算机辅助软件工程、 计算机集成制造系统、 办公室自动化系统、 地理信息系统、 知识库系统、 数据仓库与知识发现、 多媒体系统和计算机网络系统等。 这些新领域所需要的数据管理功能 相对于传统情形具有许多新的特点。 ●需要存储和处理复杂对象 数据对象内部结构复杂,相互联系具有多种语义,难以用 关系结构描述与表达。 ●数据类型多样 数据项取值可以是抽象数据类型、无结构或半结构数据类型、超常数 据类型、时态和版本数据类型以及各种用户自定义数据类型等。 ●需要常驻内存的数据管理以及对大量数据对象的存取和计算。 ●需要常规程序设计语言与数据库语言的高度无缝集成。 ●支持长事务和嵌套事务处理。 面对新的应用需求,传统的关系数据库的弱项或缺陷日益显现出来。 ① 数据类型简单 传统数据库只能理解、 存储和处理某些简单的基本数据类型, 不能根 据应用需求扩展数据类型集合。对于复杂数据类型只有依赖用户自行编写的应用程序来构 造、描述和处理。 ② 结构与行为分离 传统数据库主要关注数据独立性和存取效率,语义表达能力较差。 实体的结构存储在数据库当中, 而实体的行为却有应用程序另外实现。 这种结构与行为分离 导致数据库中结构只能通过相应应用程序进行解释执行,限制了用户对数据的有效使用。 ③ 查询实现复杂 关系数据库在逻辑上将复杂对象分解为多个基本关系表进行处理, 逻
1

辑结构与外部世界差别很大, 建立在逻辑结构上的查询实现表现复杂。 系统在实现数据存储 透明和查询优化方面付出了极为复杂的开发代价。 ④ 阻抗失配 SQL 语言面向集合,应用程序语言面向记录,两者编程模式不同,类型 系统各异, 需要在相互之间通过应用程序进行转换, 这就是常说的阻抗失配。 为解决此问题, 需要大量应用程序的复杂使用,从而增加了系统开销。 针对关系型数据库不足和为了支持新领域中应用, 经过实践对比, 人们发现面向对象技 术与数据库技术相结合而形成的基于对象数据库具有广阔发展前景。 首先, 基于对象数据库 可以在物理和逻辑两个层面上面向记录的数据格式上成为面向对象的复杂结构描述;其次, 基于对象数据库能够以更为自然的方式在抽象层面上进行结构和行为封装的复杂对象建模, 减低了用户使用数据的复杂度。 基于对象数据库技术研究始于 20 世纪 80 年代中期, 现在已经取得了很大进展, 成为数 据库发展的一个重要方向。 基于对象数据库技术可以考虑下述三个发展方向。 ① 关系数据库的对象扩充 建立能够适应现实需求数据类型系统。 ② 对象程序设计语言的数据库扩充 使用 C++或 Java 等程序设计语言编写的程序访问 数据库中数据。 ③ 全新的对象数据库技术 创建不依赖于现有任何技术的对象数据库系统。 沿着第一个方向,人们建立了对象关系数据库系统;沿着第二个方向,人们建立了面向 对象数据库系统;而沿着第三个方向发展,难度太大,迄今没有太大进展。 本章主要学习面向对象数据库基本技术,对象关系数据库技术则放在下一章中学习。
2.2.2 面向对象概念与方法
面向对象技术与方法起源于面向对象程序设计语言, 其中主要有 Simula 语言、 Smalltalk 语言和 C++。Simula 语言产生于 20 世纪 60 年代,面向对象(object oriented)这一重要概 念就首次出现其中。Simula 具有面向对象基本特征,作为一种通用模拟语言,它能够使用 户创建一种面向对象的应用系统。Smalltalk 产生于 198 1 年,由美国 XeroxPalo Alto 研究中 心(PARC)研究开发,作为一种将程序设计语言、软件工作环境和相关支持工具集成为一 体的系统,Smalltalk 从根本上完善和发展了面向对象技术和方法,成为最具有代表性的面 向对象程序设计语言。C++是当前使用最为广泛的面向对象编程语言,大多数面向对象应用 系统都是基于 C++进行研究与开发的。 上述面向对象程序设计语言应用和使用, 提出和完善 了面向对象的思想、概念和技术。 作为面向对象技术中最基本概念,对象(object)是现实世界中客观实体的基本描述。 在计算机世界中,从一般数据元素到海量数据文件,从简单数据描述到复杂数据结构,从可 执行程序模块到巨型应用系统都可以看做对象。 具有相同动态和静态特征的对象组成面向对象方法中的另一个基本概念——类 (class) 。 类中的对象成为对象实例, 对象实例的共同特征称为实例变量。 类和类之间可通过概括关系 和复合关系相互关联。类协议定义了一个具体的类,它提供了建立该类对象实例基本途径, 对象所相应的动作都需要在类协议中进行描述。 类协议由描述类的函数和消息表组成, 其中 类函数包括类的名称、 类的超类和类的说明以及对象实例的实现方法; 消息包括当对象实例 接收到该消息时所需完成操作的说明。 作为发送给具体对象实例的动作标识符,消息(massage)指示对象执行某些指定动作。 只有当消息包含在对象所在类的消息表中时, 该对象才能响应消息发出的指令; 同时消息也 可以通过超类继承得到。
2

作为定义在对象实例之上的一组操作,方法(method)是消息的实现。方法在类协议中 进行定义,它描述了对象对象如何响应消息的技术细节。 对象、类是面向对象技术中最基本概念,而面向对象方法主要体现在抽象、抽象类、封 装、继承和多态等方面。 ●抽象 抽象就是通过从一组对象中抽取公共的特征与行为来表征这组对象。抽象可分 为数据抽象和功能抽象两种方式。 数据抽象采用私有数据和共享数据方式来定义数据基本特 征;功能抽象采用方法的形式描述具体对象如何相应详细的技术细节。 ●抽象类 抽象类是一种没有对象实例的类,其中的方法是其所有子类的公共协议,其 基本意义在于提供了类之间的一种逻辑结构。 boolean 具有两个子类 true 和 false, 类 其中 true 是类 true 的唯一对象实例,false 是类 false 的唯一对象实例,而类 boolean 没有对象实例, 它只定义了 true 类和 false 类的公共协议。 ●封装 封装(encapsulation)将对象特征和行为进行屏蔽,使得一个对象在程序运行过 程中可作为一个独立整体使用而不用担心环境施加于对象的影响。 对象封装可通过基于对象 的类协议进行描述。 ●继承 继承(inheritance)在类按照层次排列时发挥基本作用,其意义在于类表述的特 征与方法的重用。 ●多态 多态(polymophism)表明同一个操作方法可以具有不同实现细节。例如,消息 printOn 可以发送于类中的任何一个对象, 而不同对象关于 printOn 的响应由相应类协议进行 描述。多态意义在于同一个消息可以存在于不同类中,当消息发送给具体对象时,其作用却 由对象所在类协议确定。 在计算机世界中, 面向对象思想与技术为描述和处理复杂客观实体提供了有效手段和应 用框架。
2.2 面向对象数据库系统
数据模型是对现实世界中实体本身及其约束的抽象描述和实体间相互联系的逻辑刻画。 以面向对象方法为指导对数据模型做语义解释, 就可构建面向对象数据模型 (object oriented data model,OODM) ;由按照 OODM 定义行为和联系的数据对象构成的数据库称为面向对 象数据库(object oriented database,OODB) ;对 OODB 进行有效管理的数据管理系统称为 面向对象数据库管理系统(object oriented database management system,OODBMS) ;以 OODBMS 为核心构做的数据库系统就是面向对象数据库系统(object oriented database system,OODBS) 。
2.2.1 面向对象数据模型
面向对象数据库的本质构件是面向对象数据模型。 按照面向对象程序设计方法进行对数 据建模并做出语义解释, 就可得到面向对象数据模型。 面向对象数据模型吸收了面向对象程 序设计方法中核心概念和基本方法,其要点是采用面向对象观点来描述现实世界中的实体 (对象)逻辑结构和对象之间联系与限制。 一般数据模型分为数据结构、 数据操作和数据完整性约束, 面向对象数据模型也不例外。
3

1.数据实体
面向对象数据模型的基本结构组件是对象和类。
(1)对象
面向对象数据模型中的基本数据实体是对象和类。 对象是面向对象数据模型中基本结构,对应于 E-R 模型中一个实体。事实上,一切概 念上实体都可以看作对象。一般而言,对象可以描述为下述三个集合的封装体: ●变量集合 E-R 模型中实体的每个属性对应一个变量(variable) ,用以描述对象的状 态、组成和特征等静态性质。对象的属性可以有比较复杂的结构,因此变量可以取单个值、 多个值组成的集合。变量本身还可以就是一个对象,即变量可取值为另外一个对象,即变量 可以递归定义,此时相应的对象称为复杂对象。如果变量取值为基本数据类型(数值型、字 符型等) ,则称其为简单对象 ●方法集合 方法(method)描述了对象的行为特征,是对对象操作,用以改变对象的 状态。 方法可以是施加于对象上的实现数据操作的一段代码, 也可以是对象上的完整性约束。 并且返回一个值作为对消息的响应。 ●消息集合 由于对象是封装的,只能通过消息(massage)实现对象间的相互通信,消 息由对象相应的方法响应, 是对象提供给外界的界面。 消息作为发送给某个对象的动作标识 符, 对象的每个方法都对应一个消息。 消息的意义在于对象修改变量和方法时可以不影响系 统其余部分,这是面向对象方法的优势体现。 由此可知,在面向对象数据模型中,对象由一个变量集合和一组方法进行描述,而对外 的界面是一组消息。另外,对象本身的属性和方法同样又可以看作是对象,而这需要引起我 们的充分注意。 例如,设有教材对象“数据库新技术教程” ,其基本特征由“书号”“书名”“作者” 、 、 、 “出版社”和“出版日期”等变量描述。其中“作者”也看作对象,其特征由“姓名”“性 、 别”“地址”和“电话”等变量描述。 、 “出版社”也可以看作对象,特征由“出版社名”“出 、 版社所在地”描述。这里,作者和出版社为简单对象,而教材则是复杂对象。假设方法“计 算单价” 是计算一本书的单价, 如果单价与出版时间有关, 则向对象 “现代数据新技术教程” 发送计算单价消息,方法“计算单价”响应,输出该书当前价格。如果计算方法有变,则只 需修改对象内部计算单价程序而不影响外部界面。 另外,从对象的表示形式来看,一个对象是一个二元组形式(oid,val) ,其中 oid 表示 对象标识 id,val 表示对象的取值,即一组属性的取值。 每个对象都具有唯一一个不可更改的对象 id,其独立与对象取值。oid 由系统创建并在 对象整个生命周期中都不可改变。对象的 oid 和关系元组的主键都唯一确定一个数据实体, 但具有下述两点区别:主键可以改变而 oid 不可改变;主键对用户可见而 oid 是一个内部对 象名,对用户透明。 对象取值可以是基本数据类型,也可以是引用值(oid) 、元组值和集合值(数组、列表、 多集和集合) 。与 oid 不可改变性不同,对象的值是可以改变的。
(2)类
类(Class)是对具有共同属性和方法的对象全体的抽象和概括地描述,类中对象类的
4

对象称为实例。 数据库中可能有许多相似对象, 它们具有相同名称和特征变量, 这些变量可以响应相同 的消息和调用相同的方法。对于这样对象进行单独定义是不经济与不合适的。按照相似性, 将它们形成不同类别以形成类的概念。 此时, 类与对象的联系类似于关系数据库中关系模式 和元组。关系数据库是各种关系的集合,每个关系由元组组成,而面向对象数据库是各种类 的集合,每个类由若干对象组成。 在面向对象技术中,不仅类的具体实例是对象,类本身也可看作是对象,通常称为类对 象,这样的类对象还可再组成类。由类对象组成的类称为元类(metaclass) 。类对象与一般 对象不同,类对象中包含一个类变量(类名称) ,而该变量取值是该类所有实例对象组成的 集合。此外,还包含相应消息 new 的方法以建立一个新的类。将类看作类对象可以将类和 常规对象通过统一管理机制进行处理,有利于提高系统效率。 设 有 book 类 , 其 中 具 有 属 性 “ book-no , book-name , written-by , published-by , date-of-published ” 和 方 法 “ new ( ) price(date-of-published) ” 其 中 , written-by ” 和 , 。 “ “published-by”的取值实际上是类对象“author”和“publisher” 。按照这样思路,可以定义 book 类如下。 Class book{ /*attribute variable*/ book-no:string; book-name:string; written-by:author; published-by:publisher; date-of-published:date; /*method*/ new() ; price(date-of-published); } Class author{ /*attribute variable*/ auth-name:string; sex:string; auth-address:string; telephone:int; /*method*/ new() ; …… } Class publisher{ /*attribute variable*/ book-no:string; publi-name:string; publi-address:string; /*method*/
5

new() ; …… }
2.数据结构
数据结构实际上就是数据相互之间的逻辑关系。 面向对象数据结构主要表现在类之间的 继承关系和复合关系。继承联系和组合联系的基本作用是通过已知类定义新的类。
(1)继承关系
类之间的继承联系是一种“A is B”联系。此时,A 称为子类,B 称为超类。超类和子 类之间具有共享特征,子类可以共享超类中的数据和程序代码。另外,子类和超类间也存在 着数据和功能上的差异, 即子类中可以定义新的特征和方法, 也可屏蔽超类中的某些和方法。 一个类可以有其子类,子类的还可有其子类,由此形成了一个层次结构。基于继承的父 类型和子类型关系通常以一种图型结构表示, 图中结点表示类型, 而父类型和子类型通过相 应结点之间的“边”联结。图 2-1 是一个学校中各个类的继承层次结构情形。

教职工
学生
教师
行政
员工
本科生
研究生
助教
讲师
教授
科员
科长
处长
图 2-1 继承类层次结构
继承类层次结构是一种自下而上的特殊化过程,子类是父类(超类)的特例和细化,父 类是子类的概括和抽象, 因此继承类层次结构描述了语义模型中的概括概念。 关于类继承关 系需要主要注意下述几个方面。 ● 实例与成员 类可以具有对象实例, 一个对象实例只能属于一个类。 类层次结构如果 看做树型结构, 则通常位于叶结点的类才有对象实例, 即子类的对象实例不能同时又是其超 类的对象实例。为了符合人们的直观认识,可以将子类的对象实例看做超类的成员。因此, 在面向对象数据结构中,类的成员和类的对象实例是两个不同的概念。在如图 2-1 所示的类 层次结构树中,如果将 Jhon 看做教授类中的实例,则就不能将其看做是教师中对象实例而 只能是其成员。 ● 内结点实例 对于继承类层次结构中非叶结点表示的类而言, 如果其所有子类集合不 能构成其一个划分,则这样的类也可有对象实例。例如,当把实验人员也看做教师时,图 2-1 中教师的所有子类集合就不是教师超类的一个划分,因此实验人员就可看做是教师这个 非叶结点的对象实例。 ● 多重继承 在实际应用中,类之间联系并非总是简单表示为一种树型结构。即是说,
6

一个子类并非只有一个父类。例如,在职博士研究生就有两个父类:教职工类和学生类。这 种具有多个父类的继承称为多继承,而只有一个父类的称为单继承。使用多继承概念,可以 使得一个对象具有多种身份, 更加符合显示世界的实际情况。 多继承类层次结构通常是一个 有向无环图,如图 2-2 所示。

教职工
学生
教师
行政
员工
本科生
研究生
助教
讲师
教授
科员
科长
处长
在职研究生
图 2-2 多继承类层次结构
(2)复合关系
类之间的复合联系(compositional relationship)是一种“A has B”或“A is apart of B”联系。此时,一个类由其它多个类组成,例如计算机类由主机类、键盘类、鼠标类、 显示器类等组成。这里,类有一组属性变量,而属性变量的值是另一个类中的对象。如果属 性值对象不是原子类,则该属性值为属性值对象的对象标识符,在这种情况下,就称一个对 象引用(reference)另一个对象。复合关系反映了类之间的一种嵌套联系,即一个类的属 性值可以取做另外一个类。 类层次结构中的超类与子类联系描述了语义模型中的概括抽象概念, 反映了相同或相似 类之间的一种关系。类之间的聚集联系则描述了语义模型中的聚集(collection)抽象概念, 主要反映了不同类之间的一种关系。 事实上, 多个不同类的对象可以聚集称为一个更高一级 别上的对象, 而多个不同类的高级对象又可以聚集称为更高一级别上的对象, 从而形成一种 有别于继承层次结构的聚集层次结构。 在聚集层次结构中, 低层次对象是高一层次对象的组 成部分,除了叶结点外,所有结点类中的对象实例都是下一层对象复合而成,此时的对象称 为复合对象(composted object)或前述的复杂对象(complex object) 。复合对象与组成其的 对象之间是一种嵌套关系,即一个类对象的属性(变量)还是另一个类中的对象。类之间的 这种关系也称为“is-part-of”联系。如同将表示概括概念的层次结构称为继承类层次结构一 样,这种表示嵌套关系的层次结构也就称为复合类层次结构。 计算机复合类层次结构如图 2-3 所示。一台计算机由主机、显示器和键盘组成。而主机 又由主板、中央处理器和硬盘组成,如此等等。计算机复合层次类结构中各个类的实例变量 应当分别是对主机、显示器和键盘类的引用,因此需要注意,继承类层次结构中每个对象只 能是一个类的实例, 但同时可以是其超类成员, 而复合类层次结构中对象都只是某一个类的 实例,不能成为更高层次类的成员。
7

计算机
主机
显示器
键盘
主板
CPU
硬盘
图 2-3 复合层次结构实例
由类(对象)概念以及类的继承和复合联系可得面向对象数据的概念模型,这种概念模 型也称为类层次结构模型。类似于 E-R 模型可以用 E-R 图描述,对象和类的概念模型可以 用类层次结构图(UML)刻画。需要指出的是,与传统关系数据模型不同,在面向对象数 据模型中,概念数据模型与逻辑模型通常合二而一。
3.数据操作和类型
(1)数据操作
在面向对象数据模型中,数据操作分为两个部分,一个部分封装在类之中称之为方法, 另一部分是类之间相互沟通的操作称之为消息。 因此, 面向对象数据模型上的数据操作就是 方法和消息。 面向对象数据模型中一般使用消息或方法表示完整性约束条件, 它们称为完整性约束方 法与完整性约束消息,并在其之前标有特殊标识。 综上所述, 面向对象数据模型的直观描述就是面向对象方法中的类层次结构图。 面向对 象数据模型中的对象由一组变量、一组方法和一组消息组成,其中描述对象自身特性的“属 性”和描述对象间相互关联的“联系”也常常统称为“状态” (state) ,方法就是施加到对象 的操作。一个对象的属性可以另一个对象,另一个对象的属性还可以同其他对象描述,以此 模拟现实世界中复杂实体。 在面向对象数据模型中, 对象的操作可以通过调用其自身包含的 方法实现。
(2)数据类型
面向对象数据模型是面向对象数据库核心概念,面向对象数据类型(type)是面向对象 数据库的操作基础。由于将所有数据实体都看作对象,因此从本质上来看,对象和类就是所 有数据取值的原语。 但从技术实现上特别是与传统关系数据库比较考虑, 还是需要讨论对象 的特征取值的数据类型。 面向对象数据类型系统主要由基本类型、 复杂类型和引用类型组成。 ① 基本类型 基本数据类型包括整型、浮点型、字符型、布尔型和枚举型。 ② 复杂类型 复杂数据类型包括结构数据类型 (也称为行类型或对象类型) 与聚集数据 类型(数组、列表、包、集合与字典数据类型) 。 ③ 引用类型 引用数据类型相当于程序设计中指针概念, 在面向对象技术中称为 “对象 标识” ,引用类型实际涉及类型值域中的实例映射。在面向对象数据模型中,只要是联系, 都认为是引用方式。
8

需要说明,在面向对象方法中,类(class)和类型(type)是两个有所区别又相互联系 的基本概念。通常认为,一个类可以看作是由一个类型构成,只不过同时可能还有一个或多 个方法供类中对象调用。在这种意义下,类中的对象可以是该类型的值,也可以是该类型的 变量,而前者称为所涉及类的不变对象,后者称为可变对象。类也被称为“抽象数据类型” , 这是由于类中定义的方法可以直接修改类的对象, 类实际上限制了对象的访问权限。 这种封 装技术保证了对类中对象修改不会超出类设计者设计时所考虑情形, 使得对象始终处于 “安 全”状态。
2.2.3 面向对象数据库语言
当前人们使用的面向对象数据库语言是 OSL/OQL,这是由 ODMG 于 1997 年指定的对 象描述语言(object specification language,OSL)和对象查询语言(object query language, OQL)的简称。OSL/OQL 以面向对象程序设计语言 OOP 为基础,通过实现持久性扩充而形 成的面向对象数据库语言。OSL/OQL 在形式上类似于 SQL,同时具有面向对象特征,与 OOP 共同构成面向对象统一环境。其特点在于由过程性语言 OOP 处理临时性对象,而由非 过程性语言 OQL 处理持久性对象。
1. OSL
OSL 又可分为对象定义语言(object definition language,ODL)和对象交互格式(object interchange format,OIF)两个组成部分。 作为对象建模语言,ODL 中的基本元素是对象,基本数据单元是类型。而类型由属性 与操作组成, 并且通过继承与联系实现类型间的相互关联。 类型中的属性取值可以是基本类 型,也可以是复合类型,此外,类型也可以定义方法。类型是 ODMG 系统中实现可移植性 的重要概念,因为在多个数据库平台上,如果使用相同 ODL 定义各自数据对象,就可以实 现不同系统之间数据的相互移植,而且 ODL 语法结构和一般面向对象语言中相应定义基本 相似,从而为语言绑定提供了方便和可能。 作为对象描述语言, 基本功能是为 ODL 创建的对象类型快速创建相应的对象实例, OIF 同时还可以对实例赋予初值。这种赋予初值语法可以看做是 C++中相关方法的借用。通过 OIF,在不同的 DBMS 中,用户可以利用文件形式无需修改和重新输入当前系统中定义的对 象类型而直接将其导入另一系统,这也是 ODMG 中可移植技术的具体实现途径。
2. OQL
OQL 实际上是 ODMG 和 SQL 标准共同协商的结果,它与 SQL 语法基本相同,具有较 明显的 SQL 风格, 同时增加了对象基本内容, 输出的查询结果都是对象的属性和方法。 OQL 可以独立使用, 也可以嵌入到 C++等高级语言中使用。 作为数据库系统与用户之间的主要接 口,OQL 没有 SQL 中的数据更新语句。由于数据更新可以看做方法,在 OODB 中,这些功 能都有 ODMG 语言绑定实现,从而实现了 ODMG 对象查询语言的简洁性和完整性。
9

3. 对象语言绑定
语言绑定思想在 SQL 中已经出现,但在 ODMG 予以极大增强并且不可或缺,其意义在 于实现面向对象语言中缺少的包括数据更新在内的数据操作语言 OML。多语言绑定是 ODMG 的一项关键性技术,它可以方便地加入面向对象功能,使得用户能够灵活定义和实 现对象的数据操作, 又可以扩大数据库系统在已经掌握面向对象程序设计语言用户中的使用 范围。当然,语言绑定对于一般数据库用户还是具有一定的困难。当前,ODMG3.0 支持对 C++、Smalltalk 和 Java 的语言绑定。
2.2.3 面向对象数据库系统
1989 年,M.Atkinson 在日本东京举 行的第一届 演绎与面向 对象数据库 国际会议 (DOOD’89)发表了面向对象数据库系统宣言,对面向对象数据库系统中的基本概念和性 质进行了全面系统的阐述,这些特征主要分为下述三类。 强制性(mandatory) :即面向对象数据库系统必须满足的特征,主要有 复杂对象、对 象标识、封装性、类型或类、继承性及结合滞后联编重栽、可扩充性、计算完备性、持久性、 辅存管理、并发性、恢复性和即席查询功能。 可选性(optional) :即并非必需,是为完善系统而可添加的功能。主要有多重继承性、 类型检查和推理、分布式功能、设计事务处理和版本控制。 开放性(open) :即设计这可以选择的内容。主要有程序设计风格、表示系统、类型系 统和一致性。 下面大体按照上述特征介绍面向对象数据库系统。
1.面向对象数据库管理系统
数据库管理系统是任何一个数据库的中枢系统, 面向对象数据库管理系通常应当满足下 述要求: ●支持面向对象的数据模型。 ●提供面向对象的数据库语言。 ●提供面向对象数据库管理机制。 ●同时具有传统数据库的管理能力。 面向对象数据库管理系统由类管理、对象管理和对象控制等三个部分组成。 ① 类管理 用于对类定义和类操作进行管理,利用类来描述复杂的对象。 ② 对象管理 对象管理又称为实例管理, 主要完成对类中对象的操作管理, 利用类中的 封装的方法来模拟对象的复杂行为。 ③ 对象控制 对象控制具有传统数据库中数据控制功能, 但也补充了一些新的内容。 整 体上来说,对象控制包括如下一些基本点:完整性约束条件及检验,安全性表示与检查,并 发控制与事务处理,故障恢复,利用继承性来实现对象的结构和方法的重用等。 正是由于 OODBMS 上述特性,使得其在一些特定应用领域(如 CAD、GIS 等) ,能较好地 满足其应用需求。当然,这种纯粹的面向对象数据库系统并不支持 SQL 语言,在通用性方面 失去了优势,因此应用领域也受到一定限制。
10

2.面向对象数据库系统
对于一个数据系统而言,通常认为需要满足如下最小需求才能看作是一个数据库系统: ● 具有优化能力的高级查询语言。 ● 具有支持持久化和自动性的事务并发控制和恢复机制。 ● 具有支持复杂数据类型进行快速和有效的存储、索引和存取功能。 按照上述考虑,一个数据库系统要成为 OODBS,下述两条基本要求必不可少: ① 面向对象系统 系统出发点是针对面向对象程序设计语言的持久性对象存储管理, 系统核心应当充分支持完整的面向对象概念和机制, 例如用户自定义数据类型、 自定义函数、 对象封装等必不可少的 OO 方法特征,与当前流行的 OO 程序设计语言取得一致。 ② 数据库系统 系统借助扩充传统数据库语义, 使之与核心 OO 数据模型协调, 完全支 持传统数据库系统中所有数据库特征和功能, 例如持久性、 辅存管理、 数据共享、 事务管理、 一致性控制及恢复等。 按照上述标准,可以将一个 OODBS 表达为 “面向对象系统+数据库功能” ,即是说, OODBS 是一个将面向对象的程序设计语言中所建立的对象自动保存在磁盘上的文件系统。 一旦程序终止,可以自动按另一个程序要求取出已经存入的对象。OODBS 作为一种系统数 据库,主要用户是计算机应用软件和计算机系统软件的开发人员,即专业程序员,而不是终 端用户。 这类系统的优势在于可以与面向对象程序设计语言一体化, 使用者不需要学习新的 数据库语言。 面向对象数据库系统突破传统数据库系统(包括关系数据库系统)的事务性应用限制, 在非事务性应用中取得重大进展。
2.3 持久化程序设计语言
前面已经简要介绍了面向对象数据库系统中的基本概念。 为了在技术开发和实际应用中 有效使用这些概念, 还需要一种数据库语言进行必要的表述与刻画。 面向对象数据库语言构 建的基本思路是对现有面向对象程序设计语言如 C++、Smalltalk 等进行扩展,使之支持相 应数据库操作。这种面向对象数据库语言(OODL)称为持久化程序设计语言。
2.3.1 阻抗失配与对象持久性
设计 OODL 首先需要解决阻抗失配问题。传统数据查询语言是由系统自动选择路径的 非过程性语言。 非过程性语言面向集合操作方式与高级程序设计语言面向单个数据的过程性 操作方式之间会出现不协调现象,即出现所谓“阻抗失配”问题。阻抗失配根本原因在于数 据库的数据模型和程序设计语言的基本格调之间不一致性。对于所有嵌入式数据库语言来 说,阻抗失配不可避免。面向对象数据模型中有关“对象”与“类”的概念都来自面向对象 高级程序设计语言,因此,如果适当地选择一种高级程序设计语言,并扩充其数据库功能, 就有可能使其成为面向对象数据库语言,从而有可能从根本上解决阻抗失配问题。 面向对象程序设计语言中已经存在对象、 类的概念以及对象类型的若干结构, 但此处的 对象具有“瞬时”性,即对象只在程序执行期间存在于非永久性存储器(缓冲区或主存)当 中,在执行完成后即刻消失,就像 C++程序变量在程序执行结束后消失一样。而数据库作为 保存数据的电子容器,其基本要求就是数据具有“持久”性。在面向对象数据库中,对象作
11

为数据应当是持久性对象,需要保存在永久存储器(磁盘)中,它不仅在程序执行过程中存 在,程序结束后还必须存在。因此在扩充一种面向对象程序设计语言的数据库功能、解决阻 抗失配的过程中,首要工作就是提供一种能够使得对象持久化的技术方法。
1.对象持久化
对象持久性可以通过下述几种途径实现。 ●按类持久 即直接声明一个类是持久的, 此时该类所有对象在默认情况下都是持久对 象, 非持久类的对象都瞬时的。 但这种方法在需要单个类中既有持久对象又有瞬时对象情况 下显得不够灵活。 ●按创建持久 即通过扩展创建瞬时对象的语法,引入新的用于创建持久对象的语法。 一个对象如果在创建时按照持久对象定义,则该对象就是持久对象,否则不是。 ●按标志持久 所有对象都创建为瞬时对象,如果一个对象在程序结束后持久存在,就 在程序结束前显式标为持久,这样就将决定对象持久与否推迟到对象创建之后。 ●按可达性持久 将一个或多个对象声明为(根)持久对象,而对于其他对象,则根据 其是否能从一个根持久对象直接或间接引用来决定持久与否。此时,所有从“根”持久对象 引用的对象都是持久的, 由这些持久对象的再次引用也是持久的, 即持久对象到根持久对象 是可达的。
2.对象标识持久化
在面向对象程序设计语言中,创建一个对象时,系统就返回一个瞬时对象标识符,该标 识符只在程序执行过程中有意义,程序结束,对象删除,相应标识符也就消失。因此,在创 建持久对象时,需要赋予对象一个持久性的标识符。这里可以分为下述四种情形。 ●过程内持久标识符(intraprocedure identity) 标识符只在单个过程执行期间内持久。 例如,过程内一个局部变量的标识符就是如此。 ●程序内持久标识符(intraprogram identity) 标识符只在程序或查询执行过程中持久。 例如一个程序中全局变量的标识就只在该程序运行中有效。 ●程序间持久标识符(interprogram identity) 标识符只在一个程序执行到另一个程序 执行之间持久。 ●持久标识符(persistent identity) 标识符不仅在各个程序执行期间,就是在数据结构 重组期间都是持久的。面向对象数据库系统主要考虑持久标识符。
3.持久对象存储和查询
OODB 需要存储持久对象。持久对象进入数据库时,就要将其标识转换为一个永久的 唯一 OID,由此才可以使得该对象在数据库中真正“持久” 。如果需要将该对象由数据库取 到内存,则要执行相反操作,即当某个对象读入内存后将其相应 OID 类型指针所指向的逻 辑磁盘地址转换为主存地址。 在面向对象数据库查询对象由三种方法: ① 根据对象名访问对象 具体实现时,每个对象由一个对象名(如同文件名一样) 。该 方法对于对象数量较小时有效,但当对象数量较大时就难以适用。
12

② 根据对象标识查找对象 此时对象标识通常存储在数据库之外。 ③ 将对象按照集合体形式存储 此时,使用程序循环搜索所需对象。集合体分为集合 (Set) 、多重集合(Multiset,具有相同集合值的集合)与列表(List) 。类区间是集合体的 一个特例,属于一个类的所有对象组成一个类区间。当创建一个对象时,该对象会被自动插 入到类区间中,一旦对象删除,就自动从类区间移出。类区间允许像对待关系一样对待类, 检查类中所有对象类似于检查一个关系中所有元组。 大多数 OODBS 都支持上述三种数据库访问方法。
2.3.2 持久性 C++系统——ODMG 标准
高级程序设计语言 C++自身具有的面向对象性质可以使得人们在获得必要持久性支持 过程中无需过多改变 C++语言结构。例如,声明一个名为 President_Object 的类,使得它 具有某些属性和联系来支持持久性,而其它应为持久性的类都可以作为这个类的子类而生 成,由此子类继承了父类对持久性的支持。 成立于 20 世纪 80 年代 的 ODMG(object data management group) ,在 1993 年形成工 业化的 OODB 标准——ODMG1.0,完成了对 C++的数据库功能扩充。ODMG1.0 标准对 ODBMS 的数据模型和数据库语言做了规定,其基本特征是将对象作为基本构件,而不是像 SQL3 中将表作为基本构件。在 1997 年又推出 ODMG2.0, 内容涉及到对象模型、对象定义 语言(ODL) 、对象交换格式(OIF) 、对象查询语言(OQL)和上述内容与 C++、Smalltalk 以及 Java 之间绑定。2000 年再次推出 ODMG3.0,对先前版本做了一些修改和补充,基本 框架和基本概念未变。一般而言,ODMG 标准主要由以下三个部分组成; ODL:对象数据定义语言,创建数据库模式。 OQL:对象数据查询语言,与 SQL 类似,用于对象数据基本操作。 宿主语言绑定:在过程化程序设计语言内部使用 ODL 和 OQL,实现 C++,Smalltalk 和 Java 绑定。
1.数据模型核心语言
ODMG 工业标准对 C++的扩展主要包括 C++对象定义语言(object definition language, ODL)和 C++对象操作语言(object Manipulate language,OML) ,其中,OML 又分为对象 查询语言(OQL)和对象控制语言(OCL) 。ODMG 工业标准中的对象数据模型主要包括有 下述 5 个核心概念: ① 对象和文字 对象和文字是面向对象数据建模的基本原语。 每个对象有一个唯一标识 符,对象标识符在对象整个生命周期中都有效,即无论对象是存储在外存中还是在内存中, 标识符都始终有效。对象作为基本数据结构,是存储和操作的基础单元。文字(literal) 没有标识符,需要嵌入在相应对象当中,不能单独使用,文字值也不能改变。 ② 类型 对象和文字都可以被划分为类型(type) ,同一类型的对象或文字具有相同的 状态,对象可以称为类型的实例。在 ODMG 中,类型定义一个外部声明和若干实现组成。外 部声明可分为定义对象类型抽象行为和状态的类定义、 说明类型抽象行为的接口定义和说明 文字抽象状态的文字定义三种情形; 类型实现分为一个表示和一组方法。 表示描述了语言联 编后由该类型抽象状态生成的数据结构, 即对抽象状态包含每个特征生成一个实例变量; 方 法是语言联编后由该类型抽象行为生成的过程体。 方法可以查询或更新对象状态或调用对象 的操作。
13

③ 状态 对象的状态(states)可以通过一组性质定义。性质(property)可以分为两 种:对象属性(attribute)和对象之间联系(relationship) 。属性不看作对象,即是单一 类型,它没有对象标识,也不定义属性的属性或属性间的联系。联系定义在两个类型之间, 即是一种二元联系(1:1,1:n,m:n) 。在 ODMG 中,联系需要成对出现。另外,联系需要 具有对象标识可引用的实例。由于文字没有对象标识,因此不能出现在联系当中。 ④ 操作 对象行为可以通过一组操作来定义, 对象行为具有多态、 滞后联编和操作重载 等基本特点。需要注意,操作需要与一个且只能与一个类型相关联。操作(operation)具 有输入和输出参数,并且可以返回特定类型的结果。 ⑤ ODL 利用 ODL 定义对象数据管理系统的模式,它所存储的对象都是模式中定义类型 的实例,即对象,这些对象可以供多个应用程序共享。
2.ODMG 数据库体系
ODMG 数据库体系结构如图 2-所示。
ODL 模式规格说明 (嵌入 Java,C++等) 宿主语言(Java,C++等) 编写的类方法源代码
数据库规格说明
宿主语言编译器 ODL 预处理器 ODBMS 软件系统 方法实现目标代码
ODBMS 库
目标代码链接器
元数据 目标数据
服务器存储的信息 数据访问
DBMS 中方法实现的二进 制代码
图 2- ODMG 数据库体系结构 ODMG 应用结构如图 2-所示。通常,应用程序使用 OQL 搜索对象或对象集合,然后用户 使用程序设计语言相关语句和对象自身方法来操纵和更新对象数据。此时,并不需要 SQL 中专门更新语句,在程序运行中对任何对象的更新都会引起数据库中该对象副本相应更新。 在关系数据库中, 数据查询和更新都是通过 SQL 语句完成, SQL 作为联想式语言与作为导 而 航式语言的宿主语言存在局的差异。 在面向对象数据库中, 直接使用宿主语言完成数据对象 的查询和更新,对应用程序中的其他对象也是如此。需要说明的是,ODMG 提供专门机制容 许应用程序向数据库发送 OQL 查询 (SELECT 语句) 这使得 ODMG 标准中仍旧保留着一点 , “阻 抗不匹配”的遗弊。
14

宿主语言(Java,C++等) ODBMS 编写的类方法源代码
ODBMS 库
宿主语言编译器
DBMS 中方法实 现的二进制代码
应用程序目标代码
目标代码链接器
应用程序二进制代码
图 2- ODMG 应用结构
2.4 ODMG 数据建模
面向对象数据模型经过多年发展,已经日趋成熟。本节按照 ODMG 标准对面向对象数 据模型进行简要介绍。
2.4.1 预定义类型
从逻辑上来看,类型由可指称对象(denotable-object)和特征()两部分组成。这里, 可指称的含义是可使用一定的对象标识 OID 或其它适当方式对所涉及对象给予指称 (denote) 而不可指称的 characteristic 只有名称没有 OID, ; 其子类型对象都是其它对象组成 部分,不是独立对象,如果需要引用,只能通过其所在的对象。 面向对象系统中的预定义类型如图 2-1 所示,这是一批常用的或系统实现所需的类型, 由系统定义实现,方便用户,也为系统安全性提供保障。 在图 2-1 中所示类型当中,有一种类型不能具有直接对象实例,只能为其子类型定义公 共性质和操作,通常称其为抽象类型。事实上,当一个类型只为其下属子类型提供公共的状 态与操作时,就是抽象类型。这里需要注意,抽象类型不是抽象数据类型。例如结构对象 (Structured_ object)和结构文字(Structured_ literal)就属于抽象类型,前者表示所有使用 结构对象生成器(constructor)构造的所有对象的公共状态和操作,而后者表示所有由结构 文字构造器生成的所有文字例如日期,时间等共同状态,两者都表示抽象意义,因而是抽象 类型。由于它们都还有子类型,因此自身并不能产生具体对象,每一个具体对象都只能属于 相应的子类型,因此,所有抽象类型都不能有对象实例。例如,抽象类型结构文字作用在于 定义构造对象的共性,避免在其各个子类型中重复定义。如果需要结构文字对象,则只能是 某个具体子类型例如日期、时间等子类型的对象,可以使用相应构造器完成。当需要定义一 个日期文字时,首先在结构文字下定义一个名为“date”的子类型,然后在“date”子类型
15

下生成相应对象。其它如原子文字、聚集文字等都是抽象类型,因此抽象类型是在 ODMG 中应用广泛的基本概念。在图 2-4 中,抽象类型都以斜体字表述。
Type Atomic-Object Exception Iterator
Object cellection Structural-Object Denotable-Object structure
Set Bag List Array String BitString)
Integer Atomic-literal Float Character Boolen I-Set Literal I-Cellection I-Bag I-List I-Array I-String I-BitString
Structural-Literal
Enumeration Date I-Structure Time Date Time Interval
Attrbute State Relationship Characteristic Operation
Notes:I- Immutable; italic- abstract type
图 2-4 预定义类型
1.对象
对象是面向对象方法中最基本概念,也是一个伞型概念。在 ODMG 标准中,对象和文 字是两个不同的概念。下面基于预定义类型框架介绍基于数据库的对象概念。
(1)对象概念
① 对象基本描述 在 ODMG 中,对象由变量(属性) 、消息和函数(方法)三个部分 组成。其中变量包含对象数据,相当于 ER 模型中的属性。另外,作为论及对象所能响应的
16

每个消息具有若干参数,对象接受消息后应当作出消息的响应。作为对象行为,函数是实现 一个消息的代码,一个方法返回一个值作为对消息的反馈。 对象中包含的方法可以分为只读型和更新型两种。 只读方法在操作过程中不改变变量的 值,而更新型方法可能改变变量的实际取值。与此对应,对象所响应的消息也可以根据实现 该消息的方法为只读型与否进行分类。 从理论上讲,在 ODMG 中,任何属性必须表现为相应对象中的一个变量和一对消息。 其中,一个变量用以保存属性的值;两个消息中,一个消息用以读取属性值,另一个消息用 以更新该属性值。例如,在职工对象中,工资属性表示为变量 salary,返回工资值的消息 get-salary,接受新参数 new-salary 进行工资值更新的消息 set-salary。但在不少面向对象数据 模型中都允许对变量实行直接读取和更新,而不用定义消息进行读写。 对象按照 OO 技术中的基本概念——封装性(Encapsulation)将对象的状态和行为封装 起来, 对象之间相互作用都得通过发送消息和执行消息完成, 其结构是用户只能看到对象封 装界面上的信息,对象内部对使用者是隐蔽的,其目的在于将对象使用者和设计者分开。 ② 对象生存期 对象生存期(Lifetime)用以确定对象是持久型还是临时型。作为持久性 考虑,对象具有生存期(Lifetime) 。对象生存期在创建对象时确定。在 ODMG 标准中,存 在两种对象生存期:临时(Transient)和永久(Persistent)生存期。 对象生存期与对象类型无关。一个类型的对象实例可以是临时的,也可以是永久的,可 以利用相同的操作对永久对象和临时对象进行处理。在关系模型中,使用 SQL 定义的关系 实例都是永久的。用高级编程语言定义的类型都是临时的。通常需要使用 SQL 定义和处理 永久对象,而使用高级程序设计语言定义了处理临时对象。
(2)对象标识
对象在系统范围中的惟一标识。每个对象都有一个对象标识符(IOD) ,根据它可以区 分同一个存储区(Storage Domain)中的所有对象,通过对象标识符实现对对象的引用。对 象标识符在对象创建时由系统自动产生, 在概念上独立与对象的状态和操作, 也与具体应用 无关产生。 对象标识一旦生成后, 即使对象状态发生变动也不能改变, 还是被看做同一对象, 用户可以查看、查询对象标识,但不可改变对象标识的具体取值。 对象标识的产生通常有下述几种方式。 ① 由属性子集定义 这是一种类似于关系数据库系统主键的定义方式, 即选取对象自身 的若干属性组成对象标识。 但此种方式定义的对象标识依赖与对象本身, 因而可能出现语义 冲突而导致系统异常。 ② 由物理指针定义 即采用对象物理存储位置的指针作为对象标识。 由于对象存取通过 对象标识, 而对象标识本身就是指向对象物理位置的指针无需进行地址转换, 因此此种方式 对象存取效率较高。但该方式也违背了数据库中数据物理独立性,当物理指针改变时,对象 标识持久性无法保证。 ③ 由系统负责定义 也称为“代用品” (surrogate)方式,即由系统负责生成并维护对 象标识,其值在系统内唯一,并且与对象自身以及其物理地址无关。基于代用品方式的对象 标识算法主要有下述几种。 ●简单方式 该方式采用系日期和时间的组合作为对象标识,即当对象创建同时将系统 日期和时间赋予对象。 ●二元组方式 该方式将对象标识定义为<类标识,实例标识>二元组,其中类标识是对 象所述类的标识, 实例标识是该类或整个数据库中一个实例的标识。 此种方式由于对象标识
17

中含有所在类的标识, 当消息发送到一个对象时, 系统可以方便地由对象标识中抽取类标识 而找到对象所在的类,进行消息合法性检查,从而调用对象相应的方法,有利于系统性能的 提高。但该方式不能改变对象所属的类,否则对象标识就会发生改变,而由于对象可能被引 用,对象标识的改变开销会十分巨大。 对象还可以拥有名字(Name) ,应用程序可以使用对象名字来引用对象,系统将对象名 映射到对象标识符,从而定位到相应对象。对象名不同于对象的键,不是对象所属类型的性 质,在系统中不具有唯一性。一般而言,名字用做数据库的入口点,系统可以通过对象的名 称定位对象,但不是所有对象都有名称。
(4)原子对象与构造对象
如果一个对象具有同时具有属性、方法和联系,则称其为结构对象,否则称为非结构对 象。原子对象主要是结构对象,而构造对象为非结构对象。明确对象结构的目的是确定对象 是如何用类型构造器构造出来的。 1) 原子对象 原子对象(atom Object)是指“用户定义对象” ,所有非聚集对象的、由用户定义的具 有属性、方法和联系的对象都是“原子对象” 。因此,原子对象可看作是具有结构的对象, 例如,Faculty 对象有一个带有许多属性、联系以及操作的复杂结构,但由于不是一个聚集, 所以被看作原子对象。 每一个用户定义的原子对象类型都被定义为一个类, 需要指定其属性、 联系与操作。例如用户可以为 Faculty 对象指定一个对象类。需要注意,ODMG 没有定义系 统预置的原子对象。 2)构造对象 构造对象(structured object)可以分为聚集对象与结构两种情形。 ① 聚集对象(collection Object)实际上可以看作是带有参数的类型生成器,聚集对象 所有元素的类型记为 T。聚集对象本身可以看作是一个具有某些附加条件的集合,其中所有 元素都是属于同一类型,这些类型可以是原子对象类型、其它聚集类型或文字类型。 ODMG 支持如下五种聚集类型: ● 数组(Array ) :数组中的元素是有序的,其大小可以动态变化。 ● 列表(List ) :列表中元素有序。在列表类型中,可以从表头、表尾或者指定位 置读取、替换、插入和删除元素。 ● 包(Bag ) :包中元素不排序,并且允许重复。 ● 集合(Set ) :集合中元素不排序,并且不允许元素重复。 ● 字典(Dictiongary ) :设 T,S 是任意类型,则字典类型 Dictiongary 表示 T,S 有序对的有限集合,其中,T 可称为键类型,S 可称为值域类型,由此字典类 型 Dictiongary 中的元素就是(键,值)二元组,其基本要求是不能有完全相同的 二元组。 字典类型允许关联查询, 即给定键值, 就可以得到一个特定关联对, 这与索引类似。 下面就是每个(键,值)二元组都是结构 Association 的实例: struct Association{ Object key; Object value; }; ODMG 中分别定义了数组工厂、列表工厂、包工厂和集合工厂来创建聚集对象,它们 都是对象工厂的的子类型。这些聚集工厂接口的定义分别简写如下: Interface ArrayFactory :ObjectFactory{
18

…… }; Interface ListFactory :ObjectFactory{ …… }; Interface BagFactory :ObjectFactory{ …… }; Interface SetFactory :ObjectFactory{ …… }; 其中“……”为系统内置内容,详细可参考有关资料。 ② 结构对象 结构对象或结构(structure)可以看作是由不同类型元素构成其分量的数 组,与关系中的元组和对象关系中的行类型类似。
2.文字
对象需要有标识, 但创建和管理对象标识是系统的一项较大的开销。 对象标识的基本作 用在于区分对象,但在实际应用,有许多对象(特别是非结构对象)并不需要进行特别的区 分,即数据本身的属性值就可以当作其标识,因此可以“省略”对象标识。这种没有对象标 识的对象就称作文字。 在对象模型中,文字(Literal)是指没有对象标识的一个值。相对于前述的变量,文字 相当于常量。ODMG 中的文字具有如下特性 ① 文字的值直接由表示它的字符确定, “见其面而知其值” ,例如“1921-07-01”就 直接可以知道中国共产党诞生纪念日。 ② 文字的标识就是其本身的值的表示,因此文字不必需要 OID,但可以为其命名。 ③ 对文字进行修改,实际也是将其标识进行修改,从而不再是原先文字,这相当于撤 销原先文字而重新设置新的文字。从此意义上说,文字具有不可更改性(immutable) 。
(1)文字类型
文字可以分为下述三种情形: ① 原子文字 原子文字(atom literal)预定义的并且是对应于基本数据类型的值。数字和字符都是典 型的原子文字。在 ODMG 标准中,原子文字主要有以下 13 种: long, long long, short, unsigned long, unsigned short, float, double, boolean, octet, char, string, enum 其中,枚举类型(enum)是一个类型生成器,定义枚举类型时需要说明取值范围。例如, 当属性 gender 被定义为枚举类型时,取值范围是{male,female}: attribute enum gender{male,female}; ② 构造文字 构造文字(structured literal)分为持久聚集文字(immutable collection)和持久结构
19

(immutable structure)两种子类型。 需要注意,对象和文字都可以由构造子类型,但基于对象的构造子类型(聚集和结构) 是完整意义下的对象,可以具有对象的各种功能,而基于文字的构造子类型(聚集和结构) 却不同,它们只是一个常量,没有属性和联系上说明,也没有操作说明,不能更改,也无 OID 。 常 量 而 不 可 更 改 , 这 就 是 持 久 聚 集 和 持 久 结 构 的 全 部 特 征 , 因 此 在 其 前 添 加 “immutable”以示区别。 ● 持久聚集 持久聚集对应于对象或值的聚集,但本身没有对象标识。聚集文字包括 set, bag, list, array, dictionary五种子类型。 ● 持久结构 持久结构包含固定数据元素, 元素取值可以是文字或对象, 每个元素都有 一个变量名与之对应,通过变量名访问元素,例如 address=“Guangzhou” 。ODMG 支持的 结构文字包括以下四种: Date(日期类型) , Interval(时间间隔类型) Time(时间类型) , Timestamp(时间戳类型) ODMG 提供上述类型的类型生成器 struct,允许应用程序自定义需要的结构文字类型, 例如下面的 degree 就是应用程序自定义的结构文字。 struct Degree{ string school_name; string degree_type; unsigned short degree_year; };
(2)文字与对象比较
对象和文字是组成 ODMG 对象模型的基本成分。两者不同之处在于:对象既包含一个 对象标识,又包含一个状态(state,或当前值)和操作。文字只是一个值,没有对象标识, 不可更改,没有属性和联系说明,也没有操作说明,除了本身值和命名之外,一无所有。两 者的相通之处在于:两者的值都可以有一个复杂的结构。但此时,给定一套初值,可以按照 Object 类型生成一个 collection 或 structure 类型对象,这些类型对象的状态随着初始值的修 改而改变,是一个名副其实的对象;而文字也可能是一个复杂结构,可以由 Immutable-Collection 和 Immutable-Structure 类型文字,基本上是一个常量值。
3.状态与操作
(1)属性与联系
状态用以描述对象,它分为 Attribute 和 Relationship 两个子类型。 子类型 Attribute 描述对象属性,属性取值是文字。子类型 Relationship 描述不同类型或 同一类型中非文字对象之间的二元关系,表示基于“is associated with”的引用(reference) 语义,刻画了对象中的一种“相等”关联(equal association) 。联系参与者是对象,因此联 系取值只能是 OID 及其集合。 例如 在学生与课程两个类型的对象之间存在一种选课 take 和被选 taken-by 的 m:n 联系。
20

面向对象的数据库技术

面向对象的数据库技术 肖阳辉 摘要:面向对象的数据库极有可能是数据库发展的方向,关系型数据库已显得力不从心,面向对象技术已经渗透到了数据库领域,把面向对象的方法和数据库技术结合起来可以使数据库系统的分析、设计最大程度地与人们对客观世界的认识相一致。面向对象数据库的技术机理并不高深,但它的设计思想却极有价值。论文关键词:关,键,词,数据库,面向对象,技术 随着应用的日趋复杂和智能化,传统的关系数据库的缺点一点点的暴露出来,人们迫切希望产生一种新的数据库解决方案来适应这些复杂需求。一种新的解决方案呼之欲出。而这个解决方案极有可能就是面向对象数据库技术。面向对象数据库的技术机理并不高深,但它的设计思想却极有价值。在传统的面向对象应用开发中,由于传统的关系数据库开发风格完全不同于面向对象风格,使得许多程序员难以从复杂的SQL编程中解脱出来(尽管已经有一些成熟的ORM技术框架,如Hibernate,但程序员仍需要做大量的数据库代码工作),从而也无法从实质上提高工作效率。 1、面向对象数据库技术概述 面向对象是当前计算机界关心的重点,面向对象是一种新的方法学,也是一种认知方法学。它是一种支持模块化设计和软件重用的实际可行的编程方法,它把程序间的逻辑活动建立在对象间的消息传递之上,且设计上更加符合现实世界,更加自然,所以面向对象方法得到了更广泛的应用。 面向对象数据库系统是为了满足新的数据库应用需要而产生的新一代数据库系统。在数据库中提供面向对象的技术是为了满足特定应用的需要。随着许多基本设计应用(如MACD和ECAD)中的数据库向面向对象数据库的过渡,面向对象思想也逐渐延伸到其它涉及复杂数据的应用中,其中包括辅助软件工程(CASE)、计算机辅助印刷(CAP)和材料需求计划(MRP)。这些应用如同设计应用一样在程序设计方面和数据类型方面都是数据密集型的,它们需要识别于类型关系的存储技术,并能对相近数据备份进行调整。 还有许多应用要求多媒体数据库。它们要求以集成方式和文本或图形信息一起处理关系数据,这些应用包括高级办公室系统的其它文档管理系统。 面向对象数据库从面向程序设计语言的扩充着手使之成为基于面向对象程序设计语言的面向对象数据库。例如:ONTOS、ORION等,它们均是C++的扩充,熟悉C++的人均能很方便地掌握并使用这类系统。 面向对象数据库研究的另一个进展是在现有关系数据库中加入许多纯面向对象数据库的功能。在商业应用中对关系模型的面向对象扩展着重于性能优化,处理各种环境的对象的物理表示的优化和增加SQL模型以赋予面向对象特征。如UNISQL、O2等,它们均具有关系数据库的基本功能,采用类似于SQL的语言,用户很容易掌握。 2.面向对象数据库的优点 面向对象数据库是数据库技术与面向对象程序设计方法相结合的产物,由于同是面向对象方法学,所以其具有了所有面向对象的优点。同时,由于数据库主要操作的是集合(而不是单个数据),所以其又具有自身的特点和优点。 (1)提高数据库开发效率

面向对象数据模型

第三节面向对象数据模型 1、传统数据模型存在的主要问题 已于前述,目前非空间数据最主要的数据模型是层次模型、网状模型和关系模型。这里,我们分别介绍它们用于GIS地理数据库的局限性 (1)层次模型用于GIS地理数据库的局限性 层次模型反映了地理世界中实体之间的层次关系,在描述地理世界中自然的层次结构关系时简单、直观,易于理解,并在一定程度上支持数据的重构。它用于GIS地理数据库存在的主要问题是: 1)、很难描述复杂的地理实体之间的联系,描述多对多的关系时导致物理存储上的冗余; 2)、对任何对象的查询都必须从层次结构的根结点开始,低层次对象的查询效率很低,很难进行反向查询; 3)、数据独立性较差,数据更新涉及许多指针,插入和删除操作比较复杂,父结点的删除意味着其下层所有子结点均被删除; 4)、层次命令具有过程式性质,要求用户了解数据的物理结构,并在数据操纵命令中显式地给出数据的存取路径; 5)、基本不具备演绎功能和操作代数基础。 (2)网状模型用于GIS地理数据库的局限性 网状模型是层次模型的一般形式,反映了地理世界中常见的多对多关系,在一定程度上支持数据的重构,具有一定的数据独立和数据共享特性,且运行效率较高。用于GIS地理数据库的主要问题如下: 1)、由于网状结构的复杂性,增加了用户查询的定位困难,要求用户熟悉数据的逻辑结构,知道自己所处的位置; 2)、网状数据操作命令具有过程式性质,存在与层次模型相同的问题; 3)、不直接支持对于层次结构的表达; 4)、基本不具备演绎功能和操作代数基础。 (3)关系模型用于GIS地理数据库的局限性

关系模型表示各种地理实体及其间的关系,方式简单、灵活,支持数据重构;具有严格的数学基础,并与一阶逻辑理论密切相关,具有一定的演绎功能;关系操作和关系演算具有非过程式特点。尽管如此,关系模型用于GIS地理数据库也还存在一些不足。主要问题是: 1)、无法用递归和嵌套的方式来描述复杂关系的层次和网状结构,模拟和操作复杂地理对象的能力较弱; 2)、用关系模型描述本身具有复杂结构和涵义的地理对象时,需对地理实体进行不自然的分解,导致存储模式、查询途径及操作等方面均显得语义不甚合理; 3)、由于概念模式和存储模式的相互独立性,及实现关系之间的联系需要执行系统开销较大的联接操作,运行效率不够高。 不难看出,关系模型的根本问题是不能有效地管理复杂地理对象。 2、面向对象的概念 面向对象的基本概念是在本世纪70年代萌发出来的,它的基本做法是把系统工程中的某个模块和构件视为问题空间的一个或一类对象。到了80年代,面向对象的方法得到很快发展,在系统工程、计算机、人工智能等领域获得了广泛应用。但是,在更高级的层次上和更广泛的领域内对面向对象的方法进行研究还是90年代的事。 (1)基本思想和基本概念 面向对象的基本思想是通过对问题领域进行自然的分割,用更接近人类通常思维的方式建立问题领域的模型,并进行结构模拟和行为模拟,从而使设计出的软件能尽可能地直接表现出问题的求解过程。因此,面向对象的方法就是以接近人类通常思维方式的思想,将客观世界的一切实体模型化为对象。每一种对象都有各自的内部状态和运动规律,不同对象之间的相互联系和相互作用就构成了各种不同的系统。 在面向对象的方法中,对象、类、方法和消息是基本的概念。 对象——含有数据和操作方法的独立模块,可以认为是数据和行为的统一体。如一个城市、一棵树均可作为地理对象。对于一个对象,应具有如下特征: ·具有一个唯一的标识,以表明其存在的独立性; ·具有一组描述特征的属性,以表明其在某一时刻的状态; ·具有一组表示行为的操作方法,用以改变对象的状态。

面向对象数据库的应用范围和优缺点

面向对象数据库面向谁? 它的市场在哪里? 陶伟编译 当今冠以面向对象的东西很多,什么面向对象分析,面向对象设计,面向对象语言,面向对象操作系统,面向对象软件工程,等等,诸如此类,不胜枚举。似乎凡是和面对象挂上了边,就要好卖得多。其实面向对象也不是包治百病的灵丹妙药,数据库加上了面向对象同样不可能解决所有的问题,它不是大街上的冰棍,人人都可以买,它有自己独特的应用领域和特有的用户群。向不懂C++或Smalltalk的人兜售面向对象数据库,无异于对牛弹琴。 面向对象数据库的用户主要是从事系统软件和高级应用软件开发的程序员和系统设计人员,它不是大众数据库,在这方面它有别于关系数据库面。面向对象数据库好比是医生用的手术刀,干的是"细活儿",和家庭主妇用的菜刀(关系数据库)不一样,那是用来干"粗活儿"的。面向对象数据库是什么? 面向对象数据库=数据库系统+面向对象系统面向对象数据库必须满足两条准则:首先,它是一个数据库管理系统,其次它是一个面向对象系统。第一条准则可以翻译成六条特征:持久性、缓冲管理、数据共享、数据可靠性(事务管理和恢复)、即席查询以及模式修改。第二条准则可以翻译成:封装性、继承性、多态、对象标识、计算完整性、复杂对象和可扩展性。除了基本定义之外,为了满足所谓的非常规应用领域,还要引入一些扩展的特征:如版本管理、长事务、协同工作、触发和约束等。其中最重要的是封装性、继承性、多态,它们充分体现了面向对象的特征。面向对象数据库的应用领域面向对象数据库的应用面比较窄,主要集中于系统级的软件开发,以及数据密集的、复杂的应用软件开发,包括: ▲计算机辅助设计CAD ▲计算机辅助制造CAM ▲计算机集成制造系统CIMS ▲计算机辅助软件工程CASE ▲超大规模集成电路设计VLSI Design ▲地理信息系统GIS ▲决策支持系统DSS 这些应用领域和传统的商业应用领域有着显著不同,它们表现为复杂的数据类型,而不是简单的二维表,复杂的数据结构上定义着复杂的操作语义,需要不同层次的数据抽象能力,这些均是传统数据库系统所无法满足的。面向对象数据库与文件系统和关系数据库的区别文件系统存贮的数据格式因程序员的设计的不同而不同,一般不能保证数据的一致性和完整性,也很难多个用户共享。关系数据库存贮的是二维表,能保证数据的一致性与完整性,但只能用关系数据模型去描述世界。面向对象数据库则用面向对象数据模型去映射客观世界,存贮的不仅是数据,而且存贮了定义在数据上的操作语义,以及对象之间的复杂引用和约束关系。相对于文件系统和关系数据库而言,面向对象数据库的特点可以做以下的形象描述:面向对象数据库提供了一种存贮对象的更好方法,因为它提供了传统数据库的全部服务,然而却无存储和检索对象时对象的拆卸与装配的开销,比较关系数据库和面向对象数据库存储复杂对象,后者好似直接把汽车开进车库存放,而前者则是把汽车拆成零部件来保存。如何应用面向对象数据库面向对象数据已进入了商业应用领域,但没有取代现有的数据库系统,通常是在处理非常复杂的数据,或者数据很难被分解为关系数据库二维表的情况时,才采用面向对象数据库。一般认为图像数据的处理,使用面向对象数据库非常合适,其实还有许多数据类型可以用面向对象数据库来存储。就目前使用情况看,计算机辅助设计CAD是面向对象数据库最大的应用领域,现在电信、金融服务、医疗保健、制造过程控制等诸多领域,也开始推广使用。主要的面向对象数据库厂商主要的面向对象数据库厂商有以下几家。·Object Design,Inc. ·Gemstone System,Inc. ·O2 Technology,Inc. ·Objectivity,Inc. ·Versant Object Technology

第9章 面向对象数据库系统习题解答

第9章面向对象数据库系统 习题解答 一. 简答题 1.面向对象程序设计的基本思想是什么?它的主要特点是什么? 面向对象程序设计的基本思想是用对象来理解和分析问题空间,并设计和开发出由对象构成的软件系统(解空间)。 面向对象方法的主要优点是:符合人们通常的思维方式;从分析到设计再到编码采用一致的模型表示具有高度连续性;软件重用性好。 2.解释面向对象模型中的对象、对象标识、封装、类、类层次等概念。 对象是一组数据结构和在这组数据结构上的操作的程序代码封装起来的基本单位。是对现实世界某个实体的抽象。 对象标识:唯一地标识某个对象。 封装:隐藏属性,方法或实现细节的过程,对外仅公开接口。 类:对象类的简称,即共享所有属性和方法的所有对象集合。 类层次:一组父子关系的类构成的层次结构 3.给出一个面向对象数据库的类层次的实例。 4.举例说明超类和子类的概念。 超类是子类的抽象,子类是超类的特殊化,如学生、本科生、研究生三个类,学生是本科生和研究生的超类,而本科生和研究生是学生的子类。因为本科生和研究生继承了学生的所有属性和行为。 224

二.问答题 1.对于实体集学生、课程、班级以及它们相互之间的联系,请用ODL来描述。要求为所有的属性和联系(正向、反向)进行说明,并且指出每个类的范围和键码。 Interface Student { attribute integer StudentNo; attribute string StudentName; attribute integer Age; attribute string Dept; relationship Set courses; inverse Course::students; relationship Class bemasterof; Inverse Class::master; relationship Class inclassof; Inverse Class::students; }; Interface Course { attribute integer CourseNo; attribute string CourseName; attribute string Teacher; relationship Set students; Inverse Student::courses; }; Interface Class { attribute integer ClassNo; relationship Student master; Inverse Student::bemasterof; relationship Set students; Inverse Student::inclassof; } 2.对于第1题的ODL描述,请将ODL设计转换为关系数据库模式。 Student(StudentNo, StudentName,Age,Dept) Course(CourseNo,CourseName,Teacher) Class(ClassNo) 3. 根据第1题的ODL描述,请你应用FOR ALL和EXISTS量词设计一个OQL查询,并编程实现之。 输出李红选修的课程名称 Select c.CourseName from Course c where exists s in c.students: s.StudentName=’李红’ 225

面向对象的关系数据库设计

面向对象的关系数据库设计 2007-11-23 21:29 一、概念的区分 有些人把面向对象的数据库设计(即数据库模式)思想与面向对象数据库管理系统(OODBMS) 理论混为一谈。其实前者是数据库用户定义数据库模式的思路,后者是数据库管理程序的思路。用户使用面向对象方法学可以定义任何一种DBMS数据库,即网络型、层次型、关系型、面向对象型均可,甚至文件系统设计也照样可以遵循面向对象的思路。 面向对象的思路或称规范可以用于系统分析、系统设计、程序设计,也可以用于数据结构设计、数据库设计。OOSE自上至下、自始至终地贯彻面向对象思路,是一个一气呵成的统一体。面向对象的数据库设计只是 OOSE 的一个环节。 二、数据库设计的重要性 一般数据库设计方法有两种,即属性主导型和实体主导型。属性主导型从归纳数据库应用的属性出发,在归并属性集合(实体)时维持属性间的函数依赖关系。实体主导型则先从寻找对数据库应用有意义的实体入手,然后通过定义属性来定义实体。一般现实世界的实体数在属性数 1/10 以下时,宜使用实体主导型设计方法。面向对象的数据库设计是从对象模型出发的,属于实体主导型设计。 一般数据库应用系统都遵循以下相关开发步骤: 1 、设计应用系统结构; 2 、选择便于将应用程序与 DBMS 结合的DBMS体系结构,如RDBMS; 3 、根据应用程序使用的环境平台,选择适宜的DBMS(如Oracle)和开发工具(如PB); 4 、设计数据库,编写定义数据库模式的SQL程序; 5 、编写确保数据正确录入数据库的用户接口应用程序; 6 、录入数据库数据; 7 运行各种与数据库相关的应用程序,以确认和修正数据库的内容。 对以上各步骤,有几点需要说明: (1) 这不是瀑布模型,每一步都可以有反馈。以上各步不仅有反馈、有反复,还有并行处理。 比如一些库表在数据录入时,另一些库表设计还在修改。 这与我们的递增式开发方法有关,也与面向对象的特征有关。 (2) 上述顺序不是绝对的,大多数场合是从第三步开始的。 (3) 对大多数数据库应用系统来说,上述各步中最重要、最困难的不是应用系统设计而是数据库设 三、DBMS的支持和数据库设计 很多数据库应用系统开发者不重视数据库设计的原因是:他们太迷信DBMS,认为购入一个功能强大的 DBMS后数据库设计就不困难、不重要了。一些国内外的数据库教材常常是在为DBMS的开发厂商做宣传,而很少站在数据库用户角度,从数据库应用系统出发介绍数据库设计方法。结果往往使读者搞不清书中介绍的是数据库管理程序的设计思想,还是应用这种 DBMS 进行数据库设计的思想。 其实,DBMS只是给用户为已采用的数据库提供一个舞台,而是否使用这个舞台上

相关文档