
第9章面向对象和对象关系数据库.ppt
60页- joins Inverse item:: joinby; 第9章 面向对象和对象―关系数据库 }; interface department { attribute string name; attribute string manager; attribute Struct Addr { string room,string floor}address; Relationship set
owns Inverse employee:: workin; }; 第9章 面向对象和对象―关系数据库 interface item { attribute string name; attribute float outlay; attribute Struct date { integer day,integer mouth,integer year}check-date; Relationship set joinby Inverse employee:: joins; }; 第9章 面向对象和对象―关系数据库 9.2.4 ODL中的类的继承 假设类D是类C的子类,那么在定义类D时,可以在后加上: C,说明类D是类C的子类, 并可继承类C的所有特性。 - joins Inverse item:: joinby; String Departname( ) raises(nodepartFound) Otheritem(in item,out set
)raise(noitemin); }; 第9章 面向对象和对象―关系数据库 第一个方法是Departname,该函数将产生一字符串型的返回值,假设(因为ODL定义中没有函数代码,所以只能假设)该方法的功能是返回应用该方法的对象所在的部门名,如果应用该方法的对象所在的部门不存在,将引发名为nodepartFound的异常处理。
第9章 面向对象和对象―关系数据库 第第9章章 面向对象和对象面向对象和对象―关系数据库关系数据库 9.1 面向对象数据模型面向对象数据模型 9.2 面向对象数据库建模面向对象数据库建模 9.3 对象对象―关系数据库关系数据库 第9章 面向对象和对象―关系数据库 9.1 面向对象数据模型面向对象数据模型 面向对象数据模型(Object―Oriented Data Model,简称O―O Data Model)是一种可扩充的数据模型,在该数据模型中,数据模型是可扩充的,即用户可根据需要,自己定义新的数据类型及相应的约束和操作 第9章 面向对象和对象―关系数据库 9.1.1 对象 对象是面向对象数据模型的基本结构,是面向对象数据库系统的核心 一个对象是由一些数据以及能够作用在这些数据上的操作组成 例如,一个职工对象,将包含与职工相关的数据(职工号、 姓名、 性别、 职称、 部门等)以及能够在这些职工数据上进行的操作(增加职工、 删除职工、 改变职称等等) 第9章 面向对象和对象―关系数据库 在面向对象系统中,主要强调的是数据而不是操作。
操作被定义为数据的一部分,然后可以在任何必要的地方使用它们 与此相反,传统的、 非面向对象的系统中,操作被设计为数据操纵(在更新数据库的程序中)的一部分,而不是数据定义的一部分 数据以及操作被封装起来,它们对用户是隐藏的 即,操作或访问数据时,用户不必知道操作是如何施加在数据上的 第9章 面向对象和对象―关系数据库 一个对象包括以下几个部分: 1. 属性集合 每一个对象都有各自的状态、 组成和特性,称为对象的属性 属性可能是一个简单的值,也可能是其他对象,即对象的嵌套,并且这种嵌套可以继续下去,从而组成各种复杂的对象 每个对象有唯一的对象标识(OID: Object Identity) OID是独立于属性值的,系统全局唯一的 一个对象的OID不会随着它的属性值的改变而改变 第9章 面向对象和对象―关系数据库 2. 方法集合 方法是对象的行为特性 方法可改变对象的状态,对对象进行各种操作 方法的定义包含两个部分: 一是方法的调用说明,说明方法的名称、 参数和结果类型; 二是方法的实现部分,它是用程序设计语言编写的一个过程,以实现方法的功能。
第9章 面向对象和对象―关系数据库 3. 消息集合 对象是封装的,即每一个对象是其状态和行为的封装 所以外界与对象的通信一般只能借助于消息 方法是在数据定义的过程中定义的 为了真正执行一个方法中的步骤,用户必须向对象发送消息 消息传送给对象,调用对象的相应方法,进行相应的操作,最后,以消息形式返回操作的结果 第9章 面向对象和对象―关系数据库 一条消息是一个执行方法的请求 在用户发送的消息中,必须包含所需要的数据 如在ADD-EMPLOYEE(增加职工)方法中,是新增职工的全部信息; 对于DELETE-EMPLOYEE方法,只是职工号 这个过程和在标准的编程语言中调用子过程相似 对象中还可有完整性约束检查的规则或程序 第9章 面向对象和对象―关系数据库 9.1.2 类和实例 在组织信息时,人们总是将具有相似特性的对象归为一类 类中的每个对象称为类的一个实例(Instance) 一个类中的所有对象其特性必须相同,即具有相同的属性、 响应相同的消息、 使用相同的方法 如果说类的概念相当于关系模型中的关系模式,那么类的实例类似于元组,类的实例之间和类之间可以有复杂的联系。
第9章 面向对象和对象―关系数据库 9.1.3 类的继承 一个类中往往会包含某些具有附加特性的对象,而这些特性并不和类的所有成员相关,这些具有附加特性的对象称为子类 如果类D是类C的子类,则称类C是类D的超类,子类可继承其超类的所有特性(包括属性、方法和信息),同时,又可具有超类所没有的特性 若一个子类只能继承一个超类的特性,叫做单继承; 若一个子类能继承多个超类的特性,叫做多重继承 第9章 面向对象和对象―关系数据库 例如,学校模型中有教职工和学生两个类,其中教职工中又可分为教师类和行政人员类,所有教师有专业这一属性,行政人员有行政级别属性,它们是教职工的两个子类 同时教职工和学生也具有某些相似的属性,如: 都有身份证号码、 姓名、 性别、 年龄等,可以把它们看成是人的子类 其类层次结构如图 9 ― 1 所示第9章 面向对象和对象―关系数据库 图 9 ― 1 学校数据库的类层次结构图 第9章 面向对象和对象―关系数据库 9.2 面向对象数据库建模面向对象数据库建模 本节介绍面向对象数据库的模型描述工具ODL((Object Definition Language: 对象定义语言),它是CORBA(正在制定的分布式面向对象计算的标准)的一个组件。
ODL是从设计者的角度观察数据的结构,与具体的OODBMS无关 所以,ODL和E―R图一样,是建立数据库概念模型的工具,它们都可以向DBMS支持的数据模型转化,如图 9 ― 2 所示 第9章 面向对象和对象―关系数据库 图 9 ― 2 数据库建模和实现的过程第9章 面向对象和对象―关系数据库 9.2.1 ODL的类说明在对象的定义中主要包括以下几个部分: ① 关键字 Interface(接口); ② 类的名字; ③ 类的特性表,可以是属性、 联系、 方法 所以,ODL类说明的最简单形式是: Interface <类名字> { <特性表> }; 第9章 面向对象和对象―关系数据库 9.2.2 ODL中属性的说明属性是类的一种最简单的特性 例 9.1 利用ODL描述职工(employee)类,语句如下: interface employee { attribute string name; attribute integer age; attribute enum sextype{ male,female} sex; }; 第9章 面向对象和对象―关系数据库 语句说明: 第一行说明employee是一个类; 第二行说明属性name,其类型是string,即长度未知的字符串; 第三行说明属性age,类型是整型; 第四行说明属性sex,其类型是枚举型,枚举类型名字为sextype,sex的值从male或female中选择。
这是employee类的说明,任何一个employee对象在这几个属性上均对应一个分量 第9章 面向对象和对象―关系数据库 例9.1中的属性均是原子的,事实上属性类型可以是结构、 集合、 聚集等复杂类型 例 9.2 给出类department的ODL描述,有属性name(部门名)、 manager(负责人)、 address(办公地址),其中address是一个结构,包括楼层和房间号: interface department { attribute string name; attribute string manager; attribute struct Addr { string room,string floor}address; }; 第9章 面向对象和对象―关系数据库 ODL中的原子类型有: 整型(integer)、 浮点型(float)、 字符(char)、 字符串(string)、 布尔型(boolean)和枚举型(enum)。
复杂类型可以是集合、 列表、 数组和结构等 第9章 面向对象和对象―关系数据库 9.2.3 ODL中的联系 为了得到对象与同类或不同类的其他对象的连接方式,需要在类的定义中说明类与类之间的联系 如职工类与部门类之间有联系 一个职工对象总与某个部门对象有关系(工作关系) 在employee类说明中,可用下面的ODL语句表示这种联系: Relationship department workin; 第9章 面向对象和对象―关系数据库 该语句说明在employee类中的每个对象,都有一个对department对象的引用,引用名为workin 因为在职工类和部门类的联系中还有一层联系是一个部门对象中总包含了若干个职工对象,即从部门类中的每个对象,也应该能实现对职工类中的对象集的引用 那么这种引用如何实现呢? 在ODL中有反向联系的概念,要说明一个部门可有多个职工,需要在department类说明中加进对employee类对象的引用: 第9章 面向对象和对象―关系数据库 Relationship set
第9章 面向对象和对象―关系数据库 在E―R模型中,没有反向联系的概念,因为E―R模型中的联系是双向的 所以E―R模型中的一个联系,在ODL中要用一对反向联系来表示 在ODL中关于联系的说明也就只有两种情况: 要么和其他类中的一个对象有关,要么和其他类中的对象集合有关 第9章 面向对象和对象―关系数据库 例 9.3 用ODL描述employee、 department、 item类及其联系: interface employee { attribute string name; attribute integer age; attribute enum sextype{ male,female} sex; Relationship department workin Inverse department: owns; Relationship set
例 9.4 定义类manager(部门经理)为employee的子类 interface manager: employee { Relationship department lead }; 语句说明: 第9章 面向对象和对象―关系数据库 第一行说明类manager是类employee的子类; 第二行表明所有的manager对象都有一个联系lead,表示该经理所管理的部门,并且一位经理只能管理一个部门 在多重继承时,特性名之间可能会发生冲突 如两个或多个超类可能有同名的属性或联系,而这些特性的类型可能不同 在ODL中提供以下几种机制来建立解决多重继承产生的冲突:第9章 面向对象和对象―关系数据库 · 指出超类特性的多个定义中哪一个用于子类; · 在子类中,对于有相同名字的另一个特性给一个新的名字; · 在子类中重新定义一个或多个超类中已定义的某些特性。
第9章 面向对象和对象―关系数据库 9.2.5 ODL中方法的说明 类的另一个特性是方法,方法是与类相关的函数 类中的每一个对象都能引用方法,同一方法可用于多个类,这是面向对象语言的特点 方法说明中主要有方法名、 方法的输入/输出类型说明等 而方法的实际代码是用宿主语言写的,代码本身不是ODL的一部分 第9章 面向对象和对象―关系数据库 调用方法时,可能会引起异常,即出现异常或非希望的情况,这种情况一般应由某个函数来处理(相当于出错处理) 在ODL的方法说明中,提供关键字raises(引发),在括号里列出异常处理列表 例 9.5 类employee的扩充定义,增加了方法的说明: interface employee (key name) { attribute string name; attribute integer age; attribute enum sextype{ male,female} sex; 第9章 面向对象和对象―关系数据库 Relationship department workin Inverse department: owns; Relationship set
第二个方法是Otheritem,该函数没有任何返回值,其输入参数类型为item,输出参数为employee的对象集合 该方法可能是希望该职工参加了这个项目,如果不是,那么就会引发异常noitemin 如果他参加了这个项目,将给出所有参加该项目的其他职工 第9章 面向对象和对象―关系数据库 除了属性、 类型、 方法、 继承的说明外,一般类说明中还应包括码的说明 该语句中的(key name)说明了employee码为name 第9章 面向对象和对象―关系数据库 9.2.6 E―R模型向面向对象数据模型的转换 当建立了现实世界的E―R模型以后,可将其转换为O―O模型 转换时,可按照以下的步骤进行: (1) 将E―R模型中的每个实体集生成一个类,实体集的属性转换为类的属性 (2) 将E―R模型中具有Isa联系的实体集生成的类之间建立类/子类关系 (3) 在转换得到的类中加入联系的说明: ① 对原E―R模型中有一对一联系的实体集,在其生成的类中,都加入联系说明,说明其和另一个类中的一个对象有关。
第9章 面向对象和对象―关系数据库 ② 对原E―R模型中有一对多联系的实体集,在一方生成的类中,加入联系说明,说明其和另一个类中的对象集合有关; 在多方生成的类中,加入联系说明,说明其和另一个类中的一个对象有关 ③ 对原E―R模型中有多对多联系的实体集,在其生成的类中,都加入联系说明,说明其和另一个类中的对象集合有关 第9章 面向对象和对象―关系数据库 9.3 对象对象―关系数据库关系数据库 1990年,以Michael Stonebraker为首的高级DBMS功能委员会发表了“第三代数据库系统宣言”的文章,提出一个面向对象数据库系统必须具有两个条件: 一是支持一核心的面向对象数据模型; 二是支持传统数据库系统所有的数据库特性 虽然面向对象数据库系统在一些特定应用领域(例如CAD等)较好地满足了其应用需要,但是,这种纯粹的面向对象数据库系统并不支持SQL,在通用型方面失去了优势,其应用领域受到很大的局限性 第9章 面向对象和对象―关系数据库 而同时,面向对象技术和数据库技术相结合的另一个产物——对象―关系数据库管理系统(ORDBMS)却得到了快速的发展。
ORDBMS是将传统的关系数据库加以扩展,增加面向对象特性,既支持已被广泛使用的SQL,具有良好的通用型,又具有面向对象特性,支持复杂对象和复杂对象的复杂行为,适应了新应用领域的需要和传统应用领域发展的需要 正在制定中的国际标准SQL3也体现了ORDBMS的特性 第9章 面向对象和对象―关系数据库 ORDBMS在SQL环境中主要增加了以下四个特征: · 对基本类型扩充的支持; · 对复杂对象的支持; · 对继承性的支持; · 对产生式规则系统的支持 美国加州大学Berkeley分校研制的Postgres是ORDBMS的先驱 Postgres由M.Stonebraker所创建的公司发展成为ORDBMS产品Illustra(Illustra及其公司已被Informix公司收购) 下面以具体的Illustra系统为例,介绍ORDBMS的主要特性 第9章 面向对象和对象―关系数据库 9.3.1 基本数据类型的扩充 目前的RDBMS中只支持固定的数据类型集、 操作符和少量的函数。
而ORDBMS中具有可扩充的数据类型、 函数和操作符 Illustra把一组数据类型及其上的有关函数和操作符、 访问方法进行封装,称为DataBlade(数据刀片)模块 第9章 面向对象和对象―关系数据库 1. 创建基本数据类型 创建一个新的数据类型需要指明类型名、 类型的存储信息和该数据类型同ASCII来回转换的子程序 例如: Create Type My type( Internal length = 8, Input = My type Input, Output = My type Out put); 第9章 面向对象和对象―关系数据库 该SQL语句创建了用户自定义的数据类型My type,其中Internal length指明存储该类的实例时将分配到的字节数,两个函数My type In put和My type Output分别是在该数据类型的实例同ASCII之间转换时调用的输入、 输出例程,该例程可以用于加密、 解密运算等,也可以什么都不做。
另外,创建数据类型时还可以包含约束,方便数据的完整性检查并拒绝不合适的数据输入 第9章 面向对象和对象―关系数据库 2. 用户自定义函数 ORDBMS中既可以用SQL也可以用第三代编程语言(例如C等)编写函数,然后把函数注册到系统中以供调用 函数定义中必须指明函数名、 参数、 返回值类型以及函数的执行代码,命令格式为: Create Function 函数名(类型1,类型2,…) Returns 类型 AS (文件名或SQL语句表达式); 第9章 面向对象和对象―关系数据库 例如: 在职工表Employee中,假设有工资字段Salary,可定义一个函数,用来计算每个职工的工资与平均工资的差别: Create Function Diff-salary(float) Returns float as Select $1―AVG(salary) From employee; 然后就可以在数据的操作中自由运用函数Diff-salary了。
第9章 面向对象和对象―关系数据库 例如: 查询所有职工的姓名及其与平均工资的差别,可表示成: Select name,Diff-salary(Salary) From employee; 自定义函数也可以是C语言程序,在此不作介绍 第9章 面向对象和对象―关系数据库 3. 用户自定义操作符 在Illustra系统中,用Create Operator命令来登记操作符,形式如下: Create Operator Binding 操作符名 To 函数名; 说明中允许用户用任何符号作为操作符,并把它赋给一个指定的函数 第9章 面向对象和对象―关系数据库 9.3.2 支持复杂对象 复杂对象是由多种基本的或用户定义的类型构成的对象 在ORDBMS中创建复杂对象的构件有: 组合、 集合、 引用、 数组、 列表、 堆栈等,其中最基本的是前面三种。
1. 使用组合构造对象 构造一个组合类型,需要指明该类型的名字、 每一个组成成分的名字和类型 组合类型的成分也可以是另一个组合类型,即组合类型可以嵌套使用 第9章 面向对象和对象―关系数据库 定义一组合photo-t,由国家号(country-num)、 地区号(area-num)和号码(tele-num)组成: Create Type photo-t( country-num varchar(4), area-num varchar(4), tele-num varchar(8)); 第9章 面向对象和对象―关系数据库 组合类型创建好后,就可以在创建表时使用: Create Table employee( Name varchar(10), Age integer, Salary float, Photo photo-t); ` 为了对组合进行操作,ORDBMS对标准SQL进行了扩充,提供多种方法使用组合或组合对象的属性。
如路径表达式的使用: 组合名.属性名 第9章 面向对象和对象―关系数据库 例如: 查询职工(如胡一民)的号码: Select photo.tele-num From employee Where name = "胡一民"; 第9章 面向对象和对象―关系数据库 2. 使用集合构造对象 在ORDBMS中任何一种数据类型值的集合也是一种数据类型,表示成: Setof(T) 其中T可以是基本数据类型,也可以是组合数据类型 例如: 查询所有杭州地区职工的号码: Select name,photo.tele-num From employee Where ′0571′ in photo-num ; photo.area-num是一个集合,如果集合中有0571,则Where条件为真 第9章 面向对象和对象―关系数据库 3. 使用引用构造对象 在ORDBMS中任何一种数据类型值的引用也是一种数据类型,表示成: Ref(T) 其中T可以是集合或组合数据类型。
引用可以作为任何表的任何列的数据类型 第9章 面向对象和对象―关系数据库 9.3.3 支持继承 ORDBMS的第三个特性是支持子类对超类的各种特性的继承,包括数据继承和函数继承,单继承和多重继承 首先考虑类型的继承,假如在如图 9 ― 1 所示的数据库中,有如下关于人的类型定义: Create Type Person( identify integer, name varchar(10), sex char(2)); 第9章 面向对象和对象―关系数据库 在数据库中需要对学生和教师分别存储一些信息 由于学生和教师同样是人,因而可以使用继承来定义学生和教师类型如下: Create Type Stuednt( degree varchar(10), department varchar(20)) under Person; Create Type Teacher( salary integer, department varchar(20)) under Person; 第9章 面向对象和对象―关系数据库 Student和Teacher都继承了Person的属性,即identify和name。
Student和Teacher称为Person的子类,Person既是Student的超类,也是Teacher的超类 假定要存储关于在职研究生的信息,这些研究生既是教师又是学生,甚至可能是不同的系 如果类型系统支持多重继承,可以为在职研究生定义类型如下: Create Type Teach Student under Student,Teacher; Teach Student应该继承Student和Teacher的所有属性,但这引起了另一个问题: 属性identify、 name和department同时存在于Student和Teacher表中 第9章 面向对象和对象―关系数据库 属性identify和name都是从类Person中继承来的,因此同时从Student和Teacher中继承这两个属性不会引起冲突 但Student和Teacher中都有department定义,由于一个在职研究生可能是一个系的研究生,同时是另一个系的教师,为避免方式冲突,可以使用as子句将它重新命名,下面是重新命名后的Teach Student类型: Create Type Teach Student under Student with(department as student-dept) Teacher with(department as teacher-dept); 第9章 面向对象和对象―关系数据库 9.3.4 提供强大、 通用的规则系统 规则系统能保证数据库中数据的完整性。
在RDBMS中,已经通过约束的定义和使用触发器对规则提供某些支持,但ORDBMS支持的规则系统要更强大、 更灵活 ORDBMS中规则定义的一般格式如下: Create Rule 规则名 As ON 事件 DO 动作第9章 面向对象和对象―关系数据库 它的功能是创建一个规则,使DBMS监测所描述的事件的发生,然后执行相应的动作 事件可以是: Select操作、 Update操作、 Insert操作、 Delete操作; 动作可以是: Select、 Update、 Insert、 Delete、 警报 用户可以指定在事件发生前或事件发生后执行指定的动作,缺省情况下是事件发生后执行 第9章 面向对象和对象―关系数据库 例如: 创建一更新―更新规则,当胡一民区号更改时,李红卫的区号也作相应的更改。
Create Rule update-update-employee As On Update To photo.area-num Where Current.name = ′胡一民′ Do Update employee Set photo.area-num = new.area-num Where name = ′李红卫′ ; 第9章 面向对象和对象―关系数据库 更新-更新规则可用来实现参照完整性 在一个完善的ORDBMS中,规则中的事件和动作可以是任意的SQL语句、 用户自定义的函数,并且规则能够被继承 目前,市场上已有多种ORDBMS 除Illustra以外,其他主要的ORDBMS还有UniSQL、 Omniscience、 Odapter等 并且,ORDBMS已得到了传统RDBMS厂商的认同,主要的RDBMS产品,如: Oracle、 DB2、 Informix、 Sybase等都在推出自己的ORDBMS版本。
ORDBMS将成为21世纪初DBMS的主流。
