第10章对象数据库优秀PPT.ppt
第第10章章对象数据象数据库现在学习的是第1页,共89页第第10章章 对象数据库对象数据库关系数据库的局限性关系数据库的局限性10.1面向对象数据模型面向对象数据模型10.2对象定义语言对象定义语言10.3对象查询语言对象查询语言10.4C+语言绑定与语言绑定与OODBMS实现实现10.5对象对象-关系数据库系统关系数据库系统10.6OODBMS与与ORDBMS对比对比10.72023/2/232现在学习的是第2页,共89页10.1 关关系系数数据据库的局限性的局限性v关系数据库系统只支持一个很小的、固定的数关系数据库系统只支持一个很小的、固定的数据类型子集。据类型子集。v对复杂数据类型的处理不方便对复杂数据类型的处理不方便呈现很大的能力不足问题。v包含复杂数据类型的各类新型应用包含复杂数据类型的各类新型应用计算机辅助设计与制造(CAD/CAM)多媒体数据处理、大型文档数据处理卫星云图/雷达等复杂气象数据处理地理信息系统(GIS)等2023/2/233现在学习的是第3页,共89页10.2 面向对象数据模型面向对象数据模型10.2.5 继承继承10.2.4 对象类型对象类型10.2.3 直接量直接量10.2.2 对象对象10.2.1 对象模型概述对象模型概述 10.2.8 事务模型事务模型10.2.7 封锁与并发控制封锁与并发控制10.2.6 数据库操作数据库操作2023/2/234现在学习的是第4页,共89页10.2.1 对象数据模型概述对象数据模型概述对象数据模型对象数据模型(ODM)的发展历程的发展历程vODBMS自由发展阶段自由发展阶段(1993年以前)年以前)无规范和标准ODBMS:Object Database Managing SystemsvODMG 1.0(1993年年)ODMG对象模型的最早版本提出者:Object Data Management Group vODMG 2.0(1997)vODMG 3.0(2000)是ODMG的最新也是最后版本 2023/2/235现在学习的是第5页,共89页ODMG对象模型的核心概念对象模型的核心概念(1)v基本模型元素基本模型元素对象(object)和直接量(literal)。每个object有一个唯一标识,而literal则无标识。对象通常用来表示现实世界的一个实体。v对象具有状态对象具有状态状态(state)被定义为一组特性(properties)变量值。一个特性可以是一个对象属性(attribute),或是一个关系(relationship)对象的状态是可变的。v对象具有行为对象具有行为行为(behavior)被定义为一组可被外界或其它对象执行的操作(operations)。操作的具体编码实现,则被称为方法(method)。2023/2/236现在学习的是第6页,共89页ODMG对象模型的核心概念对象模型的核心概念(2)v对象结构对象结构可通过定义状态变量和行为来规定对象的结构。共享相同结构的对象被聚合为一个类(class)。同类对象具有一组同名、同类型特性变量和一组相同的操作。一个具体对象也被称为它所属类的一个实例。v对象类型对象类型(type)除了可用类(class)概念描述对象类型外,ODMG还引入接口(interface)概念。类是关于对象类型之抽象行为和抽象状态的规范,可直接实例化(intantiable),即可基于类创建的实例对象;而接口只规范对象类型抽象行为,不能直接实例化。v类型允许继承类型允许继承(inheritance)不同类型之间可能存在特化/泛化关系(或ISA关系),即存在继承关系。子类型(subtype)允许从它的超类型(supertype)继承特性和方法。2023/2/237现在学习的是第7页,共89页ODMG及其应用方式综述及其应用方式综述vODMG基本概念基本概念objects、literals、types(classes,interfaces)、operations、properties(attributes,relationships)、inheritances、v借助基于借助基于ODMG对象模型的对象模型的ODL语言来构造应语言来构造应用的对象模式用的对象模式v操纵应用的对象模式操纵应用的对象模式利用SQL99或其它宿主语言,结合基于ODMG的对象查询语言OQL实现2023/2/238现在学习的是第8页,共89页10.2.2 对象对象一、对象的主要构成(结构)一、对象的主要构成(结构)v一组可包含该对象特性值的特性变量一组可包含该对象特性值的特性变量属性(attributes)或关系(relationships)对象的所有特性变量及其取值规定了对象的状态(state)v一组对象可以响应的消息一组对象可以响应的消息(messages)每个消息可以带0个或多个参数;消息与ODMG对象模型中术语“操作(operations)”等价对象的所有操作,规定了对象的行为(behavior)操作的具体代码实现,称为方法(a method)2023/2/239现在学习的是第9页,共89页10.2.2 对象对象二、对象的基本特征二、对象的基本特征v有唯一对象标识符有唯一对象标识符(object identifier,oid)v可以有一个或多个有意义的名字可以有一个或多个有意义的名字对象名字好比编程语言中的全局变量,必须在整个ODBMS中保持唯一无重名。应用也可通过对象名来引用对象。v具有自己的生命周期具有自己的生命周期对象的生命周期指明了对象是临时内存对象(transient),还是一个持久对象(persistent)。对象生命期的一个重要特点是独立于类型。v对象具有特定的结构对象具有特定的结构(见前页)(见前页)2023/2/2310现在学习的是第10页,共89页10.2.2 对象对象三、对象等价与对象相等的概念三、对象等价与对象相等的概念v两对象等价,如果它们有相同的对象标识(即是两对象等价,如果它们有相同的对象标识(即是同一个对象)。同一个对象)。v两对象相等,如果它们的状态值都相等(但它们两对象相等,如果它们的状态值都相等(但它们可能有不同的对象标识)。可能有不同的对象标识)。两对象浅度相等,如果两对象除了引用字段外,其余字段值都相同。两对象深度相等,如果两对象不仅非引用字段值相等,而且各相应的引用字段也指向相同的其它对象。2023/2/2311现在学习的是第11页,共89页10.2.3 直接量直接量(literal)v在在ODMG模型中,模型中,literal指一个没有对象标识指一个没有对象标识的值。的值。vliteral值可以是简单结构或是复杂结构。有三种值可以是简单结构或是复杂结构。有三种类型的直接量:类型的直接量:原子型直接量(atomic literal),对应预定义的基本数据类型,如long、float、char或string等。集合型直接量,指定一个值集或对象集。结构化直接量,包括内置结构,如DATE、TIME、TIMESTAMP等,以及用户自定义结构2023/2/2312现在学习的是第12页,共89页10.2.4 对象类型对象类型一、类型规范一、类型规范v类型规范定义类型的外部特征类型规范定义类型的外部特征对外可见的部分,由对外部对外可见的部分,由对外部可见的操作、特性和例外等一些抽象的描述构成。可见的操作、特性和例外等一些抽象的描述构成。vODMG对象模型支持的类型规范分以下三种:对象模型支持的类型规范分以下三种:接口(interface),只定义了类型的抽象行为,即操作部分的规范;直接量(literal),只定义了类型的抽象状态,即特性变量部分的规范;类(class),可同时定义类型的抽象行为和抽象状态规范。类的概念可基本对应到ER的实体集。二、类型实现二、类型实现v定义该类型实例对象的一些内部方面,包括实现该类型操作的定义该类型实例对象的一些内部方面,包括实现该类型操作的方法方法(methods)和一些其它内部细节。类型的实现与语言绑和一些其它内部细节。类型的实现与语言绑定有关。定有关。Interface(接口)Literal (直接量)Class(类)图图10.1 ODMG 类型规范示意图2023/2/2313现在学习的是第13页,共89页10.2.4 对象类型对象类型一、类型规范一、类型规范二、类型实现二、类型实现三、常见的对象类型三、常见的对象类型 原子型对象(atomic object)指用户自定义对象在ODMG对象模型中,没有内建的原子对象/类型。集合型对象(collection object)相当于一个元素容器,其内可存储一个或多个同类型元素。ODMG对象模型支持多种集合对象类型构造,如Set、Bag、List、Array、等。结构化对象特指ODMG预定义的四种对象/类型 2023/2/2314现在学习的是第14页,共89页10.2.5 继承继承一、子类型与行为继承一、子类型与行为继承ODMG对象模型支持基于继承(inheritance)的超类型/子类型(supertype/subtype)关系。子类型/超类型关系,也称为ISA关系。在ODL规范语法中,用“:”表达接口继承关系,允许多重接口继承。子类型接口可以在超类接口的基础上,附加定义自有的行为特征,或重载细化超类中原有的行为特征。v二、状态继承二、状态继承 v三、继承与类层次结构三、继承与类层次结构 2023/2/2315现在学习的是第15页,共89页10.2.5 继承继承一、子类型与行为继承一、子类型与行为继承二、状态继承二、状态继承 ODMG对象模型也允许定义扩展(extends)关系,允许子类型从一个超类型 同时继承行为和状态。扩展关系是一种单继承的、但可传递的关系。(类或接口)子类型可以从(多个)接口继承行为;但接口不能从类继承行为。只有类可以通过扩展(extend)从另一个类(超类)同时继承行为和状态。三、类层次结构三、类层次结构 可利用ISA继承关系,将模式中的类组织成层次化的结构 2023/2/2316现在学习的是第16页,共89页10.2.6 数据库操作数据库操作v数据库操作指针对数据库操作指针对Database类型对象的操作类型对象的操作允许基于一个Database类型,创建多个数据库实例,即多个逻辑数据库。一般利用DatabaseFactory接口中定义的new方法,来创建Database类型实例。ODMG模型的数据库类型原型定义了基本的数据库open/close操作,以及针对范围内的对象进行命名、定位和查找等操作。在对数据库存储域内的任何持久对象之前,必须先用open操作打开数据库。除了open和close操作,其它所有操作都必须在事务(Transaction)中执行,否则将会引发错误例外。2023/2/2317现在学习的是第17页,共89页10.2.7封锁和并发控制封锁和并发控制vODMG对象模型使用常规的、基于封锁的方法进对象模型使用常规的、基于封锁的方法进行并发控制作为缺省封锁策略。行并发控制作为缺省封锁策略。v并不排斥支持其它更广泛的并发控制策略。并不排斥支持其它更广泛的并发控制策略。2023/2/2318现在学习的是第18页,共89页10.2.8事务模型事务模型 v对持久对象的任何存取、创建、删除或修改都必对持久对象的任何存取、创建、删除或修改都必须在事务范围内进行。须在事务范围内进行。vODMG通过通过Transaction接口中定义了关于事接口中定义了关于事务对象的各种基本操作。务对象的各种基本操作。2023/2/2319现在学习的是第19页,共89页10.3 对象定象定义语言言(ODL)vODL(object definition language)是遵循ODMG标准的对象数据管理系统(ODBMS)规范说明语言,它是独立于任何特定程序设计语言的语义构造。ODL的主要目标促进遵循ODMG规范的ODBMSs系统共享数据,使数据在这些系统之间迁移更为容易。ODL的主要任务创建对象数据库模式,即定义模式中类和接口。用户可先用ODL指定对象DB模式,然后再使用特定语言绑定,将ODL构造映射为特定程序设计语言的相关构造。2023/2/2320现在学习的是第20页,共89页ODL应用示例应用示例(一个简化版的大学数据库模式一个简化版的大学数据库模式)对应该图的对应该图的ODL定义,可参见课本定义,可参见课本 p322-3232023/2/2321现在学习的是第21页,共89页10.4 对象查询语言对象查询语言10.4.1 OQL综述 10.4.2 OQL语言简介2023/2/2322现在学习的是第22页,共89页10.4.1 OQL(Object Query Language)综述综述vOQL是是ODMG标准的一部分。标准的一部分。OQL应用必须基于由ODMG-ODL定义的对象类型接口模式。只是一个简单的不完全语言,通常以嵌入形式与其它计算机语言结合使用。它也不保证能表达任意复杂的计算,即它不具有计算完全性。v与其它语言的关系与其它语言的关系OQL语句通常以嵌入形式与其它扩展了持久特性的编程语言(如C+、Java、Smalltalk等)结合使用。v与与SQL对比对比2023/2/2323现在学习的是第23页,共89页OQL与与SQL在语法和语义上的差别对比在语法和语义上的差别对比 vSQL中的关系表中的关系表(Table)名,在名,在OQL中被解释为中被解释为集合型对象名。集合型对象名。SQL中的表属性或列名,在中的表属性或列名,在OQL中被广义解释为属性名中被广义解释为属性名/关系名,或方法名。关系名,或方法名。vOQL在在SQL形式语法基础上,扩展了面向对象概形式语法基础上,扩展了面向对象概念方面的运用,如复杂对象、对象标识、路径表念方面的运用,如复杂对象、对象标识、路径表达、多态、操作激活和延迟绑定等。达、多态、操作激活和延迟绑定等。vOQL能灵活处理复杂结构对象,而能灵活处理复杂结构对象,而SQL不能。不能。vOQL是一种纯粹函数型语言,只要类型系统允许是一种纯粹函数型语言,只要类型系统允许所有操作符均可自由组合。所有操作符均可自由组合。QOL采纳了完全正交风格,允许OQL在保持SQL查询表达式语法简单性的基础上,不限制表达的能力且更易学习。2023/2/2324现在学习的是第24页,共89页OQL处理复杂结构对象的主要方式处理复杂结构对象的主要方式v导航存取导航存取能利用对象标识和关系,在对象之间导航。v对象检索对象检索能检索ODB中已有的对象和创建新的对象。v对象行为对象行为能执行对象操作,以更新对象的状态,或从对象状态中导出信息。v利用继承利用继承能利用类型之间的子类型/超类型关系,进行对象存取、检索和更新等操作。2023/2/2325现在学习的是第25页,共89页OQL实现实现ODMG对象模型操纵的主要方法步骤对象模型操纵的主要方法步骤 v通常以有名对象或有名对象集作为入口,定位感通常以有名对象或有名对象集作为入口,定位感兴趣对象,并可利用对象标识和对象关系在相关兴趣对象,并可利用对象标识和对象关系在相关对象之间导航。对象之间导航。这可形象比喻为一组“挑选(pick)”、“粘合(mix)”操作。通过pick操作,从已有对象集中挑出感兴趣的对象,再通过mix操作,把这些被挑出的对象粘合关联在一起。v通过激活感兴趣对象上抽象操作所对应的方法,通过激活感兴趣对象上抽象操作所对应的方法,修改对象的状态,或从对象状态中抽取感兴趣的修改对象的状态,或从对象状态中抽取感兴趣的信息。信息。v返回一个表示结果信息的对象。返回一个表示结果信息的对象。2023/2/2326现在学习的是第26页,共89页10.4.2 OQL语言简介语言简介(1)1.类似类似SQL的基本的基本SQL语句语句SELECT DISTINCT x.age FROM Persons x WHERE x.name=Pat它通常有一个数据库入口点可以是任意的有名持久对象。对于许多查询来说,入口点就是类的外延名。只要在OQL查询中引用了集合,就应该在定义一个相应的迭代器变量,来指代集合中的每个元素。有三种指定迭代器变量的语法形式(令e表示一个迭代器变量,Es表示一个集合对象):e in Es Es eEs as e2023/2/2327现在学习的是第27页,共89页OQL的条件子句的条件子句v由于由于OQL支持正交特性,支持正交特性,WHERE子句中条件表子句中条件表达更为灵活,允许出现任何返回布尔型直接量的达更为灵活,允许出现任何返回布尔型直接量的条件表达。条件表达。例如,除了SQL的比较操作符,OQL还支持一些测试集合对象内容的操作符或表达式。令v为变量,c为集合表达式,b为布尔类型条件表达式,e是与集合c中元素同类型的元素。如元素e是集合c的成员,则表达式(e in c)为true;如集合c的所有元素都满足b,则(for all v in c:b)为true;如集合c中至少有一个元素满足b,则(exist v in c:b)为true;如集合c有且只有一个元素,则表达式unique(c)为true;2023/2/2328现在学习的是第28页,共89页10.4.2 OQL语言简介语言简介(2)2.一些比一些比SQL更简单直接的更简单直接的OQL查询表达查询表达 可以直接是一个对象名甚至一个具体值。名字可表示任何类型对象,包括原子型对象、结构型对象、集合型对象,或直接量。2023/2/2329现在学习的是第29页,共89页10.4.2 OQL语言简介语言简介(3)3.路径表达式路径表达式(path expression)为实现对象之间的导航操作,OQL引入了路径表达式的概念。路径表达式由一个或多个路径步(steps)构成以一个有效名字(对象名、属性名、关系名或操作名)表示每个路径步用“点.或箭头”作为路径分隔符。应用举例假设我们已得到某特定人员对象p,若还希望知道其配偶居住的城市名,则可采用表达pspouse.address.city.name 进行导航2023/2/2330现在学习的是第30页,共89页10.4.2 OQL语言简介语言简介(4)3.从集合中选择对象从集合中选择对象 1)从一个集合中选择对象)从一个集合中选择对象简单SFW形式的OQL语句OQL也允许存取有序型集合对象中特定位置的元素,例如:2)关联查询多个对象集)关联查询多个对象集3)连接查询多个对象集)连接查询多个对象集2023/2/2331现在学习的是第31页,共89页10.4.2 OQL语言简介语言简介(4)3.从集合中选择对象从集合中选择对象 1)从一个集合中选择对象)从一个集合中选择对象2)关联查询多个对象集)关联查询多个对象集类似SQL,SFW 形式的OQL中也可通过在在FROM后列出多个相关联的集合,来实现多个对象集的关联查询。例如,通过在前一集合迭代变量p之后,跟随一个以p开头的次层集合路径表达式,就可有效表达两个具有层次关系集合的关联查询。SELECT c.address FROM Persons p,p.children c 将检查所有人员的所有子女,结果值的类型为bag。3)连接查询多个对象集)连接查询多个对象集2023/2/2332现在学习的是第32页,共89页10.4.2 OQL语言简介语言简介(4)3.从集合中选择对象从集合中选择对象 1)从一个集合中选择对象)从一个集合中选择对象2)关联查询多个对象集)关联查询多个对象集3)连接查询多个对象集)连接查询多个对象集在FROM语句中,也可同时声明多个不直接相关的集合。类似SQL,这允许计算这些集合之间的连接(join)。应用示例,从Persons对象集中选择以某种花名作名字的人:SELECT p FROM Persons p,Flowers f WHERE p.name=f.name2023/2/2333现在学习的是第33页,共89页10.4.2 OQL语言简介语言简介(5)4.利用查询构造对象利用查询构造对象1)利用类型构造器创建对象)利用类型构造器创建对象可借助类型名构造器来创建有标识对象。例如,为创建一个前述定义的Person对象,可使用下面的简单语句:Person(name:”Pat”,birthdate:date1956-3-28,salary:100000)也可直接创建无标识对象(literal)set(2,4,8,16)/返回一个无标识的set型集合直接量;struct(a:10,b:“Pat”)/返回一个无标识的结构;直接利用一些类型强制转换操作符构造对象:LISTTOSET(LIST(1,2,3,3,4)=SET(1,2,3,4)DISTINCT(BAG(1,2,3,3)=SET(1,2,3)FLATTEN(LIST(SET(1,2),SET(2,3),SET(4,5)=LIST(1,2,2,3,4,5)2)利用选择语句创建复杂对象)利用选择语句创建复杂对象2023/2/2334现在学习的是第34页,共89页10.4.2 OQL语言简介语言简介(5)4.利用查询构造对象利用查询构造对象1)利用类型构造器创建对象)利用类型构造器创建对象2)利用选择语句创建复杂对象)利用选择语句创建复杂对象SELECT DISTINCT STRUCT(a:x.age,s:x.sex)FROM Persons x WHERE x.name=PatSELECT DISTINCT STRUCT(name:x.age,hps:(SELECT y FORM x.subordinate as y WHERE y.salary100000)FROM Employees x这个语句对每个employee,建立了一个包含名字和它具有高薪下属的名字集结果是一个类型为setstruct(name:string,hps:bag)的集合型直接量。2023/2/2335现在学习的是第35页,共89页10.4.2 OQL语言简介语言简介(6)5.激活方法、多态与滞后绑定激活方法、多态与滞后绑定1)激活方法)激活方法OQL允许在属性名出现任何位置-激活一个可带参数的、返回值匹配表达式的方法。这种灵活的语法表达使得用户不需要区分是存储特性还是计算特性。例如,SELECT p.oldest_child.address.street FROM Persons p WHERE p.lives_in(“Paris”);v2)多态与滞后绑定)多态与滞后绑定 2023/2/2336现在学习的是第36页,共89页10.4.2 OQL语言简介语言简介(6)5.激活方法、多态与滞后绑定激活方法、多态与滞后绑定1)激活方法)激活方法2)多态与滞后绑定)多态与滞后绑定面向对象的一个主要特性是可操纵多态集。例如,对象集Persons同时包含了Person、Employee和Student这三个类的实例对象,这些类的实例对象汇集构成了一个多态集。当一个多态集(如Persons)被过滤选择时,借助滞后绑定机制或加类限制指示符,在针对不同子类元素统一执行超类方法时,子类的一个特性或重载方法可被正确执行。例如,若Person类中定义了一个activities操作,它的子类Employee和Student中分别重载了这个方法。那么,当执行语句:SELECT p.activities FROM Persons p 时基于当前人员p的类型,OQL会激活正确的方法体。2023/2/2337现在学习的是第37页,共89页10.4.2 OQL语言简介语言简介(7)6.在在OQL中应用分组操作符中应用分组操作符OQL增强了SQL的分组操作符,为每个分组(或分区)中的对象集都提供了显式引用。SELECT struct(city_name,city_population:count(partition)FROM p in PersonsGROUP BY city_name:p.address.city.nameHAVING count(partition)100,0000;这里,partition被用来指代每个分区的关键字。读者从这个例子不难归纳分组语句的一般语法形式。2023/2/2338现在学习的是第38页,共89页10.4.2 OQL语言简介语言简介(8)7.操作符组合与命名查询(操作符组合与命名查询(named query)OQL中也引入了视图机制,并允许使用命名查询。可用关键字define指定命名查询的名字。例如,可通过以下四个语句构造复杂查询:查那些平均薪水最少雇员所居住的街道名称并排序。Define Employees()as SELECT(Employee)p FROM Persons p WHERE“has a job”in p.activitiesDefine salary_map()as SELECT street,avg_salary:avg(SELECT x.e.salary FROM partion x)FROM Employees()e GROUP BY street:e.address.street;Defing sorted_salary_map()as SELECT s FROM salary_map()s ORDER BY s.avg_salaryFIRST(sorted_salary_map().street2023/2/2339现在学习的是第39页,共89页10.5 C+语言绑定与语言绑定与OODBMS实现实现10.5.5 C+OQL10.5.4 C+OML10.5.3 C+ODL10.5.2 OODBMS语言绑定综述语言绑定综述10.5.1 OODBMS概述概述2023/2/2340现在学习的是第40页,共89页10.5.1 OODBMS概述概述1.持久编程语言的基本特点持久编程语言的基本特点(表表10.2 与嵌入执行与嵌入执行SQL语言对比)语言对比)可嵌入执行可嵌入执行SQL的一般编程语言的一般编程语言 持久编程语言持久编程语言 类型系统类型系统及其转换及其转换 宿主语言与数据操纵语言的类型系统完全不同。编程者必须负责OO对象和DB元组之间的类型转换。这不仅会增加编程工作量和程序代码量,而且易出错。查询语言与宿主语言完全集成,两者共享相同的类型系统。不需要显式的类型或格式转换。DB数据存数据存取操纵方式取操纵方式 无论是从DB取数据到主存,还是将更新数据写回DB,编程者都必须写显式代码。编程者无需写显式存取DB数据的代码,允许用编程者以同样语句透明操作持久对象和临时对象 对系统安全对系统安全性、可靠性性、可靠性和优化处理和优化处理有效性影响有效性影响 主要以SQL为接口访问DB,相对比较安全。即使执行了错误的SQL语句,对系统可靠性伤害也不大。另外,查询处理的优化也相对比较容易和有效。由于编程语言的强有力特性,会使得编程错误更容易伤害到系统。语言的复杂性也会使得自动、高层次的优化(如减少磁盘I/O数)变得更加困难。对声明性查对声明性查询语言支持询语言支持 可支持完全的SQL 不支持OQL,或只支持有限的OQL语法子集。2023/2/2341现在学习的是第41页,共89页10.5.1 OODBMS概述概述2.持久编程语言必须处理的一些关键问题持久编程语言必须处理的一些关键问题1)如何指定对象持久性)如何指定对象持久性先将类声明为可持久类,再结合其它一些限定方法,如声明类外延名字,或使用带有持久指示参数的扩展new()操作来创建新对象等方法,来指定持久对象。运行时动态指定对象的可持久性。通过可达性确定持久性。将一个或多个根(root)对象声明为持久对象,其它能直接或间接从持久根对象引用的对象,也被自动认为是持久对象。2)如何实现对象标识和指针)如何实现对象标识和指针3)如何存取持久对象)如何存取持久对象2023/2/2342现在学习的是第42页,共89页10.5.1 OODBMS概述概述2.持久编程语言必须处理的一些关键问题持久编程语言必须处理的一些关键问题1)如何指定对象持久性)如何指定对象持久性2)如何实现对象标识和指针)如何实现对象标识和指针3)如何存取持久对象)如何存取持久对象给对象命名,然后通过名字检索对象。该方法只适合于对象数目相对较少的应用。允许对外发布或在外部转储对象标识或指针。存储集合对象,并允许程序遍历集合以检索所需的对象。对声明了类外延名的可持久类,每当一对象被创建时,都会被自动插入类外延对象中;而当一对象被删除时,也会自动将该对象从类外延中移除。2023/2/2343现在学习的是第43页,共89页10.5.2 C+语言绑定综述语言绑定综述 vC+语言绑定,本质上,相当于基于语言绑定,本质上,相当于基于C+实现实现了一个持久对象编程语言。了一个持久对象编程语言。它通过语言绑定映射技术,把ODMG/ODL中的各种基本构造映射到C+构造。具体映射通过C+类库(OODBMS运行库)实现。在C+类库中,所有实现ODMG模型基本概念或结构的类声明,统一采用以d_为前缀的名字空间。vC+语言绑定也称为语言绑定也称为C+ODL/OMLC+ODL是C+ODL/OML的声明部分。C+OML代表对象操纵语言。2023/2/2344现在学习的是第44页,共89页10.5.2 C+语言绑定综述语言绑定综述1.定义可持久化对象的抽象基类定义可持久化对象的抽象基类d_Object 2023/2/2345现在学习的是第45页,共89页10.5.2 C+语言绑定综述语言绑定综述2.实现了一个极具灵活的智能型指针实现了一个极具灵活的智能型指针(引用模板类引用模板类 d_Ref)还有两个扩展了d_Ref的、用于建模关系的引用模板类d_Rel_Ref/d_Rel_Set,允许指定从当前类到类T的一个一对一关系,或一对多关系。引用指针的应用举例:d_Ref profP;/声明Professor类引用类型的实例profPd_Ref deptRef;profPage();/激活profP引用指向的那个Professor类实例上的age()方法deptRef=profP.dept;/将引用赋值到变量deptRef。2023/2/2346现在学习的是第46页,共89页10.5.2 C+语言绑定综述语言绑定综述3.实现实现DB事务管理类事务管理类class d_Transaction 在C+绑定中,每个事务被实现为一个d_Transaction类的对象。C+绑定运行库中,通过具体类d_Transaction,实现了ODMG-ODL规范中的Transaction接口,定义了begin()、commit()、abort()、checkpoint()等操作。d_Transaction是一个独立的具体类,只有临时的实例对象。2023/2/2347现在学习的是第47页,共89页10.5.2 C+语言绑定综述语言绑定综述4.实现数据库对象实现数据库对象(管理管理)类类C+OML实现预定义了d_Database类型,提供了一组管理数据库对象的方法,以及在数据库中命名、更名对象和定位指定对象的方法。与事务d_Transaction的实例对象类似,d_Database实例对象也是临时对象。2023/2/2348现在学习的是第48页,共89页10.5.3 C+ODLv声明声明C+ODL类语法与类语法与C+类声明语法相同只类声明语法相同只是名字空间有所区隔而言。是名字空间有所区隔而言。C+ODL专门构造类通常以前缀d_开头。C+绑定类库提供了C+ODL预定义基本数据类型的类定义/实现,包括d_Short、d_UShort、d_Long、d_Float、等。类的静态数据成员不包含在个体实例中,而是随类定义一起静态存储。v声明对象关系(关联)方法声明对象关系(关联)方法 2023/2/2349现在学习的是第49页,共89页10.5.3 C+ODLv声明声明C+ODL类语法与类语法与C+类声明语法相同只是名字空间有类声明语法相同只是名字空间有所区隔而言。所区隔而言。v声明对象关系(关联)方法声明对象关系(关联)方法 C+ODL允许指定对象之间的相互关系,包括一对一、一对多关系。假设在类A和类B之间存在如下1-1关系,则它们之间关系声明框架如下:extern const char _ra ,_rb ;class A d_Rel_Ref rb;class B d_Rel_Ref ra;const char _ra =ra,_rb =rb;声明1-多关系,用d_Rel_Set替换d_Rel_Ref关系的完整性约束由OODBMS维护。(图10.4)2023/2/2350现在学习的是第50页,共89页OODBMS自动维护引用完整性的行为效果直观图自动维护引用完整性的行为效果直观图(图图10.4)2023/2/2351现在学习的是第51页,共89页10.5.3 C+ODLv声明声明C+ODL类语法与类语法与C+类声明语法相同只类声明语法相同只是名字空间有所区隔而言。是名字空间有所区隔而言。v声明对象关系(关联)属性声明对象关系(关联)属性v声明集合型属性成员声明集合型属性成员C+绑定类库提供了实现ODMG/Collection接口的抽象模板类d_Collection,它由d_Object派生,指定了所有集合类的公共行为.template class d_Collection:public d_Object C+绑定类库中也定义了各种集合类型的模板类,如d_Set、d_List、d_Varray,它们均派生自d_Collection.应用示例d_Setd_Ref ss2023/2/2352现在学习的是第52页,共89页10.5.4 C+OMLvC+OML实现的指导原则实现的指导原则尽可能以一套相同的语法,操纵临时对象和持久对象。但实际上,操纵两种对象多少还是会有所不同,比如,查询和事务一致性只能应用于可持久的对象。v针对持久对象的主要操作种类针对持久对象的主要操作种类包括创建对象、删除对象、标识对象、引用对象、激活对象,以及存取对象特性值等。2023/2/2353现在学习的是第53页,共89页10.5.4 C+OML1.创建对象创建对象 创建对象一般用new操作符,C+绑定实现重载了C+的new操作,增加了指定新对象生命期的参数。以下是d_Object类中定义的三个new操作:void*operator new();/方法1void*operator new(const d_Ref_Any&clustering,const char typename);/方法2void*operator new(d_Database database,const char typename);/方法32023/2/2354现在学习的是第54页,共89页10.5.4 C+OML2.删除对象删除对象 在C+OML中,对已创建的对象,既可利用d_Ref:delete_Object成员函数来删除,也可用持久对象(超类d_Object中定义)的delete操作符来删除。如果相关事务正常提交,则删除对象操作影响是永久的,对象在主存中的映象和DB中的持久数据都会被删除。应用举例:d_Ref obj_ref;obj_ref.delete_object();/删除被引用的那个对象 2023/2/2355现在学习的是第55页,共89页10.5.4 C+OML3.修改对象修改对象 通过更新一个对象的特性值,或激活定义在对象上的操作,均可达到修改对象状态的目的。当包含修改动作的事务提交后,更新影响将持久化且对其它用户可见。持久对象被修改时,必须与OODBMS运行库进程通信,通知相应对象状态已被修改。2023/2/2356现在学习的是第56页,共89页10.5.4 C+OML4.对象命名及其操作对象命名及其操作 C+OML支持命名对象,并提供存取有名对象的能力。有关命名对象、更名对象和按名检索对象的操作,均在d_Database类中定义。DB应用通常从存取一个或多个关键的对象开始处理,然后通过引用,导航到其它要处理的对象。这些开始时被处理的对象,通常被称为根(ro