简介
Oracle9 i. 已经迅速发展成为可用于所有数据(从简单到复杂的各种类型数据)的数据库。多媒体数据类型(如图像、地图、视频剪辑和音频剪辑等)曾经只能在专业软件中见到。现在很多基于Web 的应用程序需要它们的数据库服务器治理此类数据。
其他的软件解决方案需要存储涉及金融工具、设计图表或分子结构的数据。为了满足这些需求,Oracle9 i. 数据库服务器采用“对象关系技术”,为涉及复杂数据的开发、部署和治理提供简单策略。
通过使用对象关系技术,开发人员可以增强Oracle9 i. 服务器,从而创建他们自己的“应用程序域特定”的数据类型。采用类型演变功能,Oracle9 i. 已经增强了支持全面的对象建模功能,包括继续和多级集合在内。例如,可以创建代表客户、资产组合、照片或电话网络的新数据类型,然后,确保数据库程序可以处理与应用程序域同样的抽象级别。很多情况下,需要将这些新域类型与服务器尽可能紧密地集成,这样它们便能作为内置类型(如NUMBER 或VARCHAR)看待。使用扩充性服务可以实现这一目的。采用这样的集成方式,可以将数据库服务器方便地扩展到新域中。
采用类型演变功能,Oracle9 i. 已经增强为可以支持包括继续和多级别集合在内的全面的对象建模功能。
图1 Oracle9 i 对象关系体系结构
Oracle9 i. 还提供广泛的语言绑定API。数据库内部对java 提供本地支持,对象关系类型系统和Java 环境间可以紧密集成。它还支持SQL 和C++ 对象间的映射,从而可以从C++ 应用程序无缝地访问SQL 对象。当前,xml 正迅速成为信息交换的标准。通过使用对象关系框架,可以有效地存储、索引和查询XML 数据。
面向对象的应用程序开发
自从20 世纪60 年代面向对象技术出现,数十年来该技术在广度和深度上不断发展、成熟。逐渐成为被广泛采用的行业标准,面向对象的应用程序开发目前已经是信息技术的主流。最闻名的一些标准包括:用于面向对象分析和设计的UML(统一建模语言)、用于对象关系数据库的SQL:1999 标准以及用于面向对象编程的Java 和C++ 语言。在深入研究Oracle9i 的SQL:1999 标准的实现及其相应的面向对象应用程序编程接口(例如Java、C++)之前,当今的软件开发人员应该充分了解UML,这一点非常重要。
此UML 规范汇集了对象技术行业中的最佳实践应用。它当前的版本是由对象技术标准的国际组织“对象治理小组”(OMG) 发布的1.3 版。UML 为将面向对象的软件作为对象模型来描述定义了标准结构。例如,以下UML 图说明某个在线目录应用程序的对象模型,Oracle 已经将该应用程序发展为新“通用模式”项目的一部分。
对象模型中有很多类(例如,Category、leafCategory)。其中的每个类都有很多属性和操作。例如,Category 类具有category_name 和category_description 属性,以及add() 和remove() 操作。各个类之间也存在各种关系。例如,leafCategory 类从Category 类继续而来;compositeCategory 类具有Category 类的集合;leafCategory 类与PRodUCt_Information 类具有可导航的关联(即,leafCategory 类引用Product_ Information 对象的列表)。
使用UML 分析和设计应用程序后,即可使用特定编程语言和永久数据存储将生成的对象模型映射为目标实施。然后,可将已实施的应用程序部署到特定目标体系结构。随着该面向对象开发过程的进行,Oracle9 i 对象关系技术的优势逐渐显现出来。如下节所述,使用Oracle9 i 的“对象类型系统”,可以将UML 对象模型的结构完全一对一地映射到相应的对象关系模式中。
Oracle 的对象类型系统
以前,应用程序注重访问和修改存储在由诸如INTEGER、NUMBER、DATE 和CHAR等本地SQL 数据类型组成的表中的共同数据。
在Oracle9 i 中,不但支持这些本地类型,而且也支持新的“对象”数据类型,这是最近的ANSI SQL99 标准中的新部分。本节将简介对象关系类型系统的基本特性。
对象类型
Oracle 已经扩展了SQL(DDL 和DML),并答应用户定义他们自己的类型(表示他们的商务对象)以及这些类型间的关系(例如,继续、集合)、将它们作为基本或本地类型存储在数据库中(存储在表的某列中,或存储为表本身),以及查询、插入和更新它们。它们可以在一个商务对象中包括另一个商务对象、从一个商务对象指向另一个商务对象(使用称作REF 的指针),以及使用称作VARRAYS 和“嵌套表”的结构访问和操作这些对象的集合或组合。用户可以象对象的方法一样定义对商务对象的操作。可以如同PL/SQL 存储过程一样执行方法。对象具有全局唯一标识符,称作Object ID,它用来捕捉对象间的引用。
与本地SQL 数据类型完全不同,对象类型是用户定义的,并指定底层永久数据(称作对象类型的“属性”)和相关的行为(对象类型的“方法”)。
Oracle9i 答应用户相关地对待对象数据,同时将关系数据作为对象看待。例如,用户可以使用SQL 按照与访问关系数据相同的方式查询对象数据。用户使用扩展的路径表达式(例如,object.attribute)可以访问对象(通过用于查询的SQL DML)、对象类型属性和方法。他们也可以使用SQL 在表中的各个对象间执行显式联接。另外,通过将REF 从一个对象传送或导航到另一个对象,Oracle9 i答应用户执行对象间的隐式联合。对象类型可以编入索引,使用MAP 或ORDER方法将对象类型转换为标量值,然后可以对这些值进行索引。
Oracle9 i 的对象结构与Oracle 客户所熟悉的关系结构具有紧密的对应关系。例如,REF 与外部键很相似,方法是存储过程(可以采用Java、PL/SQL 或C/C++来编写它们),并且,在对象类型上操作的安全和事务方法与Oracle 为关系表定义的方法完全一样。
图3 用户定义类型答应采用应用程序域结构
对象类型系统从本质上提高了编写数据库程序所使用的抽象级别。因为程序并不处理NUMBER、CHAR 等,而是处理诸如Customer、Portfolio 或Money 等应用程序域结构。这带来很多优点,并不仅仅只是在数据库中优化对商务的建模。
对象视图
另外Oracle 9i答应用户象对待对象一样对待关系数据。对象视图答应从持续存储在关系表中的数据合成商务对象。具体地说,
定义要在应用程序中使用的对象,而不用移植任何关系数据。
以不同的方式将为一个应用程序开发的对象与其他应用程序结合使用。对象视图中的对象具有很多对象表所具有的功能。它们可以具有方法、属于集合、指向另一个对象、具有对象身份,以及从SQL 或通过指针遍历访问它们。另外,Oracle 已经扩展视图机制,使用非凡的INSTEAD OF 触发器提供完全可更新的视图。
图4 对象视图为传统的数据访问增加了灵活性
继续
类型继续是任何面向对象系统中的基本概念。类型继续答应共享类型间的相似之处,并扩展它们的特性。
类型继续答应共享类型间的相似之处,并扩展它们的特性。
大多数面向对象应用程序将它们的对象按类型组织,并将类型按类型层次组织。根据经验表明,足可以将类型层次组织到一个树集合中。这样,单一的类型继续足可以支持大多数应用程序的类型组织。Java 是一种支持单一继续的面向对象的编程语言。采用单一继续,某个类型可以扩展(继续自)一个超类(supertype)。这样的类型(称作子类/suBType)将继续其超类的所有属性和方法。子类也可添加新属性和方法,或覆盖已继续的方法。
可替换性是继续的主要优点之一。可替换性是类型多态性的主要特性,类型多态性答应在需要超类的地方(例如,方法参数)使用某些子类的值,而无须提前了解子类的任何特定情况。实例可替换性指在按照超类声明的上下文中使用子类的对象值的能力。REF 可替换性指在按照超类的REF 声明的上下文中使用子类REF 的能力。
可替换性是类型多态性的主要特性,类型多态性答应在需要超类的地方使用某些子类的值。
Oracle 支持单一类型继续模型。这与ANSI SQL99 标准紧密结合。以下几节将具体说明Oracle 对继续的支持。
类型层次
使用CREATE TYPE 语句创建层次的根类型,并应将其声明为NOT FINAL。
CREATE TYPE Person_t AS OBJECT(
name VARCHAR2(100),
dob DATE,
MEMBER FUNCTION age() RETURN number,
MEMBER FUNCTION print() RETURN varchar2) NOT FINAL;
可在“非最终”类型下创建子类。它从其超类继续所有属性和方法。它可添加新属性和方法,以及/或覆盖已继续的方法。
CREATE TYPE Employee_t UNDER Person_t(
salary NUMBER,
bonus NUMBER,
MEMBER FUNCTION wages() RETURN number,
OVERRIDING MEMBER FUNCTION print() RETURN varchar2);
在“Oracle 通用模式”中,有一个更加具体的有关类型继续层次的示例。
如图2 所示,Category 类及其子类采用精致而简单的结构进行建模,表示树状结构的部分与整体间的层次。该示例进一步展示了Oracle9 i 对象类型系统在保留应用程序对象模型的所有方面中的主要优点。
create type category_typ as object
( category_name varchar2(50)
, category_description varchar2(1000)
, category_id number(2)
)
NOT INSTANTIABLE NOT FINAL;
create type subcategory_ref_list_typ as table of ref
category_typ;
create type product_