新型ORACLE数据模型扩展提供以下功能:
ORACLE9i在关系数据库设计中引入了面向对象数据建模方法。ORACLE9i提供的抽象数据类型能够摆脱数据表行指针的束缚,同时提供了有限的多态性和继承性支持。在ORACLE9i系统下,C++或者Smalltalk程序员相当熟悉的数据模型可以直接转换为ORACLE设计结构。此外,ORACLE还支持抽象数据类型化,也就是说,你可以用任何标准的ORACLE数据类型,比如CHAR、VARCHAR、NUMBER和DATE来创建更复杂的数据类型。
比方说,清单A就是用抽象数据类型和嵌套表创建的ORACLE8表。
接着,我们用标准ORACLE SQL的扩展来更新这些抽象数据类型,如清单B所示。
采用ORACLE嵌套表结构,下级数据项目就可以采用ORACLE最新的构造器:对象ID (OID)直接链接到基础表。ORACLE数据库显著的拓展之一就是能够用指针而非关系数据表连接来索引ORACLE对象。面向对象数据库的支持者们经常对标准的关系型数据库大加鞭挞,理由就是在其索引时必须重组对象(他们通常会这样说:不开车了就把它拆了,每当要上路的时候就重新再组装一次,这不是发疯吗?)
现在ORACLE已经允许存在具体的复杂对象了。为了支持实现具体的复杂对象,ORACLE采取了创建指针数组直接索引ORACLE表这一新举措。正如C++程序中可以用char**数据结构建立指向指针数组的指针一样,ORACLE也允许同样的构造方法,这样,复杂对象的组件就可以驻留在真正的表内,而这种表则具备指向下级对象的指针。在运行的时候,ORACLE只需要解除指针索引,复杂对象就可以很快被重建。
在这个例子里,嵌套表用来表示原来地址的重复组。因而某个人就可能拥有一些以前的雇主,而大多数人则会拥有更多的原来地址。首先,我们用full_mailing_address_type
创建一个类型:
create type prev_addrs as object (prior_address
full_mailing_address_type );
接着,我们创建嵌套对象:
create type nested_address as table of prev_addrs;
现在,我们用这种嵌套表创建其父表,如清单C所示。
嵌套表是其主表的一部分。在其内部它就是一个单独的表。store as子句允许DBA给嵌套表赋予特定的名称(参看图B)。
图B
ORACLE嵌套表
在清单C里,nested_prev_address子表可以同其他普通ORACLE表一样被索引。此外,注意下return as locator
SQL语句的用法。在很多情况下,在查询时返回整个嵌套表是很耗费时间的。Locator令ORACLE可以采用指针结构解除对嵌套行位置的指针索引。指针去索引发生在指针指向对象同时要求程序显示指针所指向的数据的情况下。换句话说,假如你有一个指针指向某客户数据行,那么你可以对OID去索引进而查看该客户的有关数据。嵌套表的链接则采用ORACLE
OID而非传统的外键值。
为了全面了解ORACLE的高级设计技术,我们需要更深入地学习采用对象扩展的SQL性能。总得来说,抽象数据类型(ADT)表的性能同其他ORACLE表的性能表现是完全一样的,但是,我们也确实能看到在实现varray表和嵌套表时出现了性能上的差异:
ORACLE9i对标准的关系数据库模式大大拓展了一步。ORACLE设计专业人员在采用在这些ORACLE扩展来改进ORACLE数据的性能和可维护性时都会面临巨大挑战。关系数据库设计人员也不能再局限于基本的关系系统的视野了:成功的ORACLE设计师必须掌握面向对象概念,包括抽象数据类型、嵌套表、数组表和其他独特的数据结构扩展,正是这些技术优势保证了ORACLE成为市场上最快最稳固的数据库。