北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4 对象关系数据库
? 传统关系型仅支持简单数据类型;不支持数组、
嵌套和递归的数据结构,给新型数据模型 -面向
对象的数据模型提供了应用背景。
? 面向对象的程序设计思想和技术促进了面向对象
的数据模型的实现和应用 -OODBS(面向对象数据
库 )。
? 习惯于 ‘ 填表 ’ 方式的客户不太愿意接受对象模
型,而且 面向对象数据库系统与编程语言集成度
高,没有统一可行标准; OODBS只占很小的市场分
额。
? 以关系数据库和 SQL为基础扩展关系模型 -对象关
系数据库 (ORDBMS)的发展满足了许多应用需求。
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4 对象关系数据库
? ORACLE,DB2 UDB,INFORMIX都推出 ORBMS,
ANSI/ISO 发布的 SQL-99标准是一个对象关系
标准。
1.4.1 面向对象数据模型
1.4.1.1对象与标识
1.4.1.2类和类层次
1.4.1.3继承和嵌套
1.4.1.4面向对象数据库
1.4.2 ORACLE对象关系库
1.4.2.1ORACLE中对象类型
1.4.2.2ORACLE中汇集类型
1.4.2.3PL/SQL过程、用户
定义函数和方法
1.4.3 对象关系数据库
1.4.3.1对象联系
1.4.3.2ORDB数据定义
1.4.3.3ORDB数据查询
1.4.3.4三种产品的对象
关系特征
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.1面向对象数据模型
? 面向对象数据库系统 (Object Oriented Database System,
OODBS)是数据库技术与面向对象程序设计方法相
结合的产物;面向对象程序设计方法的主要活动
在建立对象和对象之间的联系;面向对象数据库
系统一般依赖于一个面向对象的程序设计语言,
一个面向对象数据库系统是一个持久的、可共享
的对象库的存储和管理者;而一个对象库是由一
个 OO模型所定义的对象的集合体。
? 面向对象数据模型是用面向对象观点来描述现实
世界实体的逻辑组织、对象间限制、联系,
面向对象程序设计语言中建立的对象自动保存在磁盘上即 OODBS
面向对象数据库的用户主要是应用软件系统软件开发专业程序员
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.1面向对象数据模型
? 面向对象数据模型的主要观点,
对象,对象是基本的数据结构,现实世界的任
一实体都被统一模型化为一个对象,每个对象有
一个永久标识;对象可以被指定为一个给定类型,
还可以定义为其它对象的子类型;
封装,每一个对象是其状态与行为的封装。
封装的状态为属性,行为为方法。对象与外部通
信一般只能通过显式的消息传递。
继承,子类型继承父类型的所有特性和行为,
面向对象的核心观点构成 OO模型的基础,没有像关系模型那样
的规范说明。
如果与面向对象数据库相比,RDBMS可以称为面向表的数据库。
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.1.1对象与标识
? 对象是由一组数据结构和在这组数据结构上的操
作的程序代码封装起来的基本单位,包括:属性、
方法和消息。
? 面向对象的数据库系统在逻辑上和物理上从面向
记录上升为面向对象、面向可具有复杂结构的一
个逻辑整体。
? 面向对象数据库中的每一个对象都有一个唯一的
不变的标识 (OID)。创建对象时系统就给它赋予
一个 OID,直到它被删除。
? 外部与对象的通信只能通过消息,隔离了对象的
实现与对象的应用,提高数据独立性。
? 查询属性值通过调用方法,不象关系系统那样使
用 SQL,不够方便灵活。 ORDBMS中不支持
封装,可即席查询
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.1.2 类和类层次
? 相似对象的集合称为类,每个对象称为它所在类
的一个实例,一个类中的所有对象共享一个定义,
它们的区别仅在与属性的取值不同,类本身也可
以看作一个对象 (类对象 ).
? 面向对象数据模型提供类层次结构,一个面向对
象数据库模式可能有多个类层次 (超类和子类 ),
在一个类层次中,一个类继承其所有 (直接和间接
的 )超类的全部属性、方法和消息,超类是子类的
抽象,子类是超类的特殊化,
对相似对象的重复定义十分浪费,将相似对象分组形
成一个“类”
不同类的对象可以共享他们公共部分的结构和特性
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.1.2 类和类层次
? 类层次可以动态扩展,一个新的子类能从一个或
多个已有类导出。
? 面向对象数据库中,类是, 型,,对象是某一类的
一个, 值,,类属性的定义域可以是任何类 (基本
类或包含属性和方法的一般类 )。
? 面向对象数据库模式是类的集合,类可能有多个
类层次。
例如:一个学校应用的面向对象数据库,其中有教职员工
和学生两个类,这两类都有身份证号、姓名、性别、住址
等属性,也有相同的方法和消息。统一定义教职员工和学
生的公共属性、方法和消息部分,称为一个类“人”;分
别定义各自的特殊属性、方法和消息部分,分别称为教职
员工类和学生类,教职员工类和学生类定义为人的子类。
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.1.3继承和嵌套
? 子类继承超类的特性,避免许多重复定义,这种继
承性有两优点,是建模的有力工具 ;提供信息重用
机制,封装和继承导出多态性,
? 子类可以定义自己特殊的属性、方法和消息,在
定义这些特殊的属性、方法和消息时可能与超类
或多个超类之间发生冲突,这种冲突由系统解决,
不同系统使用不同的冲突解决方法,
? 一个对象属性可以是另一个对象称为对象的嵌套,
这样一来,不仅类之间具有层次结构,而且某一个
类内部也具有嵌套层次结构,形成对象横向和纵
向的复杂结构, 不像 RDBMS中的平面结构
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.1.4面向对象数据库
? 在 OODB中,与对象模型密切相关的是面向对象数
据库语言。 OODB语言主要包括对象定义语言
( ODL)和对象操纵语言( OML),对象操纵语言
一个重要子集是对象查询语言( OQL)。
? OODB语言一般应具备类的定义与操纵、操作 /方
法的定义、对象的操纵功能。
? 面向对象数据库语言的研制是 OODB系统开发中的
重要部分,人们试图扩充面向对象程序设计语言
OOPL的查询语言或者扩充 SQL的功能,目前还没
有像 SQL那样的关于面向对象数据库语言的标准。
不同的 OODBMS其具体的数据库语言各不相同。
RDBMS中有数据定义 DDL、数据操纵 DML、数据控制 DCL
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2ORACLE对象关系库 (对象关系模型 )
? 对象关系模型支持用户类型定义 (ORACLE称对象
类型 ;INFORMIX称行类型 ;DB2 UDB称用户定义类
型 ).一个表是包含用户定义类型的多个行,
? 对象关系模型允许一个行包括一个行值汇集 (如
数组或单个列自身是一个表 ).
? 面向对象数据库中,只能通过对象的方法操纵对
象,在对象关系模型中,所有对象被看作是公共的
而并非私有的,通过 SQL即可操纵对象,当然也可
使用用户定义的函数,
显然,对象关系模型违反第一泛式规则
显然,对象关系模型没有面向对象数据模型和关系
模型那样严格
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2ORACLE对象关系库 (一个例子 )
职工号 姓名 职务 家属关系 姓名
0001 张家口 职员 妻子 李小玫儿子 张冠李
0002 柴米油 经理 妻子 陆续琴
0003 郝成功 职员
妻子 朱那亚
儿子 郝乃军
女儿 郝佳欣
家属属性有内部数据结构,对象类型
每个行中包含多个值,汇集类型
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.1ORACLE中对象类型
? 一个对象类型有多个类型属性,ORACLE中对象类
型由 Create type语句创建,
例,create type namesex_t as object
(name char(8),sex char(2));/
create table employees (eid char(4),
ename namesex_t,job char(6));
insert into employees value(‘0001’,
namesex_t(‘赵子龙 ’,’男 ’ ),’经理 ’ );
select e.eid,e.ename.name,e.ename.sex
from employees e
where e.job=‘业务员 ’ ;
SQL*plus中创
建对象必须有 /
前面‘表名,’
不能省略
typename(属性
值 )称为对象构
造器
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.1ORACLE中对象类型
? 创建对象的一般格式,
CREATE TYPE typename AS OBJECT
(属性名 类型 [,属性名 类型 …]);
(informix中用 create row type rowname(),行类型 )
? 若 ORACLE中表的行包含对象类型,则称为对象
表 (informix中称类型表 ).采用如下形式定义表,
CREATE TABLE tablename OF typename
[([属性名 NOT NULL][,属性名 NOT NULL…]
[,PRIMARY KEY (属性名 [,属性名 …])])];
? DROP TYPE typename [FORCE];
DROP TABLE tablename;
可以是其他用户已经定义的类型,由此形成对象的嵌套和依赖
typename
对象中属
性即成为
表中属性
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.1ORACLE中对象类型
? 例,create type employee_t as object
(eid char(4),ename namesex_t,job char(6));
create table employees of employee_t
(primary key(eid));
? 对象表 (包含行对象 employee_t和列对象 ename)
无名顶层列 employees
顶层属性 eid ename Job
ename属性 ename,name ename.sex
行 1 0001 赵子龙 男 经理
行 2 0002 张翌德 男 职员
行 3 0003 孟可飞 女 职员
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.1ORACLE中对象类型
? 可用嵌套的点号访问一个对象的属性,无
名顶层列可以用 VALUE()形式引用行对象,
select * from employees e where e.job=‘经理 ’ ;
select value(e) from employees e where e.job=‘经理 ’ ;
select e.eid,e.job from employees e
where e.ename=namesex_t(‘孟可飞 ’,’女 ’ );
eid ename(name,sex) job
0001 namesex_t(‘赵子龙’,’男’ ) 经理
value(e) (eid ename(name,sex) job)
employee_t (0001 namesex_t(‘赵子龙’,’男’ ) 经理 )






对象构造器
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.1ORACLE中对象类型
? INSERT和 UPDATE同样可以使用对象构造器,
insert into employees
values(‘0004’,namesex_t(‘胡作为 ’,’男 ’ ),null);
update employees e set e=employee_t(‘0004’,
namesex_t(‘胡有为 ’,’男 ’ ),‘职员 ’ ) where eid=‘0004’;
? ORACLE为每个行对象提供一个唯一标识
(对象标识符 ).一个表的列可被定义为
REF(引用 )的内部数据类型,允许它 ‘ 指向 ’
一个对象表的行对象,对象的 REF与对象自
身具有不同类型,
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.1ORACLE中对象类型
create type c_t as object (…);
create type a_t as object (…);
create type p_t as object (…);
create type o_t as object
(ordno int,month char(2),
cid char(3),aid char(3),
pid char(3),qty int,
dollars double precision,
oc ref c_t,
oa ref a_t,
op ref p_t);
create table c of c_t
(primary key (cid));
create table a of a_t
(primary key (aid));
create table p of p_t
(primary key (pid));
create table o of o_t
(primary key (ordno),
scope for (oc) is c,
scope for (oa) is a,
scope for (od) is p);
想着外码,理解 REF? 例,
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.1ORACLE中对象类型
? 一般通过 REF访问比通过连接访问的效率高,
超过 200元的订单号和顾客名,
select x.ordno,x.oc.cname from o x where x.dollars>200;
? 获得引用 (REF)对象值的函数 REF().
没有通过代理商 a05 订货的顾客名,
select x.cname from c x where not exists (select *
from o y where y.oc=ref(x) and y.aid=‘a05’);
通过北京的所有代理商订货的顾客 cid:
select x.cid from c x where not exists
(select * from a y where y.city=‘北京 ’ and not exists
(select * from o z where
z.oc=ref(x) and z.oa=ref(y)));
不存在 北京代理
没有和该
顾客订货
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.1ORACLE中对象类型
? 一个对象类型不能嵌套包含与自己类型相同的
成分 (递归 ),但可以包含对同样类型的引用,
建一个配偶对象表,
create type mate_t as object
(mid char(4),mname namesex_t,partner ref mate_t);
create table mates of mate_t
(primary key (mid),scope for (partner) is mates);
检索其配偶为女性的人名,
select mname.name from mates m where
m.partner.mname.sex=‘女 ’ ;
? 一个表集合可以具有一个用 ref表示的复杂关系
集,如雇员有部门,部门有经理,经理又是雇员,回
路的依赖中删除时用 DROP TYPE … FORCE.
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.2ORACLE汇集类型
? ORACLE有两种汇集类型,表类型和数组类型,汇
集类型是数据库成熟的数据类型,经过适当的转
换,可以在查询中解释为表,
? 表类型和嵌套表创建,
CREATE TYPE typename AS TABLE OF obj_name;
CREATE TABLE tablename
( 属性名 类型 [NOT NULL][…] )
[NESTED TABLE 属性名 STORE AS tablename]
[,NESTED TABLE 属性名 STORE AS
tablename…];
已建的对象表类型名
表类型的属性
父表
子表
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.2ORACLE汇集类型
? 例,
create type depe_t as table of namesex_t;
create table employees
(eid char(4),ename namesex_t,dependents depe_t,
primary key (eid) )
nested table dependents store as d_tab;
eid ename Dependents
0001 namesex_t(‘张家口’,‘男’ )
namesex_t(‘李小玫’,‘女’ )
namesex_t(‘张冠李’,‘男’ )
0002 namesex_t(‘柴米油’,‘男’ ) namesex_t(‘陆续琴’,‘女’ )
0003 namesex_t(‘郝成功’,‘男’ )
namesex_t(‘朱那亚’,‘女’ )
namesex_t(‘郝乃军’,‘男’ )
namesex_t(‘郝佳欣’,‘女’ )
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.2ORACLE汇集类型
? 子表的数据只能通过父表来访问,
检索 0001号职工的家属,
select dependents from employees where eid=‘0001’;
检索有 2个家属以上的职工 eid:
select eid from employees e where 2<(select count(*) from
table(e.dependents));
检索 0003号职工的家属数目,
错误,select count(*) from (select e.dependents from
employees e where e.eid=‘0003’);
错误,select count(*) from (select table(e.dependents) from
employees e where e.eid=‘0003’);
正确,select count(*) from table (select e.dependents from
employees e where e.eid=‘0003’);
对象列必须加限定非对象列不加
Table()将 e.dependents转换为一表
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.2ORACLE汇集类型
? 利用表的乘积可以消除表的嵌套,
显示职工号和其家属名,
select e.eid,d.name from employees e,
table(e.dependents) d;
select e.eid,d.name from employees e,
table(e.dependents) (+) d;
显示具有最大家属名的 职工号和其家属名,
select e.eid,d1.name from employees e,
table(e.dependents) d1 where d1.name=
(select max(d2.name)
from table(e.dependents) d2);
(+)表示外连,
没有家属的
eid也显示
没有家属的 eid不显示
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.2ORACLE汇集类型
? ORACLE的另一种汇集类型即 数组类型,以
VARRAY声明,
create type phone_t as varray(4) of int;
create table employees
(eid char(4),ename namesex_t,
telephone phone_t,primary key (eid)) ;
eid ename telephone
0001 namesex_t(‘张家口’,‘男’ ) phone_t(12345678,23456789)
0002 namesex_t(‘柴米油’,‘男’ ) phone_t(34567890)
0003 namesex_t(‘郝成功’,‘男’ ) phone_t(45678901,56789012,67890123)
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.2ORACLE汇集类型
? SQL语句不能访问数组的下标,在嵌入主语言后,
从一行检索的数组可付给编程语言的数组,
TABLE()可以应用于 VARRAY.
例,列出电话号码为 45678901的人,
select eid,ename from employees e where
45678901 in (select * from table(e.telephone));
? 汇集类型 (表类型和数组 )的更新用汇集构造器,
Insert into employees values
(‘0006’,namesex_t(‘孙子兵 ’,‘男 ’ ),
phone_t(68888888,96666666));
Update employees set
telephone=phone_t(80166666,80166667) where eid=‘0001’;
汇集构造器
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.3PL/SQL、用户定义函数和方法
? 非过程的 SQL不具备计算的完整性。 ORACLE引入
PL/SQL,INFORMIX引入 SPL,SQLSERVER引入 T-SQL.
过程 SQL支持内存驻留变量、条件和循环结构、过
程和函数等。
? 一个用过程 SQL编写的函数在服务器上执行时被称
为存储过程,由 Create Function语句记录在服务
器上的数据库目录表中。
? 触发器是可以在任意事件发生时执行的过程性 SQL
语句块。触发器用于实现定制的约束或缺省行为。
? 用户定义函数 (UDF)是用过程性 SQL(或 C,Java)写
的函数,可以像交互式 SQL中的内部函数一样被调
用。
? 方法是与用户定义类型一起定义的用户定义函数。
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.3PL/SQL、用户定义函数和方法
? 例,对象关系数据库中利用对象类型定义表、利
用用户定义函数定义对象的方法。
? 1)定义对象点 (point_t)和矩形 (rectangle_t)及其方
法 inside(point_t)(点是否在矩形对象内 )和 area()(矩
形面积 ).
定义点对象
create type point_t as object (x int,y int);
定义包含方法的矩形对象
create type rectangle_t as object (pt1 point_t,pt2 point_t,
member function inside(p point_t) return int,
member function area return int);
成员函数,实际是对象的方法
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.3PL/SQL、用户定义函数和方法
create type body rectangle_t as
member function area return int is begin --成员函数 area定义
return (self.pt2.x-self.pt1.x)* (self.pt2.y-self.pt1.y);
end; --成员函数 area没有参数,返回长乘宽,
member function inside(p in point_t) return int is begin
if (p.x>=self.pt1.x) and (p.x<=self.pt2.x) and
(p.y>=self.pt1.y) and (p.y<=self.pt2.y) then return 1;
else return 0;
end if;
end; --成员函数 inside参数为点类型的 p,当 p在矩形中时返回 1,
否则返回 0.
end;
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.3PL/SQL、用户定义函数和方法
? 2) 创建 point_t和 rectangle_t类型的对象表,
create table points of point_t (primary key (x,y));
create table rects of rectangle_t (primary key
(pt1.x,pt1.y,pt2.x,pt2.y));
插入两个矩形:
insert into rects values (point_t(1,2),point_t(3,4));
insert into rects values (point_t(1,1),point_t(6,6));
插入三个点:
insert into points values (2,3);
insert into points values (1,4);
insert into points values (4,4);
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.3PL/SQL、用户定义函数和方法
? 3) 使用方法 area和 inside.
计算 rects表中矩形面积:
select value(x),x.area() from rects x;
判断点 (4,2)是否在每个矩形中:
select value(x),x.inside(point_t(4,2)) from rects x;
查询在所有矩形内的所有点:
select value(p) from points p where not exists
(select * from rects r where r.inside(p)=0);
计算覆盖各点的最小矩形的面积:
select p.x,p.y,min(r.area()) from rects r,points p
where r.inside(value(p))>0 group by p.x,p.y;
将面积小于 24的矩形的 pt2横纵坐标加 1:
update rects r set pt2=point_t(r.pt2.x+1,r.pt2.y+1) where r.area()<24;
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.3PL/SQL、用户定义函数和方法
? 定义包含方法的对象
CREATE TYPE typename AS OBJECT
(attrname datatype [,attrname datatype…]
MEMBER FUNCTION methodname
[(param type [,param type…])]
RETURN datatype,
[,MEMBER FUNCTION methodname
[(param type [,param type…])]
RETURN datatype,…]);
在前面对象类型的基础上增加了 MEMBER
FUNCTION语句,定义对象的成员函数,即方法。
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.2.3PL/SQL、用户定义函数和方法
? 对象成员函数的定义
CREATE [OR REPLACE] TYPE BODY typename [AS|IS]
MEMBER FUNCTION methodname [(param type…)]
RETURN type IS
BEGIN --PL/SQL语句开始
statements
END; --PL/SQL语句结束
[MEMBER FUNCTION methodname [(param type…)]
RETURN type is
BEGIN……]
END;
对于不同的 DBMS,对象成员函数的处理过程
使用的语句可能不同,带来移植的通用问题。
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.3对象关系数据库
? 对象关系数据库系统除具有原来关系数据库的
各种特点外,还应该提供以下特点:
? 1)扩充数据类型:允许用户根据自己应用需求
定义自己的数据类型、函数和操作符。例如可
以定义数组、向量、矩阵、集合以及这些数据
类型上的操作。
? 2)支持复杂对象:复杂对象指由多种基本类型
或用户定义类型构成的对象。
? 3)支持继承:支持子类、超类的概念,支持属
性数据和函数及过程的继承。
? 4)提供通用的规则系统:规则在 DBMS及其应用
中十分重要,传统 DBMS中的触发器可以看作规
则的一种形式。
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.3.1对象联系
? 关系模型中基本的数据结构层次是关系 -元组 -
属性,属性类型是基本类型,
? 嵌套关系模型是平面关系模型的扩展,允许关系
的属性又是一个关系,
? 嵌套关系模型进一步扩展,出现复合对象模型,
关系中的属性可以是基本类型,也可以是结构类
型或集合类型,
关系
基本类型
关系
关系 基本类型
关系
关系 基本类型结构类型
关系模型 嵌套关系模型 复合对象模型
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.3.1对象联系
? 嵌套关系和复合对象类型定义时不能允许
递归,否则可能造成无穷嵌套,语义混乱,
采用 ‘ 引用 ’ 技术 (Reference)可解决类
型定义中的递归问题,在属性类型中有基
本类型、结构类型、关系类型和引用类型,
引用类型相当于程序设计中指针概念,
? 数据的泛化和细化引出对象类型的层次,
较高层对象类型为超类,较低层对象类型
为子类,子类型继承超类型的特征,而子类
型又有本身的其他特征,
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.3.2对象关系数据定义
? 对象关系模型中,属性可以是复合类型,
1)结构类型,不同类型元素的有序集合 ;
2)数组类型,同类元素的有序集合 ;
3)集合类型,同类元素的无序集合,
数据类型可以嵌套,
? 继承性表现在类型的继承和表的继承,子
类型继承超类型的特征 ;子表继承父表的
特征,
? 数据类型可以嵌套定义,但要实现递归,就
要采用 ‘ 引用 ’ 类型,
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.3.3对象关系数据查询
? 当属性值为单值或结构值时,属性的引用
方式在 层次间加圆点‘,’
? 聚集函数 (max,min,count等 )可以应用
于任何以关系为值的表达式中,以关系作
为参数,返回单个值,
? 当属性值为一个集合时,应当将嵌套的集
合转换为常规的表的形式 (解除嵌套 ).
? 在数据更新时,充分注意数据定义的形式,
利用‘对象构造器’,也可以利用将常规
关系转换为嵌套集合形式的函数完成 (解
除嵌套的逆过程 ).
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
1.4.3.4三种产品的对象关系特征
ORACLE INFORMIX DB2 UDB
用户定义类
型 (UDT)
有,结构化的‘对
象类型’
有,结构化的
‘行类型’
有,结构化的
UDT
继承 无 有 有
UDT引用 有 无 有
集合类型 有,嵌套表、
VARRAY
有,集合,多
集合,列表

用户定义函
数 (UDF)
有,PL/SQL,C,Java 有,SPL,C,
Java
有,C,Java
封装的 UDT BLOB(Binary Large
OBject)对象
BLOB对象 BLOB对象
打包 UDT Cartridge DataBlad Extender
BLOB尺寸 4G-1 4T 2G-1
BLOB子串 UDF访问 UDF访问 UDF访问
北京邮电大学软件学院 郭文明 2003.06
,数据库设计与开发, 讲义
作业:
1.对象关系数据库特点,
2.行对象与列对象有何不同?
3.Value(),Ref(),Table()的作用?
4.student_t类型中有 namesex_t类型以及学号 id、
e-mail和入学年份 (整数 ),其中 namesex_t不空,
定义 student_t类型和表 student,学号 id.
5.对对象关系数据库 CAP,查找姓李的代理商 aid和
aname,这些代理商没有销售过北京的商品,
6.检索在三个以上矩形中出现的点,显示点和覆盖
这些点的矩形数,