




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章:对象关系数据库,嵌套关系复杂类型与面向对象复杂类型的查询创建复杂类型值及对象面向对象与对象关系数据库的比较,对象关系数据模型,通过引入面向对象及处理复杂数据类型的构造来扩展关系数据模型.允许元组属性具有复杂类型,包括非原子值(如嵌套关系).保持关系基础,尤其是对数据的描述性存取,同时扩展建模能力.与现有关系语言向上兼容.,嵌套关系,动机:允许非原子域(原子不可分割)非原子域例:整数集合,元组集合对含有复杂数据的应用可以更直观地建模直观定义:在原先只允许出现原子值(标量)的地方可以出现关系关系内的关系保持关系模型的数学基础违反第一范式,嵌套关系例,例如:图书馆信息系统每本书具有书名,作者集合,出版商,关键词集合非1NF关系books,嵌套关系的1NF版本,1NFversionofbooks,flat-books,嵌套关系的4NF分解,假设flat-books上有下列多值依赖:titleauthortitlekeywordtitlepub-name,pub-branch分解到4NF:(title,author)(title,keyword)(title,pub-name,pub-branch),4NF分解flatbooks,4NF模式的问题,4NF设计使用户查询时需要连接.通过连接4NF关系而定义的1NF视图flat-books:使用户不必执行连接,但丢失了元组与文档的一一对应.具有大量冗余嵌套关系表示法更自然.,复杂类型与SQL:1999,对SQL的扩展支持复杂类型,包括:集合与大对象类型嵌套关系是集合类型的例子结构类型类似符合属性的嵌套记录结构继承面向对象包含对象标识符和引用我们主要基于SQL:1999标准介绍当前的数据库系统并没有完全实现但某些特性在主要商业数据库系统中都存在请参阅你的数据库系统的手册看看他支持什么我们也介绍一些SQL:1999中没有的特性这会明显指出,集合类型,Set类型(SQL:1999不支持)createtablebooks(.keyword-setsetof(varchar(20)Set是集合类型的一种.其他集合类型包括Array(SQL:1999支持)E.g.author-arrayvarchar(20)array10可按通常方式存取数组元素:E.g.author-array1Multiset(SQL:1999不支持)无序集合,其中一元素可出现多次嵌套关系是元组集合SQL:1999支持元组数组,大对象类型,大对象类型clob:字符大对象book-reviewclob(10KB)blob:二进制大对象imageblob(10MB)movieblob(2GB)JDBC/ODBC提供特别方法来以小片断形式存取大对象类似于存取操作系统文件应用获取大对象的定位符,然后再用宿主语言操作大对象,结构与集合类型,SQL中可声明并使用结构类型createtypePublisheras(namevarchar(20),branchvarchar(20)createtypeBookas(titlevarchar(20),author-arrayvarchar(20)array10,pub-datedate,publisherPublisher,keyword-setsetof(varchar(20)注:SQL:1999不支持setof用array存储作者使我们可以记录作者顺序结构类型可用来创建表createtablebooksofBook类似于前面的嵌套关系books,但对作者用的是array而非set,结构与集合类型(续),结构类型可直接表示E-R图中的复合属性.SQL:1999中还可用无名行类型来定义复合属性E.g.可以省略Publisher类型的声明,而在类型Book中用下列声明publisherrow(namevarchar(20),branchvarchar(20)类似地,集合类型可直接表示E-R图中的多值属性.,结构类型(续),可以直接创建表,而不需创建一个中间类型例如,表books可如下定义:createtablebooks(titlevarchar(20),author-arrayvarchar(20)array10,pub-datedate,publisherPublisherkeyword-listsetof(varchar(20)方法可以作为结构类型定义的一部分:createtypeEmployeeas(namevarchar(20),salaryinteger)methodgiveraise(percentinteger)单独定义方法体createmethodgiveraise(percentinteger)forEmployeebeginsetself.salary=self.salary+(self.salary*percent)/100;end,创建复杂类型的值,结构类型的值用构造函数创建E.g.Publisher(McGraw-Hill,NewYork)注:值不是对象SQL:1999的构造函数E.g.createfunctionPublisher(nvarchar(20),bvarchar(20)returnsPublisherbeginsetname=n;setbranch=b;end每个结构类型都有一个缺省的无参数构造函数,其他构造函数可根据需要定义row类型的值可通过在括号中列出值来构造E.g.给定row类型row(namevarchar(20),branchvarchar(20)(McGraw-Hill,NewYork)是上面类型的值,创建复杂类型的值(续),构造Array值arraySilberschatz,Korth,SudarshanSet值(SQL:1999不支持)set(v1,v2,vn)创建books关系的元组(Compilers,arraySmith,Jones,Publisher(McGraw-Hill,NewYork),set(parsing,analysis)将上面这个元组插入到关系books中insertintobooksvalues(Compilers,arraySmith,Jones,Publisher(McGrawHill,NewYork),set(parsing,analysis),继承,假设有下列类型定义:createtypePerson(namevarchar(20),addressvarchar(20)利用继承定义student和teacher类型createtypeStudentunderPerson(degreevarchar(20),departmentvarchar(20)createtypeTeacherunderPerson(salaryinteger,departmentvarchar(20)子类型在类型声明中可以用overridingmethod代替method来重定义方法,多重继承,SQL:1999不支持多重继承如果类型系统支持多值继承,可以如下定义助教类型:createtypeTeachingAssistantunderStudent,Teacher为避免两个department之间的名字冲突可以重命名createtypeTeachingAssistantunderStudentwith(departmentasstudent-dept),Teacherwith(departmentasteacher-dept),表继承,表继承通过允许一个实体同时存在于多个表中,使得对象可具有多个类型.E.g.people表:createtablepeopleofPerson可定义people的子表students和teacherscreatetablestudentsofStudentunderpeoplecreatetableteachersofTeacherunderpeople子表(students与teachers)中的每个元组隐含地存在于其超表(people)中多重继承对于表也是可能的.createtableteaching-assistantsofTeachingAssistantunderstudents,teachersSQL:1999不支持多重继承,表继承:角色,表继承对角色的建模很有用允许一个值有多种类型,而不必具有最具体类型(与类型继承不同).例如,对象可以同时存在于子表students和teachers中,而不必存在于某个定义在students和teachers之下的子表student-teachers中对象可以获得/失去角色:对应于从子表中插入/删除对象注意:SQL:1999要求值具有最特殊类型因此上述讨论不适用于SQL:1999,表继承:一致性要求,对子表与超表的一致性要求超表(e.g.people)中的每条元组最多只能对应于每个子表(e.g.studentsandteachers)中的一条元组SQL:1999中的附加约束:相互对应的所有元组(即,对继承来的属性有相同值)必须是从一条元组(插入到一个表中)派生的.即,每个实体必须具有最具体类型在people中不能有一条元组对应于students和teachers中的各一条元组,表继承:可选择的存储方式,可选择的存储方式在子表中只存储局部属性和超表的主键继承来的属性通过与超表连接而得到每个表都保存所有继承来的属性和局部定义的属性超表隐含地包含其子表中的所有元组(的继承属性)可快速存取元组的所有属性:不需连接如果实体必须具有最具体类型,创建元组时只保存在一个表中否则可能有冗余,引用类型,面向对象语言提供创建和引用对象的能力.在SQL:1999中引用是针对元组的,并且引用必须有作用域,即,只能指向特定表中的元组,SQL:1999中的引用声明,例如定义类型Department具有字段name和head(对Person类型的引用并以表people作为作用域)createtypeDepartment(namevarchar(20),headref(Person)scopepeople)可如下创建表departmentscreatetabledepartmentsofDepartment可从类型声明中省略scopepeople,而是在createtable语句中增加:createtabledepartmentsofDepartment(headwithoptionsscopepeople),引用类型值的初始化,在Oracle中,为创建带有引用值的元组,可以先创建具有空引用的元组,然后再利用作用于一元组变量的函数ref(p)单独对引用赋值例如创建name为CS,head为John的系,可用insertintodepartmentsvalues(CS,null)updatedepartmentssethead=(selectref(p)frompeopleaspwherename=John)wherename=CS,引用类型值的初始化(续),SQL:1999不支持ref()函数,而是要求用一特殊的属性来保存对象标识符自引用属性的声明:在createtable语句中增加refis子句:createtablepeopleofPersonrefisoidsystemgenerated这里oid是属姓名,而非关键字.为取得对元组的引用,在前面的查询中可用selectp.oid取代selectref(p),用户生成的标识,SQL:1999允许由用户生成对象标识对象标识符的类型必须作为被引用表的类型定义的一部分来指定,且表定义必须指出该引用是用户生成的E.g.createtypePerson(namevarchar(20)addressvarchar(20)refusingvarchar(20)createtablepeopleofPersonrefisoidusergenerated当创建元组时,必须提供唯一的值给对象标识符(假设是第一个属性):insertintopeoplevalues(01284567,John,23CoyoteRun),用户生成的标识(续),然后向departments插入元组时即可使用该标识的值不必用单独的查询来获得标识:E.g.insertintodepartmentsvalues(CS,02184567)甚至可以用现有的主键值作为标识:用reffrom子句并声明引用是derivedcreatetypePerson(namevarchar(20)primarykey,addressvarchar(20)reffrom(name)createtablepeopleofPersonrefisoidderived向departments插入元组时,可用insertintodepartmentsvalues(CS,John),路径表达式,求所有系的系主任的姓名和地址:selectheadname,headaddressfromdepartments形如“headname”的表达式称为路径表达式路径表达式避免了显式的连接若head不是引用,则需要连接departments和people使查询的表达对用户更容易,查询结构类型,求每本书的书名和出版商名.selecttitle,frombooks注意“点表示法”在访问复合属性(结构类型)publisher的字段时的用法,集合值属性,利用关键字unnest可将集合值属性视为关系,关系books具有数组值属性author-array和集合值属性keyword-set求所有具有关键词“database”的书selecttitlefrombookswheredatabasein(unnest(keyword-set)注:上述语法在SQL:1999中是合法的,但SQL:1999唯一支持的汇集类型是array对每本书及其每个作者查询“title,author-name”selectB.title,AfrombooksasB,unnest(B.author-array)asA,汇集值属性(续),利用下标可访问数组的个别元素E.g.如果知道某本书有三个作者,可以写出:selectauthor-array1,author-array2,author-array3frombookswheretitle=DatabaseSystemConcepts,Unnesting,将嵌套关系转换成具有较少(或没有)关系值属性的形式,称为unnesting.E.g.selecttitle,Aasauthor,aspub_name,publisher.branchaspub_branch,KaskeywordfrombooksasB,unnest(B.author-array)asA,unnest(B.keyword-list)asK,Nesting,Nesting与unnesting正相反,创建汇集值属性注:SQL:1999不支持nestingNesting可以用与合计一样的方式进行,只是用函数set()代替合计函数来创建集合对关系flat-books的属性keyword进行nesting:selecttitle,author,Publisher(pub_name,pub_branch)aspublisher,set(keyword)askeyword-listfromflat-booksgroupbytitle,author,publisher同时对authors和keywords进行nesting:selecttitle,set(author)asauthor-list,Publisher(pub_name,pub_branch)aspublisher,set(keyword)askeyword-listfromflat-booksgroupbytitle,publisher,Nesting(续),创建嵌套关系的另一种方法:在select子句中使用子查询selecttitle,(selectauthorfromflat-booksasMwhereM.title=O.title)asauthor-set,Publisher(pub-name,pub-branch)aspublisher,(selectkeywordfromflat-booksasNwhereN.title=O.title)askeyword-setfromflat-booksasO在嵌套查询中可用orderby子句得到有序汇集从而与前面方法不同,可以创建数组,函数与过程,SQL:1999支持函数与过程函数/过程可用SQL本身编写,或用外部程序设计语言函数对专门的数据类型如图像和地理对象尤其有用例如用函数检查多边形的重叠,或者比较图像的相似度有些数据库支持表值函数,即返回关系作为结果SQL:1999还支持丰富的命令构造,包括循环,if-then-else,赋值许多数据库系统对SQL做了不同于SQL:1999的专有的过程式扩展,SQL函数,定义一个函数,对给定书名,返回该书的作者数目(针对4NF关系模式books4和authors).createfunctionauthor-count(namevarchar(20)returnsintegerbegindeclarea-countinteger;selectcount(author)intoa-countfromauthorswhereauthors.title=namereturna=count;end求所有由多个作者写的书的书名.selectnamefrombooks4whereauthor-count(title)1,SQL方法,方法可视为与结构类型相关联的函数它们具有隐含的第一个参数self,设置成在其上方法被调用的结构类型的值方法的代码可以利用self变量引用结构类型值的属性E.g.self.a,SQL函数与过程(续),函数author-count也可写成过程:createprocedureauthor-count-proc(intitlevarchar(20),outa-countinteger)beginselectcount(author)intoa-countfromauthorswhereauthors.title=titleend过程可利用call语句从SQL过程或嵌入式SQL调用.E.g.从SQL过程declarea-countinteger;callauthor-count-proc(DatabasesystemsConcepts,a-count);SQL:1999允许多个同名的函数/过程(称为名字重载),只要参数数目不同,或者参数类型不同,外部语言函数/过程,SQL:1999允许使用用其他语言(如C或C+)写的函数及过程声明外部语言过程及函数createprocedureauthor-count-proc(intitlevarchar(20),outcountinteger)languageCexternalname/usr/avi/bin/author-count-proccreatefunctionauthor-count(titlevarchar(20)returnsintegerlanguageCexternalname/usr/avi/bin/author-count,外部语言函数/过程(续),外部语言函数/过程的好处:对许多操作更高效,表达能力更强缺点实现函数的代码可能需要加载到数据库系统中并在数据库系统的地址空间中执行存在无意中破坏数据库结构的风险安全性风险,允许用户存取未授权数据存在替代方法,可以提供好的安全性但性能较差当效率比安全性更重要时才直接在数据库系统的空间执行,外部语言例程的安全性,为处理安全性问题使用sandbox技术即,使用一种类似Java的安全的语言,它不能用来存取/损坏数据库代码的其他部分或者,在一个单独的进程中运行外部语言函数/过程,不存取数据库进程的内存通过进程间通信交换参数和结果两者都有性能开销许多数据库系统支持上述两种方法,以及在数据库系统地址空间中直接执行,过程构造,SQL:1999支持丰富的过程构造复合语句形如beginend,在begin和end之间可能包含多条SQL语句.复合语句中可声明局部变量While与repeat语句declarenintegerdefault0;whilen10dosetn=n+1endwhilerepeatsetn=n1untiln=0endrepeat,过程构造(续),For循环允许在所有查询结果上迭代例如:求Perryridge分行的所有余额总和declarenintegerdefault0;forrasselectbalancefromaccountwherebranch-name=Perryridgedosetn=n+r.balanceendfor,过程构造(续),条件语句(if-then-else)E.g.对三类账户的每一类求余额总和(即balance=1000and=5000)ifr.balance1000thensetl=l+r.balanceelseifr.balance5000thensetm=m+r.balanceelseseth=h+r.balanceendifSQL:1999还支持case语句(与C的case语句类似)例外条件的发出,并声明例外处理程序declareout_of_stockconditiondeclareexithandlerforout_of_stockbegin.signalout
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全培训教学课件
- 广播电视文体写作课件
- 2025广西柳钢集团技术技能人才社会招聘考前自测高频考点模拟试题及一套答案详解
- 2025江苏盐城市第七人民医院招录政府购买服务用工14人考前自测高频考点模拟试题附答案详解(模拟题)
- 2025福建厦门鼓浪湾大酒店有限公司(第二批)招聘5人模拟试卷及答案详解(各地真题)
- 安全培训效果评估课件编写
- 2025杭州青少年活动中心招聘工勤岗位工作人员20人考前自测高频考点模拟试题及完整答案详解1套
- GPX4-IN-17-生命科学试剂-MCE
- Glutathionylspermidine-disulfide-CoA-Glutathionylspermidine-disulfide-coenzyme-A-生命科学试剂-MCE
- 2025年福建省宁德市管国企纪检监察机构招聘6人考前自测高频考点模拟试题及答案详解(名师系列)
- 2024年河南鹤壁市鹤山区姬家山产业园政府专职消防员招聘笔试参考题库附带答案详解
- BCG 中国合成生物学产业白皮书2024
- 三年级数学倍的认识 省赛一等奖
- 新能源电动汽车的发展历程
- LS保温复合板施工方案
- 肾盂癌-疾病研究白皮书
- 共有权人同意卖房证明四篇
- 美学第二讲:美的本质
- 量子物理发展简史教学课件
- 第七讲 社会主义现代化建设的教育科技人才战略PPT习概论2023优化版教学课件
- 1.4.1 第2课时 空间中直线、平面的平行 课件(共14张PPT)
评论
0/150
提交评论