第 10章对象关系数据库
? 在传统的关系型数据库系统的基础上引入了面
向对象的这类系统称为对象关系数据库系统
( ORDB) 。
? 本章主要内容包括,对象关系数据模型,
ORDBS数据库设计方法 — 对象联系法,SQL3
对 ORDBS的支持,OODBS和 ORDBS的比较。
第 10章对象关系数据库
? 10.1 对象关系数据模型
? 10.2 对象联系图
? 10.3 ORDB的定义语言
? 10.4 ORDB的查询语言
? 10.5 OODB与 ORDB的比较
? 10.6 小结
? 10.7 习题
10.1 对象关系数据模型
? 传统关系模型称为, 平面关系模型,,不允许表中有表。
? 在传统关系数据模型基础上,增加了元组、数组、集合
等数据类型,以及提供了处理新数据类型操作的能力,
并具有继承性和对象标识等面向对象特点,这样的数据
模型,称为, 对象关系数据模型, 。基于对象关系数据
模型的 DBS称为, 对象关系数据库系统, (ORDBS)。
? 对象关系模型是对关系模型的发展,与传统的关系模型
兼容,因此许多概念,如实体标识、多值属性、泛化 /细
化等,都可以直接引用,而无需经过变换转化。原来
SQL语言照样可用,只不过扩充了更强的功能。
? 对象关系模型使用对象联系图来描述系统结构。
10.2 对象联系图
? 对象联系图是实体联系图的一种扩充形式,用
于表达系统中各对象之间的相互关系,不仅能
描述关系中基本的数据结构,还 可以用来表达
面向对象技术中嵌套、递归的数据结构。
? 10.2.1 对象联系图的成分
? 10.2.2 学校、教师和教材对象联系图
? 10.2.2 数据的泛化 /细化的描述
10.2.1 对象联系图的成分
? 用实线表示对象之间的联系 。
? 椭圆代表对象类型 (相当于实体类型 )。
? 小圆圈表示属性是基本数据类型 (整型, 实型, 字符串 )。
? 椭圆之间的边表示对象之间的, 引用, 。
? 单箭头 (→ )表示属性值是单值 (属性可以是基本数据类型,
也可以是另一个对象类 型 )。
? 双箭头 (→→ )表示属性值是多值 (属性可以是基本数据类
型, 也可以是另一个对象类型 )。
? 双线箭头 ( )表示超类与子类间的联系 (从子类指向超类 )。
? 双向箭头 (??)表示两个属性之间值的联系为逆联系 。
10.2.2 学校教师和教材对象联系图
10.2.3 数据的泛化 /细化的描述
? 当在较低层上抽象表达了与之联系的较高层上
抽象的特殊情况时,就称较高层上抽象是较低
层上抽象的, 泛化,,而较低层上抽象是较高
层上抽象的, 细化, 。
? 其中,较高层的对象类型称为, 超类
型, (Supertype),较低层的对象类型称为, 子
类型, (SubType)。
? 子类型具有继承性,能继承超类型的特征,而
子类型本身又有其他的特征。
10.2.3带泛化边的对象联系图
10.3 ORDB的定义语言
? 对象关系数据库系统支持更复杂的数据类型,
如 结构类型,元组、数组、集合数据类型,支
持继承和引用,与关系模型兼容,因此 原来支
持关系模型的 SQL语言也照样可用。
? 在 SQL99标准中提供了对 对象关系模型数据库
的支持。
? 本小节介绍 ORDB的定义语言,主要包括 ORDB
的数据类型的定义、继承性和引用类型的定义
等内容。
10.3 ORDB的定义语言
? 10.3.1 ORDB的数据类型
? 10.3.2 结构类型
? 10.3.3 集合、数组和大对象
? 10.3.4 继承性的定义
? 10.3.5 引用类型的定义
? 10.3.6 方法、函数和过程
? 10.3.7 SQl3过程语句
10.3.1 ORDB的数据类型
? 复合类型有四种:
? (1) 结构类型:不同类型元素的有序集合称为结构 。
如日期可由日月年三部分组成 (如,8,July,2002)。
? (2) 数组类型:同类元素的有序集合, 称数组 。
? (3) 多集类型:同类元素的无序集合 (成员可多次出现 ),
称为多集 (Multiset)。 例如成绩集 {80,70,80,80}。
? (4) 集合类型:同类元素的无序集合 (每个成员只能出
现一次 ),称为集合 (Set)。 例如课程集,{MATHS,
PHYSICS,PL,OS,DB}。
? 数据类型可以嵌套。
10.3.2 定义结构类型
? 车间与职工的嵌套关系
? Dept(dno,dname,staff(empno,ename,age))
? 可用下列形式定义:
? create type Employee(empno char(8),
? ename varchar(20),
? age integer);
? create type Department(dno char(8),
? dname Varchar(20),
? staff setof(Employee));
10.3.3 定义集合、数组和大对象
? create type NameArray varchar[10];
? /*定义 NameArray即是数组类型 */
? create type CourseGrade(course Varchar(20),
? grade integer);
? create type StudentCourse (name Varchar(20),
? cg setof(course));
? /*定义 StudentGrade由姓名和课程成绩表构成 */
? create table sc of StudentCourse;
? /*定义表 sc为结构 StudentCourse的集合 */
10.3.4 继承性的定义
? 在 ORDB中,提供了对继承的支持,继承性可
以发生在类型一级或表一级。
? 类型级的继承性是指在定义一个类时可以从已
存在的类中继承相关的属性。表级的继承性是
指一个表可继承上级表的属性。
? 类继承性:定义学生类型
? create type Student (degree Varchar,
? department Varchar)
? under Person;
10.3.4 表级继承性
? 先用 SQL定义一个表 People:
? create table person (name Varchar,
? social_number integer);
? 然后再用继承性定义另个表 student:
? create table Student (degree Varchar,
? department Varchar)
? under Person;
10.3.5 引用类型的定义
? 递归嵌套结构:在部门类型与雇员类型的联系中, 定义
了元组类型 Dept与 Emp。
? Dept( dno,dname,emp(eno,ename,age))
? Emp(eno,ename,age,Dept(dno,dname))
? 在 Dept类中包括了 Emp类, 表示个部门有哪些雇员 。 在
Emp类中又要包括 Dept类, 表示雇员在哪个部门工作 。
10.3.5部门雇员引用类型定义
? create table Dept(dno integer,
? dname varchar(20),
? staff setof(ref(Emp)));
? create table Emp(empno integer,
? ename varchar(20),
? sex varchar(20),
? Age integer,
? Works_for ref(Dept));
10.3.6 方法、函数和过程 1
? 定义结构类型时创建方法 。 如:
? create type Employee as(
? name varchar(20),
? salary integer)
? method give_raise(percent integer))
? create method give_raise(percent integer) for
Employee
? Begin
? set self.salary= self.salary+( self.salary*percent)/100;
? end
10.3.6 方法、函数和过程 2
? SQL支持函数:
? create function Publisher(x varchar(20),y
varchar(20))
? return Publisher
? Begin
? set name=x;
? set branch=y;
? end
10.3.6 方法、函数和过程 3
? SQL3支持过程, 如 auther_count可写成过程:
? create procedure auther_count_proc(in title
varchar(20),out a_count integer)
? begin
? select count(author) into a_count
? from authors
? where suthors.title=title;
? end
10.3.7 SQl3过程语句
? 用 SQl3构造过程, 几乎可使用通用语言的
所有功能, 使用分支或循环结构 。 它提供
以下语句:
? while <条件 > do set… end while
? repeat set … until <条件 > end repeat
? for <变量 > as … do set… end for
? if <条件 > then set… else… end if
? case语句
10.4 ORDB的查询语言
? 对面向对象数据库进行查询仍可用 SQL语句实
现。对 SQL语言的 SELECT句型进行扩充便能处
理带有复合类型、嵌套及引用类型。
? 本节以学校、员工和教材 ORDB为例,介绍面
向对象的 SELECT句型的用法。
? 10.4.1 以关系为值的属性
? 10.4.2 路径表达式
? 10.4.3 嵌套与解除嵌套
10.4.1 以关系为值的属性
? 允许表达式出现在任何关系名可以出现的地方,比如
FROM子句或 SELECT子句中。表达式可灵活地用于处理
嵌套关系结构。
? 例 10_1,检索讲授, maths”课, 采用, Math”教材的教
工号和姓名 。
SELECT fno,fname
FROM faculty
WHERE ('maths','Math') IN teach;
? 例 10_2,检索每一位教师开设的课程 。
SELECT A.fname,B.cname
FROM faculty as A,A.teach as B;
10.4.2 路径表达式
? 例 10_3:检索长沙地区的大学校长姓名。
SELECT uname,president.fname
FROM university
WERE city=‘changsha’;
? 例 10_4:检索长沙地区各大学超过 50岁的教师姓名。
SELECT A.uname,B.fname
FROM university as A,A.staff as B
WHERE A.city=‘changsha’ AND B.age>50;
10.4.3 嵌套与解除嵌套
? 查询结果可以嵌套关系形式显示, 也可以 INF(非嵌套 )形
式显示 。 将一个嵌套关系转换成 INF的过程称为解除嵌套 。
? 例 10_5:在上例中, 如果希望查询结果为嵌套关系, 那
么可在属性 (fno,fname)上对关系进行嵌套, 语句如下:
SELECT A.unme,set(B.fno,B.fname) as teachers
FROM university as A,A.staff as B,B.teach as C
WHERE C.editor.uname=A.uname
GROUP BY A.uname;
10.5 OODB与 ORDB的比较
OODB ORDB
从 OOPLC++出发引入持久数据概
念, 能操作 DB形成持久化 C++
从 SQL出发, 引入复合类型, 继
承性, 引用类型等概念
导航式查询 结构化查询
符合面向对象语言 符合第 4代语言
显式联系 隐式联系
惟一的对象标识符 用主键标识记录
能够表示, 关系, 能够表示, 对象,
10.6 小结
? 在传统关系模型基础上引入面向对象功能, 提供复合数
据类型, 这种模型称为对象关系模型 。
? 支持对象关系模型的 DBS称为 ORDBS。
? 对于 ORDB的设计, 常用的方法是采用对象联系图法 。
? 对象联系图是实体联系图的扩充, 是面向对象数据模型
中数据结构的一种重要图例表示方法 。 它使用了对象标
识的概念, 使结构的嵌套和递归成为可能 。
? 在 SQL3中已收入了面向对象的内容,扩充的 SQL3适应对
象概念并提供一个高级接口。
10.7 习题 1
? 10.1 名词解释:平面关系模型、嵌套关系模型、
复合对象模型、数据的泛化 /细化、对象关系模

? 10.2 什么是对象联系图?图中椭圆、小圆圈、单
箭头、双箭头、双线箭头、双向箭头各表示什么
含义?
? 10.3 在 ORDB中有哪些基本数据类型?有哪些复
合数据类型?
? 10.4 关系 DBS、基于持久化语言的 OODBS,
0RDBS三者各有什么长处和劣势?
10.7 习题 2
? 10.5画出学生 (student)和学习 (study)信息的对
象联系图。
? 1.试用 ORDB的定义语言,定义这个数据库。
? 2.试用 ORDB的查询语言,分别写出下列查询
的 SELECT语句:
? ( 1)检索每个学生的学习课程和成绩。
? ( 2)检索至少有一间课程的求学地与籍贯在
同一城市的学生学号和姓名。