《第2章对象关系数据库精.ppt》由会员分享,可在线阅读,更多相关《第2章对象关系数据库精.ppt(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第2章对象关系数据库第1页,本讲稿共25页2.1 嵌套关系嵌套关系是表示现实数据一种最自然的方式,它是对象关系模型的基础例子:文档检索系统,文档信息包括*文档的标题:原子属性*作者:非原子属性*日期:非原子属性(年、月、日)*关键词:非原子属性第2页,本讲稿共25页2.1 嵌套关系1NF关系flatDoc第3页,本讲稿共25页2.1 嵌套关系嵌套关系NestedDoc第4页,本讲稿共25页2.1 嵌套关系在关系flatDoc中存在以下多值依赖关系title authortitle keywordtitle day month year可以分解为满足4NF范式的关系模式(title,autor)
2、(title,keyword)(title,day,month,year)第5页,本讲稿共25页2.1 嵌套关系分解后的关系第6页,本讲稿共25页2.2 对象关系模型-SQL32.2.1结构类型和集合类型create type MyString char varyingcreate type MyDate(day integer,month char(10),year integer)create type Document(name MyString,autohr-list setof(MyString),date MyDate,keyword-list setof(MyString)cre
3、ate table doc of type Documentcreate table doc(name MyString,author-list setof(MyString),date MyDate,keyword-list setof(MyString)第7页,本讲稿共25页2.2 对象关系模型-SQL32.2.1结构类型和集合类型(续)允许将一个属性定义为一个集合:如关系表doc中的属性author-list和keyword-list允许将一个属性定义为一个结构:如doc中的属性date类型定义要被记录在数据库模式中,而在持久性编程语言种类型定义不被保存在数据库中聚集属性类型:setof
4、,array,multiset,list-author-array MyString10-print-runs multiset(integer)第8页,本讲稿共25页2.2.2 继承-类型继承类型继承 create type Person(name MyString,social-security integer)create type Student(degree MyString,department MyString)under Person create type Teacher(salary integer,department MyString)under Person类型Stu
5、dent和Teacher是类型Person的子型(subtype),而类型Person是类型Student和Teacher的超型(Supertype)第9页,本讲稿共25页2.2.2 继承-(2)多继承create type TeachingAssitant under Student,Teacher继承冲突问题类型Person中的属性name和social-security:由于来自相同的超型,不会发生冲突类型Student和Teacher中继承的属性department:发生冲突,因为一个TA可能是计算机系的学生,但是自动化系的教学助手解决手段:换名子句 create type Teach
6、ingAssitant under Student with(department as student-dept),Teacher with(department as teacher-dept)第10页,本讲稿共25页2.2.2 继承-(3)表级继承表级继承语句-create table people(name MyString,social-secrity integer)-create table students(degree Mystring,department Mystring)under people-create table teachers(salary integer,
7、department MyString)under peoplestudents和teachers称之为people的子表,people称之为students和teachers的超表超表people中的每个元组对应于子表student和teachers中的至多一个元组(对于所有的继承属性具有相同属性值)在子表students和teachers中的每个元组必须对应于超类people中的一个元组(对于所有继承属性来讲具有相同值)定义一个teaching-asitants子表 create table teaching-assitants under students with(department
8、 as student-dept),teachers with(department as teacher-dept)第11页,本讲稿共25页2.2.3 引用类型*引用类型:面向对象系统提供对对象的引用功能,对象的属性类型可以是对一个特定类型对象的引用。-author-list setof(ref(Person):是一个Person对象引用的集合-author-list setof(Person )-两者间的区别:前一个是引用语义,而后一个是拷贝语义第12页,本讲稿共25页2.2.3 引用类型head ref(Person)scope people引用限制在people表中的元组,与外码类似
9、insert into department values(CS,null)update departmentsset head=(select ref(p)from people as p where name=John)where name=CS通过查询得到元组的标识符的值,设置给事先创建好的空引用的元组。第13页,本讲稿共25页2.2.3 引用类型create table people of Person ref is oid system generated 或 ref is oid user generated自引用属性(self-referential attribute)类型cr
10、eate type Person(name varchar(20)primary key,address varchar(20)ref from(name)create table people of Personref is oid derived使用主码值作为标识符,可在类型定义中使用ref from子句第14页,本讲稿共25页2.3 基于复杂类型的查询 基于关系值属性的查询 路径表达式 Nesting(聚组)Unnesting(析组)函数和过程第15页,本讲稿共25页(1)基于关系值属性的查询例子模式 create table pdoc(name MyString,author-list
11、 setof(ref(people),date MyDate,keyword-list setof(MyString)查找含有”database”的所有文档(where子句中包含关系值属性)select name from pdoc where “database”in keyword-list-关系值属性找出每个文档的名字和作者(from子句中包含关系值属性)select B.name,Y.name from pdoc as B,B.author-list as Y找出每个文档的名字和作者数目(select子句中包含关系值属性)select name,count(author-list)fr
12、om pdoc第16页,本讲稿共25页(2)路径表达式例子模式 create table master-students(advisor ref(people)under people查找所有研究生导师名字(select子句使用路径表达式)select master-students.advisor.name from master-students查找所有文档的所有作者的名字(from子句使用路径表达式)select Y.name select pdoc.author-list.name from pdoc.author-list as Y from pdoc查找导师为“Zhang”的所有研
13、究生名字(where子句使用路径表达式)select name from master-students where master-students.advisor.name=“Zhang”第17页,本讲稿共25页(3)聚组与析组析组:将一个嵌套关系转换为一个非嵌套关系 select name,A as author,date.day,date.month,date.year,K as keyword from doc.author-list as A,doc.keyword-list as K聚组:将一个非嵌套关系转换为一个嵌套关系 select title,author,(day,mont
14、h,year)as date,set(keyword)as keyword-list from flat-doc groupby title,author,date第18页,本讲稿共25页(4)函数和过程使用SQL来定义函数 create function author-count(one-doc Document)returns integer as select count(author-list)from one-doc使用编程语言来定义函数效率高、功能强需使用外部编译器,并通过数据库系统来装载和运行如果在函数中存在Bug的话,则可能破坏数据库的内部结构,它绕过了数据库系统的存取控制功能
15、用编程语言编写的函数不同于嵌套SQL:嵌套SQL的查询是通过用户程序传递到数据库系统来运行的,然后结果被一次一个元组地返回到用户程序,这样的话,用户编写的代码从来也不必存取数据库当一个SQL查询调用一个编程语言编写的函数时,或者是函数代码被数据库系统本身运行,或者是函数所需的数据被拷贝到一个独立的数据空间中。后者引起非常高的开销,而前者将产生潜在的安全性和完整性问题。第19页,本讲稿共25页(4)函数和过程SQL函数定义举例:create function author-count(title varchar(20)returns integerbegindeclare a-count int
16、eger;select count(author)into a-countfrom authorswhere authors.title=titlereturn a-count;endSQL函数调用举例:select titlefrom books4where author-count(title)1第20页,本讲稿共25页(4)函数和过程SQL过程定义举例:create procedure author-count-proc(in title varchar(20),out a-count integer)beginselect count(author)into a-countfrom a
17、uthorswhere authors.title=titleendSQL过程调用举例:declare a-count integer;call author-count-proc(Database System Concepts,a-count);第21页,本讲稿共25页2.4 基于复杂元组的操作 复杂值元组的表示 (“salesplan”,set(“Smith”,“Jones”),(1,”April”,89),set(“profit”,”strategy”)插入 insert into doc values(“salesplan”,set(“Smith”,“Jones”),(1,”Apri
18、l”,89),set(“profit”,”strategy”)查询 select title,date from doc where title in set(“salesplan”,“opportunities”,“risks”)修改 update doc set author-list=set(“Smith”,“Jones”)where title=“salesplan”第22页,本讲稿共25页2.5 面向对象和对象关系数据库的比较基于持久性编程语言的面向对象数据库系统面向对象数据库系统语言的过程性(目前仍不能很好支持说明性查询语言)、难以进行高层优化、查询能力弱强大的计算能力安全性问题:
19、程序的错误造成数据库破坏持久性数据的存取效率高建立在关系模型之上的对象关系数据库系统对象关系数据库系统语言的说明性、高效的查询优化、查询能力强受限的语言功能保护数据不受程序的破坏由于存在数据格式与类型转换,数据存取效率相对要低第23页,本讲稿共25页2.5 面向对象和对象关系数据库的比较(续)DBMS矩阵数据查询简单 复杂强弱1234第一象限:简单数据、没有查询文件系统:COBOL第二象限:简单数据、有查询关系数据库系统:商业数据处理年营业额:80亿美元,25%速度递增第三象限:复杂数据、没有查询面向对象的数据库系统和持久性编程语言系统:工程管理现在的年营业额:8000万美元,50%速度递增第四象限:复杂数据、有查询对象关系数据库系统:多媒体2005年市场规模(见左图)1100150第24页,本讲稿共25页讨论题假设你受聘为顾问,为你的客户选择一个数据库系统。对于下面这些应用中,声明你将推荐哪种类型的数据库(RDB,OODB,ORDB,不要指定某个商业产品),并且说明你的推荐是正确的。一个为飞机制造商开发的计算机辅助设计系统。一个为政府机关设计的对为候选人做的捐进行跟踪的系统。一个支持电影制作的信息系统。第25页,本讲稿共25页
限制150内