《高级数据库技术之对象关系数据库.ppt》由会员分享,可在线阅读,更多相关《高级数据库技术之对象关系数据库.ppt(36页珍藏版)》请在三一办公上搜索。
1、Chapter 9:对象-关系数据库,Chapter 9:对象-关系数据库,复杂数据类型与面向对象SQL中的结构数据类型与继承表继承SQL中的Array与Multiset类型 SQL中的对象标识及引用类型实现O-R特性持久化程序设计语言O-O与O-R数据库的比较,对象-关系数据模型,扩展关系数据模型:引入面向对象及处理新增数据类型的构造.允许元组属性具有复杂类型,包括非原子值(如嵌套关系).保持关系基础,尤其是对数据的描述性存取,同时扩展建模能力.与现有关系语言向上兼容.,复杂数据类型,动机:允许非原子域(原子 不可分)非原子域的例子:整数集合,元组集合可对具有复杂数据的应用进行更直观的建模直
2、观定义:所有允许使用原子(标量)值的地方可以使用关系 关系内的关系保持关系模型的数学基础违反第一范式,嵌套关系例,例如:图书馆信息系统每本书具有书名 作者集合出版商关键词集合非1NF关系 books,嵌套关系的1NF版本flat-books,flat-books,嵌套关系的4NF分解,假设flat-books 上有下列多值依赖:title authortitle keywordtitle pub-name,pub-branch将flat-books分解到4NF模式:(title,author)(title,keyword)(title,pub-name,pub-branch),flatbook
3、s的4NF分解,4NF 模式的问题,4NF设计要求用户在查询中包含连接.通过连接4NF关系而定义的1NF视图 flat-books:使用户不必执行连接,但丢失了元组与文档的一一对应.具有大量冗余嵌套关系表示法更自然.,复杂类型与SQL:1999/SQL:2003,为支持复杂类型而对SQL进行的扩充包括:集合体与大对象类型嵌套关系是集合体类型的例子结构类型类似符合属性的嵌套记录结构继承面向对象包含对象标识符和引用我们主要基于SQL:1999和SQL:2003标准进行描述在任何当前的数据库系统中都没有完全实现但某些特性在每个主要商业数据库系统中都存在请参阅你的数据库系统的手册,SQL中结构类型与继
4、承,SQL中可声明并使用结构类型 create type Name as(firstname varchar(20),lastname varchar(20)finalcreate type Address as(street varchar(20),city varchar(20),zipcode varchar(20)not final注:final 和 not final 指示是否可以创建子类型结构类型可用来创建具有复合属性的表 create table customer(nameName,addressAddress,dateOfBirth date)使用点表示法来引用成员:name.
5、firstname,结构类型(续),用户定义的行类型create type CustomerType as(name Name,address Address,dateOfBirth date)not final然后可以创建表,该表的行具有用户定义类型create table customer of CustomerType,方法,可以为结构类型增加方法声明method ageOnDate(onDate date)returns interval year方法体单独定义create instance method ageOnDate(onDate date)returns interval y
6、earfor CustomerTypebeginreturn onDate-self.dateOfBirth;end现在可以求出每个客户的年龄:select name.lastname,ageOnDate(current_date)from customer,继承,假设有下列关于人的类型定义:create type Person(name varchar(20),address varchar(20)利用继承定义学生和教师类型 create type Student under Person(degree varchar(20),department varchar(20)create typ
7、e Teacher under Person(salary integer,department varchar(20)子类型可以在方法声明中通过用overriding method代替method来重定义方法,多重继承,SQL:1999和SQL:2003 不支持多重继承如果类型系统支持多值继承,可以如下定义助教类型:create type Teaching Assistant under Student,Teacher为避免两个department 之间的名字冲突,可以重命名 create type Teaching Assistant under Student with(departme
8、nt as student-dept),Teacher with(department as teacher-dept),表继承,表继承通过允许一个实体同时存在于多个表中,使得对象可具有多个类型.例如 people 表:create table people of Person可定义people 的子表students 和 teacherscreate table students of Student under peoplecreate table teachers of Teacher under people子表的类型必须是父表类型的子类型.因此people中的每个属性也存在于子表中.
9、子表中的每个元组隐含地存在于其父表中.因此查询people不仅查到直接插入其中的元组,还能查到插入其子表students 和 teachers中的元组(仅返回people中存在的属性).只查询people中独有的元组:使用only peopleonly还可用于delete和update语句,这时子表中的元组不受更新操作影响.在概念上,多重继承对于表也是可能的.但SQL不支持.create table teaching-assistants of Teaching Assistant under students,teachers,对子表的一致性要求,子表元组s对应父表元组t:s在所有继承属性上
10、与t具有相同的值.s和t表示的是同一实体对子表的一致性要求超表中的每条元组在每个直接子表中最多只能与一条元组对应.例如:students 中不能有两条元组对应于同一个people元组SQL还有一条限制:相互对应的所有元组必须是由(插入到某个表中的)同一条元组派生的.问:people中的元组p能同时对应于students中的s和teachers中的t吗?除非p、s和t都是因为向teaching-assistants 表插入了一条元组而隐含派生的.但SQL并不支持多重继承,因此上述限制实际上给出了否定答案.但可以不通过继承来表示TA,而是通过创建单独的表:people,students和 teac
11、hers,后两个表包含Person的键及自身的特殊属性.添加引用完整性约束来确保数据一致性:即students和teachers的元组必须出现在people中.,SQL中的Array与Multiset类型,SQL支持两种集合体类型:array和multisetSQL:1999开始加入了array,SQL:2003开始加入了multisetset是multiset的特例支持E-R中的多值属性的建模array与multiset声明的例子:create type Publisher as(name varchar(20),branch varchar(20)create type Book as(t
12、itle varchar(20),author_array varchar(20)array 10,pub_date date,publisher Publisher,keyword_set varchar(20)multiset)create table books of Book类似于嵌套关系books,但用了作者array 而不是集合,创建及访问集合体类型的值,Array array Silberschatz,Korth,SudarshanMultisets multiset computer,database,SQL创建books关系所定义的类型的元组:(Compilers,array
13、Smith,Jones,new Publisher(McGraw-Hill,New York),multiset parsing,analysis)注意:构造子函数Publisher()需要显式创建插入该元组到关系books insert into booksvalues(Compilers,arraySmith,Jones,new Publisher(McGraw-Hill,New York),multiset parsing,analysis),查询具有集合体值的属性,求所有具有关键词“database”的书select titlefrom bookswhere database in(u
14、nnest(keyword_set)利用unnest可将集合体值转换成关系,从而可出现在关系名能出现的地方利用下标可访问数组的个别元素E.g.:如果知道某本书有三个作者,可以写出:select author_array1,author_array2,author_array3from bookswhere title=Database System Concepts对每本书及其每个作者,生成关系,包含形如“书名,作者名”的序对 select B.title,A.authorfrom books as B,unnest(B.author_array)as A(author)为保持array的排序
15、信息,使用 unnest with ordinality select B.title,A.author,A.positionfrom books as B,unnest(B.author_array)with ordinality as A(author,position),解嵌套(Unnesting),unnesting:将嵌套关系转换成具有较少(或没有)关系值的属性例如:将嵌套关系books展开 select title,A.author,publisher.name as pub_name,publisher.branch as pub_branch,K.keyword from bo
16、oks as B,unnest(B.author_array)as A(author),unnest(B.keyword_set)as K(keyword),嵌套(Nesting),Nesting:与unnesting相反,创建集合体值的属性.Nesting可以用与分组聚合类似的方式进行,只是用函数collect()代替聚合函数来创建一个多重集.SQL:2003还提供了函数intersection()和fusion()给定关系flat_books,对其属性keyword 进行嵌套:select title,author,Publisher(pub_name,pub_branch)as publ
17、isher,collect(keyword)as keyword_setfrom flat_booksgroup by title,author,publisher同时对author和keyword属性进行嵌套:select title,collect(author)as author_set,Publisher(pub_name,pub_branch)as publisher,collect(keyword)as keyword_setfrom flat_booksgroup by title,publisher,嵌套(续),创建嵌套关系的另一种方法:在select子句中使用子查询selec
18、t title,array(select author from authors as A where A.title=B.title order by A.position)as author_array,Publisher(pub-name,pub-branch)as publisher,multiset(select keyword from keywords as K where K.title=B.title)as keyword_setfrom books4 as B,SQL中的对象标识与引用类型,定义类型Department,具有字段name 和head,后者是对类型Person
19、 的引用,并以表people 作为其作用域:create type Department(name varchar(20),head ref(Person)scope people)然后可以创建表departments create table departments of Department可从类型声明中省略scope people,代之以在 create table语句中增加有关声明:create table departments of Department(head with options scope people)被引用的表(如people)必须有一个属性(称为自引用属性)来存储
20、对象标识:使用ref is子句 create table people of Person ref is person_id system generatedperson_id是存储对象标识的属性,该列的值由系统产生,引用属性的值的初始化,必须获得被引用元组的标识为创建具有引用值的元组,可以先创建具有空引用值的元组,然后再单独为引用属性赋值:insert into departments values(CS,null)update departments set head=(select p.person_id from people as p where name=John)where na
21、me=CS,用户生成的对象标识,必须将自引用属性的类型声明作为被引用表的类型定义的一部分,并且表定义必须指明该引用是user generated create type Person(name varchar(20)address varchar(20)ref using varchar(20)create table people of Person ref is person_id user generated创建元组时,必须为对象标识提供唯一的值:insert into people(person_id,name,address)values(01284567,John,23 Coyot
22、e Run)然后向departments 插入元组时即可使用该标识不必用单独的查询来获得标识值:insert into departments values(CS,01284567),用户生成的对象标识(续),甚至还可以使用现有的主键值作为对象标识:create type Person(name varchar(20)primary key,address varchar(20)ref from(name)create table people of Person ref is person_id derived向departments 插入元组时即可使用insert into departm
23、ents values(CS,John),解引用:路径表达式,求所有系的系主任的姓名和地址:select head name,head addressfrom departments形如“headname”的表达式称为路径表达式路径表达式避免了显式的连接若head不是引用,则需要连接departments 和people 以得到地址信息使查询的表达对用户更容易deref():返回被引用元组select deref(head).namefrom departments,实现O-R 特性,类似于如何将E-R 特性映射到关系模式子表实现每个表保存主键及在该表中定义的属性或者每个表保存局部定义的属性以
24、及继承来的属性,持久化程序设计语言,持久数据:即使创建该数据的程序已终止仍然继续存在如:关系数据库中的关系,元组;传统程序语言中的文件持久化程序设计语言:扩充了能处理持久数据的构造PPL与嵌入式SQL的区别类型系统:PPL统一,ESQL需要转换PPL程序员可以直接操作持久数据,不需要写代码将数据取进内存及存回磁盘,ESQL则相反PPL的缺点容易发生编程错误破坏数据库语言复杂难以实现高级优化不能很好地支持声明性(declarative)查询,对象的持久化,OOPL创建的对象都是短暂的(transient)随程序结束而消亡使对象持久化的方式根据类 显式声明某个类是持久的,则其所有对象默认是持久的简
25、单但不灵活有些系统对类声明为“可持久化”根据创建 用特定语法来创建持久对象根据标记 对象创建后在程序中止之前将对象标记为持久的.根据可达性 若干对象被显式声明为持久的(根对象);其他对象是持久的当且仅当它可从根对象通过一个引用序列到达只需声明少量根为持久即可使整个结构持久数据库系统负担重,对象标识与指针,持久化对象应赋予持久化OIDOID与指针:最简单的就是利用指向物理存储位置的指针作为内部标识如:C+的对象标识就是内存指针对象的存储位置可随时间变化标识的持久程度:过程内 标识仅在单个过程执行期间持续如:局部变量程序内 标识仅在单个程序或查询执行期间持续如:全局变量主存指针只能提供程序内标识程
26、序间 标识跨越多次程序执行文件系统数据指针提供程序间标识,但随磁盘上的数据存储改变而改变持久化 不仅程序间持久,且跨越数据结构重组这才是OO系统需要的持久化C+中实现了持久化指针作为持久对象的OID,持久对象的存取,在数据库中存储对象数据部分:各对象单独存储代码部分:可存储于数据库之外的文件中在数据库中查找对象命名对象适用少量对象通常只对类外延及其他对象集合命名,而非对象.暴露OID或指向对象的持久指针可在外部保存,不必是助忆符存储对象集合,并允许程序在该集合上迭代以找到所需对象对象集合本身可建模为汇集(collection)类型的对象Set,multiset,list,array,etc.类
27、外延(extent)属于该类的所有对象的集合通常为具有持久对象的类维护外延,并且类外延中只包含持久对象,持久化OOPL,C+和Java的持久化版本已经实现C+ODMG C+ObjectStoreJavaODMG Java Database Objects(JDO),O-O与O-R数据库的比较,关系系统简单数据类型,强大的声明性查询语言,高度数据保护,高级优化基于PPL的OODB复杂数据类型,与程序设计语言的集成,高性能;数据易遭破坏,没有强大的查询能力对象关系系统复杂数据类型,强大的声明性查询语言,高度数据保护一些实际系统模糊了这种划分边界例如在关系或OR系统上实现一层OODB可提供更强的数据保护但性能不如直接建立在存储系统之上的OODBStonebraker的四象限,End of Chapter,