第 9章 面向对象数据库
? 面向对象 ( Object_Oriented) 技术和 DB技术两种结合
方法 。 一种是在 OO程序设计语言中引入 DB技术,面向
对象 DBS( OODBS), 亦称 ( ODBS), 纯粹 ODBS或
第一代 ODBS。 另一种是在 RDBMS中加入 00技术, 使
RDBMS具备面向对象的功能, 称为对象关系 DBS
( ORDBS) 亦称为第二代 ODBS。
? 本章先介绍面向对象数据模型的基本概念, 然后介绍
OODBS的基本原理以及 OODBS数据库设计方法 --ODL,
最后介绍了持久化 C++。
? 要求掌握 OODBS的基本概念, 基本原理以及设计方法 。
第 9章 面向对象数据库
? 9.1 面向对象数据模型的基本概念
? 9.2 面向对象数据库
? 9.3 面向对象数据库设计 --ODL
? 9.4 ODL定义子类与约束
? 9.5 持久化程序设计语言
? 9.6 持久化 C++系统
? 9.7 小结
? 9.8 习题
9.1 OO数据模型的基本概念
? IS开发要求能不断缩小系统的开发周期,降低开发成
本,增强系统的易维护性和开放性。
? 传统关系模型的数据对象过于简单,没有复杂的嵌套
数据和复杂数据结构,不能实现实体间聚合、继承等
复杂联系,难以胜任复杂数据类型处理方面的需要。
? 面向对象的本质是把数据和处理数据的过程当成一个
整体对象,而不再把两者分开。它不仅能实现数据模
拟,也能实现行为模拟。
? 基本概念:对象、类、继承性、对象标识、对象包含
以及封装和数据隐藏技术。
9.1 OO数据模型的基本概念
? 对象,基本原则是, 任何东西都是对象,,由以下三个
部分组成:变量(属性)消息方法。
? 类( class),类是相似对象的集合。
? 继承,类可以生成子类。原来的类称为父类(基类),
子类称为派生类。由派生类可生成派生类。派生类继承
基类的属性与方法。
? 对象标识:在系统内是惟一的。
? 对象包含:不同类的对象之间可能存在着包含关系(即
组合关系),包含其他对象的对象称为复合对象。
? 封装性:对象的使用者只能看到对象封装界面上的信息,
对象的内部对使用者是隐蔽的,其目的在于将对象的使
用者和设计者分开。
9.2 面向对象数据库( OODBS)
? 1.ODMG( 0bject Data Management Group)
组织。
? 2.OODBS:,面向对象系统 +数据库能力, 。
? 3.OODBS的问题和局限性,
? ( 1)没有统一可行的标准
? ( 2)与关系数据库系统不紊容
9.3 面向对象数据库设计 --ODL
? ODL是用于面向对象数据库系统设计的数据定义语言,
它是用面向对象的术语说明数据库结构。
? 用 ODL设计类需要描述类的三种特性:
? ( 1) 属性( attribute)是对象所具有的特性,属性数
据类型是由基本数据类型(例如整型或字符串)构成。
? ( 2)联系( relationship)可看成是一些特性,联系的
类型或是对其它类对象的引用或是这种引用的聚集(例
如,一个集合)。
? ( 3)方法( method)是指能用于该类对象的函数。
9.3.1 ODL接口说明
? 在 ODL中, 形式最简单的类的说明应包括:
? ( 1) 关键字 interface( 接口 ) 。
? ( 2) 接口的名字 ( 类 ) 。
? ( 3) 用花括号括起来的类的特性表 。 特性包
括属性, 联系和方法 。
? 接口说明的简单形式是:
? interface<名字 >{
? ( 特性表 )
? }
9.3.2 ODL对属性的说明
? 电影类可用 ODL说明如下:
? ( 1) interface Movie{
? ( 2) attribute string title;
? ( 3) attribute integer year;
? ( 4) attribute integer length;
? ( 5 ) attribute enum Film{color,
blackAndWhite} filmType;
? };
9.3.3 ODL对联系的说明
? 1.在 Movie类说明中, 可用下面一行表示这种
联系:
Re1ationship Set<Star> Stars;
? 2.反向联系的说明:
? relationship Set <Movie> StarredIn
inverse Movie::Stars;
9.3.4 Star类说明
? ( 1) interface Star{
? ( 2) attribute String name;
? ( 3) attribute Sruct Addr
? {String street,String city}address;
? ( 4) relationship Set <Movie> StarredIn
? inverse Movie::Stars;
? };
9.3.4 电影类 ODL定义
? ( 1) interface Movie{
? ( 2) attribute string title;
? ( 3) attribute integer year;
? ( 4) attribute integer length;
? ( 5 ) attribute enum Film{color, blackAndWhite}
filmType;
? ( 6) relationship Set <Star> stars
? inverse Star::starredIn;
? ( 7) relationship Studio ownedby
? inverse Studio::owns;
? };
9.3.4 影星类 ODL定义
? ( 8) interface Star{
? ( 9) attribute String name;
? ( 10) attribute Sruct addr
? {String street,String city}address;
? ( 11) relationship Set <Movie> starredIn
? inverse Movie::stars;
? };
9.3.4 制片公司类 ODL定义
? ( 12) interface Studio {
? ( 13) attribute string name;
? ( 14) attribute string address;
? ( 15) relationship Set<Movie> owns
? inverse Movie,,ownedBy;
? };
9.3.5 ODL中的数据类型
? ODL的数据类型系统由基本类型和结构类型构成。
? 1,基本类型包括,(1)原子类型,( 2)接口类型:
? 2,结构类型包括:
? ( 1)集合。 Set<T>,元素类型为 T。
? ( 2)包。 Bag<T>,如 {1,2,1}
? ( 3)列表。 List<T>表示列表类型。
? ( 4)数组。 Array<T,i>表示数组,由 i个类型为 T的
元素组成。
? ( 5)结构。如 T1,T 2 …Tn是类型,F1,F2…Fn是城名,
结构,Struct N {T1F1,T2F2,…,TnFn}
9.4 ODL定义子类与约束
? ODL提供子类定义和约束定义 。 子类用来描述
内部的继承性, 约束用来描述一些附加信息 。
? 9.4.1 在 ODL中定义子类
? 9.4.2 ODL定义多重继承
? 9.4.3 ODL中的约束
9.4.1 在 ODL中定义子类
? 格式如下:
? interface <子类名 >,<超类名 >{
? <特性表 >
? }
? 例,Cartoon是 Movie类的子类, 命令如下:
? ( 1) interface Cartoon,Movie{
? ( 2) relationship Set<Star> voices;
? };
9.4.2 ODL定义多重继承
? Cartoon-MurderMystery 是 Cartoon 类和
MurderMystery类的子类 。
? 定义格式如下:
? Interface Cartoon-MurderMystery:
Cartoon,MurderMystery{
? <特性表 >
? };
9.4.3 ODL中的约束
? ( 1) 键码约束:键码是能唯一标识一个对象或一个实
体的属性或属性集, 一个类中的两个对象的键码不能
相同, ( key 属性名 ) { }。
? ( 2) 单值约束:即要求某个属性的值是唯一的 。 键码
是单值约束的主要来源 。
? ( 3) 参照完整性约束:要求某个对象引用的值在数据
库中一定要存在 。
? ( 4) 域约束:要求属性的值来自于某一个范围 。
? ( 5) 一般约束:要求在数据库中保存的任意的断言,
可以保证实现更复杂的数据完整性要求 。
9.5 持久化程序设计语言
? 持久化程序设计语言 ( Presistent Programming
language) 是对现有的面向对象程序设计语言
( OOPL) 进行扩充使之能处理数据库的一种高
级语言 。
? 本节包括:
? 9.5.1 持久化语言与嵌入式语言的区别
? 9.5.2 持久化语言的基本概念
9.5.1 持久化语言与嵌入式语言
的区别
? 持久化语言是对高级语言进行扩充, 能处理持久数据 。
? 持久化语言与嵌人式 SQL语言在以下两个方面不同:
? ( 1) 在嵌入式语言中, 宿主语言的类型系统与 SQL的
类型系统不同, 程序员要负责宿主语言与 DML之间的
类型转换 。 而持久化程序设计语言的查询语言与宿主
语言完全集成在一块, 具有相同的类型系统 。。
? ( 2)使用嵌入式查询语言要负责编写程序把数据从数
据库中取出放到内存中。在更新时,程序员还需编写
程序段将更新过的数据写回数据库。持久化语言可以
直接操纵持久数据,而不必为存取数据编写程序。
9.5.2 持久化语言的基本概念
? 1,对象的持久性
? 对象分持久对象和暂留对象 。 程序运行结束后, 持久
对象将被保存, 暂留对象将消失 。
? 2,对象标识和指针
? 一个持久对象被创建时就要被分配一个持久的对象标
识符 。
? 3,持久对象的存储和访问 。
? 方法 一是 根据对象名找对象 ; 方法 二是 依据对象标识
找对象 ; 方法三是将对象按聚集形式存放, 然后利用
程序循环找所需对象 。
9.6 持久化 C++系统
? C++语言是一种面向对象的高级语言,C++面
向对象特征有助于在不改变语言的前提下提供
对持久性的支持。
? C++语言通过类库来提供持久化支持,只需对
C++作最小的改动,容易实现。
? 扩充体现在两个方面,C++对象定义语言和
C++对象操纵语言。
? 9.6.1 ODMG C++对象定义语言
? 9.6.2 ODMG C++对象操纵语言
9.6.1 ODMG C++对象定义语言
? ODMG C++对象定义语言( C++ ODL)扩充
了 C++的类型定义语法。
? [例 ] 在图 9_4的对象联系图中,Faculty类是
Person类的子类。对于这个带泛化边的对象联
系图,可用 C++ ODL进行定义,代码如下:
? 见教材
?
9.6.1 图 9_4 对象联系图
9.6.2 ODMG C++对象操纵语言
? ODMG C++对象操纵语言( C++ OML)内容
较多。
? 例如,在学校教师教材数据库中,欲插入一条
教师开课信息,格式为:
? ( fno,cname,textname,uname)
? 要经过复杂的算法。
9.7 小结
? OO技术与 DB技术的结合是 DB一个主要的发展方向 。
? 在 00技术与 DB技术结合有两条路径。 OODBS; ORDB。
? OO是 OOPL思想在 DBS中的应用。基本点是将数据及操
作数据的代码封装在对象里。相似对象形成类。
? 在 OOPL C++基础上进行扩充,使之能处理持久数据,
形成持久化 C++系统,即面向对象数据库( OODBS)。
? 面向对象数据库( OODBS)设计采用的一种方法是 ODL。
? 对象定义语言能给出类的属性、联系和方法描述对象的
类。属性通过它们的数据类型来描述。
? ODL的类型包括基本类型(如整形)及具有记录结构、
集合、包、列表和数组形式的结构类型。
? 联系通过和它们相连的类描述,并允许单值或多值。
9.8 习题 1
? 9.1 名词解释:复合对象模型, ODMG组织, 对象, 类,
单重继承性, 多重继承性, 对象包含, 类继承层次图,
类包含层次图, 持久数据, 持久指针, 持久化 C++系统,
对象标识, 持久对象
? 9.2 设计一个适合大学选课的数据库 。 应当包括学生, 系,
教授, 课程, 哪个学生选了哪门课, 哪个教授教哪门课,
学生的分数, 课程的助教 ( 由学生兼任 ) 。 一个系提供
哪些课程以及你认为适当的任何其他信息 。
9.8 习题 2
? 9.3 为银行设计一个数据库, 包括顾客及其帐
户的信息 。 顾客的信息包括姓名, 地址, 电话
和社会保险号 。 帐户包括编号, 类型 ( 例如,
存款, 支票 ) 和结余 。 还要记录拥有帐户的顾
客 。 对这个数据库用 ODL进行描述 。 为所有的
属性和联系选择适当的类型 。