第9章_面向对象和对象—关系数据库_第1页
第9章_面向对象和对象—关系数据库_第2页
第9章_面向对象和对象—关系数据库_第3页
第9章_面向对象和对象—关系数据库_第4页
第9章_面向对象和对象—关系数据库_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第9章 面向对象和对象关系数据库本章内容:9.1 面向对象数据模型 9.2 面向对象数据库建模 9.3 对象关系数据库9.1 面向对象数据模型 面向对象数据模型(ObjectOriented Data Model,简称OODM)是一种可扩充的数据模型, 用户可根据需要,自己定义新的数据类型及相应的约束和操作。面向对象数据模型可以通过下列概念来表述:9.1.1 对象9.1.2 类和实例9.1.3 类的继承9.1.1 对象对象是OODM的基本结构,是面向对象数据库系统的核心。一个对象是由一些数据以及能够作用在这些数据上的操作组成。例如,职工对象 数据(职工号、 姓名、 性别、 职称、 部门) 操作

2、(增加职工、 删除职工、 改变职称) 在传统的、非面向对象的数据库系统中,操作被设计为数据操纵的一部分。而在面向对象数据库系统中,操作被定义为数据的一部分,然后可以在任何必要的地方使用它们。数据以及操作被封装起来,它们对用户是隐藏的。即操作或访问数据时,用户不必知道操作是如何施加在数据上的。一个对象包括三个部分:属性集合、方法集合和消息集合1. 属性集合每一个对象都有各自的状态、组成和特性,称为对象的属性。属性可能是一组简单的值,也可能是其他对象,即对象的嵌套,并且这种嵌套可以继续下去,从而组成各种复杂的对象。每个对象有唯一的对象标识(OID: Object Identity)。2. 方法集合

3、方法是对象的行为特性。方法可改变对象的状态,对对象进行各种操作。方法的定义包含两个部分:一是方法的调用说明,说明方法的名称、参数和结果类型;二是方法的实现部分,它是用程序设计语言编写的一个过程,以实现方法的功能。3. 消息集合对象是封装的,即每一个对象是其状态和行为的封装。所以外界与对象的通信一般只能借助于消息。方法是在数据定义的过程中定义的。为了真正执行一个方法中的步骤,用户必须向对象发送消息。消息传送给对象,调用对象的相应方法,进行相应的操作,最后,以消息形式返回操作的结果。一条消息是一个执行方法的请求。在用户发送的消息中,必须指明要执行的方法的名称以及所需要的参数。9.1.2 类和实例在

4、组织信息时,人们总是将具有相似特性的对象归为一类(class)。类中的每个对象称为类的一个实例(Instance)。一个类中的所有对象其特性必须相同,即具有相同的属性、使用相同的方法、响应相同的消息。 如果说类的概念相当于关系模型中的关系模式,那么类的实例类似于元组,类的实例之间和类之间可以有复杂的联系。9.1.3 类的继承一个类中往往会包含某些具有附加特性的对象,而这些特性并不和类的所有成员相关,这些具有附加特性的对象称为子类。如果类D是类C的子类,则称类C是类D的超类,子类可继承其超类的所有特性(包括属性、方法和消息),同时又可具有超类所没有的特性。一个子类可以只继承一个超类的特性(单继承

5、)也可以继承多个超类的特性(多重继承)。 例如,学校模型中有教职工和学生两个类,其中教职工中又可分为教师类和行政人员类,所有教师有专业这一属性,行政人员有行政级别属性,它们是教职工的两个子类。同时教职工和学生也具有某些相似的属性,如:都有身份证号码、姓名、性别、年龄等,可以把它们看成是人的子类。其类层次结构如图 9 1 所示。图 91 学校数据库的类层次结构研究生教师行政人员在职研究生本科生教职工学生人9.2 面向对象数据库建模 面向对象数据库模型的描述工具ODL(Object Definition Language),它是CORBA(正在制定的分布式面向对象计算标准)的一个组件。 ODL是从

6、设计者的角度观察数据的结构,与具体的OODBMS无关。 所以,ODL和E-R图一样,是基于数据库概念模型上的工具,它们都可以向DBMS支持的数据模型转化,如图9-2 所示。图 9 2 数据库建模和实现的过程现实世界E-R 抽象ODL 抽象关系数据模式RDBMSOODBMS对象数据模式9.2.1 ODL中类的说明在类的定义中主要包括以下几个部分: 关键字 Interface(接口); 类的名字; 类的特性表,可以是属性、联系、方法。所以,ODL中类说明的最简单形式是: Interface ;9.2.2 ODL中属性的说明属性是类的一种最简单的特性。例9.1 利用ODL描述职工(employee)

7、类,语句如下: interface employee attribute string name; attribute integer age; attribute enum sextype male,female sex; ; 语句说明: 第一行说明employee是一个类;第二行说明属性name,其类型是string,即长度未知的字符串;第三行说明属性age,类型是整型;第四行说明属性sex,其类型是枚举型,枚举类型名字为sextype,sex的值从male或female中选择。这就是employee类的说明,任何一个employee对象在这几个属性上均对应一个分量。例9.2 给出类dep

8、artment的ODL描述,有属性name (部门名)、manager(负责人)、address(办公地址),其中address是一个结构,包括楼层和房间号:interface department attribute string name; attribute string manager; attribute struct Addr string room,string floor address; ; ODL中的原子类型有: 整型(integer)、浮点型(float)、字符(char)、字符串(string)、布尔型(boolean)和枚举型(enum)。复杂类型可以是集合、列表、数

9、组和结构等。9.2.3 ODL中联系的说明为了得到对象与同类或不同类的其他对象的连接方式,需要在类的定义中说明类与类之间的联系。如职工类与部门类之间有联系。一个职工对象总与某个部门对象有关系(工作关系)。在employee类说明中,可用下面的ODL语句表示这种联系:Relationship department workin; 该语句,说明在employee类中的每个对象,都有一个对department对象的引用,引用名为workin。因为在职工类和部门类的联系中还有一层联系是一个部门对象中总包含了若干个职工对象,即从部门类中的每个对象,也应该能实现对职工类中的对象集的引用。那么这种引用如何实

10、现呢?在ODL中有反向联系的概念,要说明一个部门可有多个职工,需要在department类说明中加进对employee类对象的引用: Relationship set ownsInverse employee : workin;其中联系名为owns,关键字set表示集合,set表示employee的对象集合,说明department对象将引用employee的对象集合,Inverse employee : workin说明owns联系是employee类中联系workin的反向联系。在E-R模型中,没有反向联系的概念,因为E-R模型中的联系是双向的。所以E-R模型中的一个联系,在ODL中要用一

11、对反向联系来表示。在ODL中关于联系的说明也就只有两种情况:要么和其他类中的一个对象有关,要么和其他类中的对象集合有关。例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 joins Inverse item

12、 : joinby; ; interface department attribute string name; attribute string manager; attribute Struct Addr string room, string floor address; Relationship set owns Inverse employee : workin; ; interface item attribute string name; attribute float outlay; attribute Struct date integer day, integer mout

13、h, integer year check_date; Relationship set joinby Inverse employee : joins; ; 职工部门Owns1:nWorkin1:1joins1:njoinby1:n项目9.2.4 ODL中的类的继承假设类D是类C的子类,那么在定义类D时,可以在后加上 : C,说明类D是类C的子类,并可继承类C的所有特性。例9.4 定义类manager(部门经理)为employee的子类。 interface manager :employee Relationship department lead ; 语句说明: 第一行说明类manage

14、r是类employee的子类; 第二行表明所有的manager对象都有一个联系lead,表示该经理所管理的部门,并且一位经理只能管理一个部门。在多重继承时,特性名之间可能会发生冲突。如两个或多个超类可能有同名的属性或联系,而这些特性的类型可能不同。在ODL中提供以下几种机制来建立解决多重继承产生的冲突: 指出超类特性的多个定义中哪一个用于子类; 在子类中,对于有相同名字的另一个特性给一个新的名字; 在子类中重新定义一个或多个超类中已定义的某些特性。9.2.5 ODL中方法的说明类的另一个特性是方法,方法是与类相关的函数。类中的每一个对象都能引用方法,同一方法可用于多个类,这是面向对象语言的特点

15、。方法说明中主要有方法名、方法的输入/输出类型说明等。 而方法的实际代码是用宿主语言写的,代码本身不是ODL的一部分。调用方法时,可能会引起异常,即出现异常或非希望的情况,这种情况一般应由某个函数来处理(相当于出错处理)。在ODL的方法说明中,提供关键字 raises(引发),在括号里列出异常处理列表。例 9.5 类employee的扩充定义,增加了方法的说明:interface employee(key name) attribute string name; attribute integer age; attribute enum sextype male, female sex; Re

16、lationship department workin Inverse department : owns; Relationship set joins Inverse item : joinby; String Departname ( ) raises (nodepartFound) Otheritem(in item,out set)raise(noitemin); ; 第一个方法是Departname,该函数将产生一字符串型的返回值,假设(因为ODL定义中没有函数代码,所以只能假设)该方法的功能是返回应用该方法的对象所在的部门名,如果应用该方法的对象所在的部门不存在,将引发名为no

17、departFound的异常处理。第二个方法是Otheritem,该函数没有任何返回值,其输入参数类型为item,输出参数为employee的对象集合。该方法可能是希望该职工参加了这个项目,如果不是,那么就会引发异常noitemin。如果他参加了这个项目,将给出所有参加该项目的其他职工。除了属性、类型、方法、继承的说明外,一般类说明中还应包括码的说明。该语句中的(key name)说明了employee码为name。9.2.6 ER模型向面向对象数据模型的转换当建立了现实世界的ER模型以后,可将其转换为OO模型。转换时,可按照以下的步骤进行:(1) 将ER模型中的每个实体集生成一个类,实体集的

18、属性转换为类的属性。(2) 将ER模型中具有Isa联系的实体集生成的类之间建立类/子类关系。(3) 在转换得到的类中加入联系的说明: 对原ER模型中有一对一联系的实体集,在其生成的类中,都加入联系说明,说明其和另一个类中的一个对象有关。 对原ER模型中有一对多联系的实体集,在一方生成的类中,加入联系说明,说明其和另一个类中的对象集合有关;在多方生成的类中,加入联系说明,说明其和另一个类中的一个对象有关。 对原ER模型中有多对多联系的实体集,在其生成的类中,都加入联系说明,说明其和另一个类中的对象集合有关。9.3 对象关系数据库1990年,以Michael Stonebraker为首的高级DBM

19、S功能委员会发表了“第三代数据库系统宣言”的文章,提出一个面向对象数据库系统必须具有两个条件: 支持一核心的面向对象数据模型; 支持传统数据库系统所具有的数据库特性。虽然面向对象数据库系统在一些特定应用领域(如CAD等)较好地满足了其应用需要,但是,这种纯粹的面向对象数据库系统并不支持SQL,因而在通用性方面失去了优势,其应用领域受到很大的局限。而同时,面向对象技术和数据库技术相结合的另一个产物对象关系数据库管理系统(ORDBMS)却得到了快速的发展。ORDBMS是将传统的关系数据库加以扩展,增加面向对象特性,既支持已被广泛使用的SQL,具有良好的通用性,又具有面向对象特性,支持复杂对象和复杂

20、对象的复杂行为,适应了新应用领域的需要和传统应用领域发展的需要。正在制定中的国际标准SQL3也体现了ORDBMS的特性。RDBMSO-O+ORDBMSSQL复杂对象复杂行为SQL3ORDBMS在SQL环境中主要增加了以下四个特征: 对基本类型扩充的支持; 对复杂对象的支持; 对继承性的支持; 对产生式规则系统的支持。 PostgresIllustraBerkeleyM.StonebrakersORDBMS产品InformixORDBMS先驱9.3.1 基本数据类型的扩充目前的RDBMS中只支持固定的数据类型集、操作符和少量的函数。而ORDBMS中具有可扩充的数据类型、函数和操作符。Illust

21、ra把一组数据类型及其上的有关函数和操作符、访问方法进行封装,称为DataBlade(数据刀片)模块。1. 创建基本数据类型创建一个新的数据类型需要指明类型名、类型的存储信息和该数据类型同ASCII来回转换的子程序。 例如: Create Type Mytype( Internal length = 8, Input = My type Input, Output = My type Out put); 该SQL语句创建了用户自定义的数据类型Mytype,中Internal length指明存储该类的实例时将分配到的字节数,两个函数My type In put和My type Output分别

22、是在该数据类型的实例同ASCII之间转换时调用的输入、 输出例程,该例程可以用于加密、 解密运算等,也可以什么都不做。另外,创建数据类型时还可以包含约束,方便数据的完整性检查并拒绝不合适的数据输入。2. 用户自定义函数ORDBMS中既可以用SQL也可以用第三代编程语言(例如C等)编写函数,然后把函数注册到系统中以供调用。函数定义中必须指明函数名、参数、返回值类型以及函数的执行代码,命令格式为: Create Function 函数名(类型1,类型2,) Returns 类型 AS (文件名或SQL语句表达式);例如:在职工表Employee中,假设有工资字段Salary,可定义一个函数,用来计

23、算每个职工的工资与平均工资的差别:Create Function Diff_salary(float) Returns float As Select $1 - AVG(salary) From employee;然后就可以在数据的操作中自由运用函数Diff_salary了。例如: 查询所有职工的姓名及其工资与平均工资的差别,可表示成: Select name, Diff_salary(Salary) From employee;自定义函数也可以是C语言程序,在此不作介绍。3. 用户自定义操作符在Illustra系统中,用Create Operator命令来登记操作符,形式如下:Create

24、Operator Binding 操作符名 To 函数名;说明中允许用户用任何符号作为操作符,并把它赋给一个指定的函数。9.3.2 支持复杂对象复杂对象是由多种基本的或用户定义的类型构成的对象。在ORDBMS中创建复杂对象的构件有:组合、集合、引用、数组、列表、堆栈等,其中最基本的是前面三种。 1. 使用组合构造对象例:定义一组合phone-t,由国家号(country-num)、地区号(area-num)和电话号码(tele-num)组成: Create Type phone-t ( country-num varchar(4), area-num varchar(4), tele-num

25、varchar(8) );组合类型的成分也可以是另一个组合类型,即组合类型可以嵌套使用。组合类型创建好后,就可以在创建表时使用: Create Table employee ( Name varchar(10), Age integer, Salary float, Phone phone-t);为了对组合进行操作,ORDBMS对标准SQL进行了扩充,提供多种方法使用组合或组合对象的属性。如路径表达式的使用:组合名. 属性名例如: 查询职工(如胡一民)的电话号码: Select phone.tele-num From employee Where name = 胡一民;2. 使用集合构造对象在

26、ORDBMS中任何一种数据类型值的集合也是一种数据类型,表示成: Setof(T)其中 T 可以是基本数据类型,也可以是组合数据类型。例如:查询所有杭州地区职工的电话号码: Select name, phone. tele-num From employee Where 0571 in phone. area-num;phone. area-num是一个集合,如果集合中有0571,则Where条件为真3. 使用引用构造对象在ORDBMS中任何一种数据类型值的引用也是一种数据类型,表示成: Ref(T)其中 T 可以是组合或集合数据类型。引用可以作为任何表的任何列的数据类型。9.3.3 支持继承

27、ORDBMS的第三个特性是支持子类对超类的各种特性的继承,包括数据继承和函数继承,单继承和多重继承。首先考虑类型的继承,假如在如图9-1 所示的数据库中,有如下关于人的类型定义: 研究生教师行政人员在职研究生本科生教职工学生人图 9-1 学校数据库的类层次结构Create Type Person ( identify integer, name varchar (10), sex char(2) ) ; 在数据库中需要对学生和教师分别存储一些信息。 由于学生和教师同样是人,因而可以使用继承来定义学生和教师类型如下:Create Type Stuednt ( degree varchar(10)

28、, department varchar(20) ) under Person; Create Type Teacher ( salary integer, department varchar(20) ) under Person; Student和Teacher都继承了Person的属性,即identify和name。Student和Teacher称为Person的子类,Person既是Student的超类,也是Teacher的超类。假定要存储关于在职研究生的信息,这些研究生既是教师又是学生,甚至可能是不同的系。 如果类型系统支持多重继承,可以为在职研究生定义类型如下: Create Type TeachStudent Under Student, Teacher ; TeachStudent应该继承Student和Teacher的所有属性,这引起了另一个问题:属性identify、name和department同时存在于Student和Teacher表中。属性identify和name都是从类Person中继承来的,因此同时从Student和Teacher中继承这两个属性不会引起冲突。 但Student和Teac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论