首页 理论教育分布式数据库关系-对象模式系统

分布式数据库关系-对象模式系统

【摘要】:在关系数据模型上构建对象数据库称为关系-对象模式。前面的VML样例就是基于关系-对象模式的,只是那里的讨论聚焦于模式映射。本节以Oracle为例说明关系-对象模式的实现。由于Oracle是典型的关系型数据库管理系统,因此继承自己的优势是其首要考虑的因素。这样,它采用在关系系统上构建面向对象系统的策略。在许多其他面向对象语言和系统中,Oracle对象类型等于对象类。

在关系数据模型上构建对象数据库称为关系-对象模式。前面的VML样例就是基于关系-对象模式的,只是那里的讨论聚焦于模式映射。本节以Oracle为例说明关系-对象模式的实现。

就像Oracle公司自己宣称的那样,面向对象的DBMS(OODBMS)直接继承自面向对象程序设计语言(如Actor和Smalltalk)。

喜欢面向对象数据库系统的人认为,相比关系数据模型的派生物(如实体联系图的变体),面向对象系统提供更有力的语义模型,具有更高的层次。然而,反对面向对象数据库系统的人认为,由于关注的是3GL/基于文件的信息系统,所以其实现和语言要素偶尔会下降到非常低的层次(如按C/C++指针方式访问)。从本质上讲,它们采取导航的或过程化的查询,这也与非关系型系统(如基于COBOL的层次型和网状型DBMS)十分相似,而在基于SQL的RDBMS中的查询大多是描述性的和声明性的。

关系数据库系统已有40多年的历史,在这期间,技术已发展到比较复杂的程度。最终,具有了足够的参照完整性、存储程序和触发器等功能。面向对象编程技术几乎和关系数据库同时起步,也有了30多年的历史。对象结构要求用一种完全不同的方法考虑编程。面向对象技术将另外一种复杂性增加到环境中。结果很有意思,一部分编程厂家在向面向对象的转换过程中遇到了很大困难,一部分编程厂家则报告说他们的编程效率有了极大提高。

面向对象数据库将对象的存在作为一种不易变的结构来考虑。它是通过参照指针,而不是通过参照完整性来连接对象。面向对象数据库完全支持继承性,访问对象严格受限于通过使用相关的方法和操作来进行。

如前所述,对象-关系模式系统试图结合两者的优点,即将对象标识符和主键归一。对象将通过对象引用和参照完整性关联起来。此时,表(关系)既可独立构造,又可从父结构(称为类)继承属性和方法。

上节介绍的VODAK是一个很好的探索。下面以Oracle 8i(下面简称Oracle)为例进行讨论。Oracle 8i里虽有了对象标识符和方法,但只有有限的继承性。

由于Oracle是典型的关系型数据库管理系统,因此继承自己的优势是其首要考虑的因素。这样,它采用在关系系统上构建面向对象系统的策略。

为了扩展面向对象的能力,必须考虑以下几件事情。

●信任面向对象的概念和结构。

●从面向对象到关系映射的概念和结构。

●仿真、完全或混合实现。

●性能的下降或提升。

●使用现有关系数据库管理子系统的能力。

希望RDBMS有面向对象接口的主要原因是,面向对象应用程序就可以与RDBMS中的面向对象部分直接进行通信,这与借助复杂的编程,在程序代码中动态地处理对象-关系型映射(分解和重组)相反。作为例子,可以考虑嵌入式SQL。这里,SQL是基于集合的语言,必须与基于记录主机上的程序设计语言3GL(如C)交互。但这是不希望出现的情况,因为对程序员的要求太高。为此,可以借助游标的结构和诸如预编译的软件(例如Pro*C)来进行补救。

为了支持面向对象功能,Oracle的方法提供了内建的面向对象功能,其特点为:关系作为数据类型;继承性;集合作为数据类型,包括嵌套(即容器);用户定义(可扩展的)数据类型;改进大对象(LOB)。

面向对象模型是比关系模型更高层次的抽象。将抽象出的模型作为一个整体来反映“真实的”世界。例如,在OODBMS中,可以有一个称为CAR的复杂对象,在关系型系统里它很可能用RDBMS中的几个表来描述,如MAKE(制造)、MODEL(型号)、EGINE(发动机)、PARTS(零部件),等等。

面向对象技术,特别是与关系型技术有关的优点主要包含以下几个方面。

●建模:面向业务级抽象。

●可重用性:生命周期里的代码重用可以在很大程度上节约成本。

●复杂性:没有数据类型限制,面向多媒体数据,有嵌套功能。

●可扩展性:反映建模的用户定义数据类型。

●性能优势。

Oracle 8通过提供特定的功能,如继承、集合、容器和用户定义数据模型等来满足这些需求中的大部分。

1.Oracle的面向对象技术

面向对象技术的一个主要问题是缺少标准定义。Oracle 8将对象定义为对象类型的实例,对象类型作为基本面向对象模型的组成块,通常直接指向真实世界的业务项目。因此,类似于表(关系)中的行(元组),对象是数据,而对象类型是结构,与其他数据结构(例如记录)类似。在许多其他面向对象语言和系统中,Oracle对象类型等于对象类。

Oracle 8对象类型包含以下两部分。

●属性:可以是基本的数据类型或其他对象类型,有时称为对象类型的结构化部分。

●方法:组成在对象类型上允许的集合操作的PL/SQL(或C)子程序,有时称为对象类型的行为部分。

在面向对象技术中,其他重要概念有继承和多态性。继承是指一个对象包含来自另一个对象类型的属性或方法的能力。方向是从一般到特殊,正如关系模型中的子类型。有另一种类型的继承称为多继承。单继承是指包含一个子类最多包含一个父类的形式;多继承允许的模型为网络(或格)模型,也就是子类能够有多个父类,像在真实世界中的情况一样。与从职工到经理的单继承相比,也包含官员的多继承方案:职工→经理←官员。箭头特指继承方向,从一般(父)到特殊(子)。与继承一样,多态性可以是结构的或行为的。

另外一个重要概念是对象标识(OID),它表示在对象创建以后唯一代表该对象的统一标识符。这意味着它在所有的,甚至在Oracle之外的面向对象系统和语言中是唯一的。OID在其自身系统之外也是唯一的概念,与关系模型中的主键不同。然而,在某种程度上,它又像一个分布式数据库中的主键,必须在多个系统中是唯一的。(www.chuimin.cn)

2.Oracle 8对象选项

通过面向对象技术,Oracle可在以下几方面扩展其已有的DBMS。

●对象类型:本质上是记录或类。

●对象视图:把许多规范化的表放在一起形成一个项目。

●对象语言:对Oracle SQL和PL/SQL语言的扩展。

●对象API:通过Oracle预编译器(例如Pro*C)支持的对象。

●对象可移植性:通过对象类型翻译器(OTT),可以建立从Oracle 8对象类型到C++类的接口。

但是,Oracle 8不支持多继承、多态性或对象属性(如引用一致性)上的约束。

Oracle 8的开放式类型系统(OTS)是一个所有Oracle 8对象类型的知识库,也是其他语言或系统中外部对象类型的知识库。在开放式类型系统中有一个数据类型层次,它的底层是内建的Oracle 8数据类型。Oracle 8还增加了大对象,形式如BLOB、CLOB、NCLOB[15]和BFILE[16],还增加了VARRAY(变量数组)和嵌套表形式的集合类型与REF(引用)形式的对象ID。在Oracle 8中创建用户定义的对象类型后,可以将它用于以下多种用途。

●作为关系型表中的一列。

●作为另一个对象类型的一个属性。

●作为关系型表的对象视图的一部分。

●作为对象表的基础。

●作为PL/SQL变量的基础。

还可用于管理对象类型并扩展Oracle SQL,包括CREATE TYPE、ALTER TYPE、DROP TYPE、GRANT/REVOKE TYPE。

任何给定的对象类型可以是简单的、复合的或者自我引用的。简单对象类型只是它自身,复合对象类型至少包含一个其他对象类型,自我引用对象类型至少包含一个引用对象类型自身的属性。

1)REF属性

Oracle 8仅支持一对一的单向关系,对象引用REF代表一个对象的关系。REF本质上是一个指针,或一个对象的“句柄”。

Oracle 8中的对象引用(REF)是由系统产生的值,且在所有对象中(任何地方)是唯一的,指向一些永久不变的对象。REF实际上是引用对象-对象表中的一行(实例),而不是真正的对象类型。

2)方法

对象类型可以有零个或多个成员方法。成员方法是一个能够操作任何对象类型(不仅仅是定义它的那个类型)的数据(也就是属性)的子程序。当然,简单来说,方法就是PL/SQL过程或函数。

正像使用任何PL/SQL封装的子程序一样,应为每个方法创建一个接口(声明)和一个实现(体)。当访问一个方法时,使用点表示法(即对象.方法)。

3)集合

集合(变量数组和嵌套表)是排序的或未排序的一组事物,其中变量数组是排序的,而嵌套表是未排序的。若某种顺序列出的主表项目能够使用变量数组(VARRAY),则每个主表行的每行的项目细节可以在变量数组中使用嵌套表。

与大多数数组一样,Oracle 8的变量数组包含隐式的顺序。每个元素在数组中有一个从数组起始位置开始的偏移量,能够通过偏移量直接进行访问(也就是所谓的下标或索引)。变量数组是按行存储的(在表的行中),直到存储单元超过4 KB为止。与大多数数组一样,每个变量数组包含数量和限制。数量是指当前有多少元素存储在变量数组中,而限制是指能够存储在变量数组中的最大元素数。可以通过在PL/SQL和3GL中使用下标访问单个元素,但是不能在简单的SQL中访问它们。

嵌套表能很好地适合主从(一对多)关系。嵌套表在Oracle 8中实际上是用户定义类型或表类型,能够在表中作为一列使用,在对象类型中作为属性或作为PL/SQL变量。嵌套表使用STORE AS语句存储在主表之外的存储表中。嵌套表的优点:能够对其进行索引(与对象表相反)和不需要连接(与簇类似)。其缺点是,尽管有级联删除形式(主行删除时,所有从属行也将删除),但是引用完整性约束是不可能的。

3.对象视图

关系型表的对象视图给用户和开发者提供了许多好处。对于用户,整个系统表面上似乎是基于面向对象的,但实际上数据是关系型的。因为对象视图是视图的特例,所以具有与一般视图相同的优点:为不同用户提供相同数据的不同视图。正确创建对象视图的一般顺序为:创建表、创建对象类型、创建对象视图、创建INSTEAD OF触发器[17]

INSTEAD OF触发器可让用户插入、更新或删除对象视图所基于的关系型表,而不是直接试图修改对象视图。