 Oracle9 i采用了若干类数据结构来创建稳固的数据库系统。Oracle完全支持二进制大型对象(BLOB)、VARRAY(变长数组)表、嵌套表和面向对象的表结构。此外,普通文件甚至也可以当作Oracle
数据库中的表来处理。
在什么场合下采用何类Oracle数据模型扩展呢?这对很多Oracle设计专业人员来说都是一个颇令人头痛的问题。本文对这一方面的问题做一番概述,希望能帮助读者设计出高性能的Oracle数据库。
数据模型扩展功能
新型Oracle数据模型扩展提供以下功能:
- 取消不必要的表连接—这是通过故意在数据模式中引入冗余而得以实现的。那些需要既复杂又耗时的表连接的查询现在都可以通过简单的一次I/O操作就能实现了。
- 模拟真实对象—关系数据库设计人员不再需要用最基本的组件对复杂对象建模,也不必在运行时重构它们。采用Oracle的面向对象构造器,真实对象都具有具体的实例。Oracle可以用指针数组表示这些复杂对象(参看图A)。
- 数据和行为的耦合—面向对象概念的重要构成部分就是行为同对象本身的紧密耦合。在Oracle系统下可以在Oracle对象上可以创建成员方法。所有操作对象的过程都封装在了Oracle
的数据字典之内。这种做法非常有利于各类Oracle系统的开发工作。在引入成员方法之前,每一位Oracle开发人员都得像一位技艺精湛的艺人一样编写定制SQL来访问Oracle信息。在采用成员方法的情况下,Oracle数据库的所有的接口都是采用预先测试的方法对已知接口操作的。这样,Oracle开发人员的角色就从编程高手变成了代码装配工。你所做的无非是从预先编写好的成员方法中选择若干来访问Oracle信息而已。
图A
Oracle数据库的复杂对象建模
面向对象和Oracle
Oracle9i在关系数据库设计中引入了面向对象数据建模方法。Oracle9i提供的抽象数据类型能够摆脱数据表行指针的束缚,同时提供了有限的多态性和继承性支持。在Oracle9i系统下,C++或者Smalltalk程序员相当熟悉的数据模型可以直接转换为Oracle设计结构。此外,Oracle还支持抽象数据类型化,也就是说,你可以用任何标准的Oracle数据类型,比如CHAR、VARCHAR、NUMBER和DATE来创建更复杂的数据类型。
比方说,清单A就是用抽象数据类型和嵌套表创建的Oracle8表。
接着,我们用标准Oracle SQL的扩展来更新这些抽象数据类型,如清单B所示。
Oracle嵌套表
采用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对象扩展的性能
为了全面了解Oracle的高级设计技术,我们需要更深入地学习采用对象扩展的SQL性能。总得来说,抽象数据类型(ADT)表的性能同其他Oracle表的性能表现是完全一样的,但是,我们也确实能看到在实现varray表和嵌套表时出现了性能上的差异:
- 具有ADT的表—创建用户定义数据类型大大简化了Oracle数据库设计。不仅如此,这样做还为公共数据项目提供了统一的数据定义。而且没有降低SQL性能,对SQL语法的唯一负面影响是要求所有对ADT的索引都必须进行限制。
- Varray表—Varray表有效地避免了代价高昂的SQL连接,它们可以根据varray存储的次序维护varray项目的顺序。可是,varray表行的长度越长全表扫描所耗费的时间也就越多,而且varray内部的数据项目不能被索引。最重要的是,
varray在重复项目未知或者很大的情况下是不能使用的。
- 嵌套表—嵌套表在数据索引方面有优势,重复组分到了其他表里从而减少了因为全表扫描所带来的性能损失。嵌套表准许无限的重复组。可是,有时对OID去索引以访问嵌套表条目时相对普通的SQL表连接操作却会花费更多的时间。大多数Oracle专家认为嵌套表相对传统的表连接并不太具有明显的优势。
小结
Oracle9i对标准的关系数据库模式大大拓展了一步。Oracle设计专业人员在采用在这些Oracle扩展来改进Oracle数据的性能和可维护性时都会面临巨大挑战。关系数据库设计人员也不能再局限于基本的关系系统的视野了:成功的Oracle设计师必须掌握面向对象概念,包括抽象数据类型、嵌套表、数组表和其他独特的数据结构扩展,正是这些技术优势保证了Oracle成为市场上最快最稳固的数据库。
责任编辑:炒饭
|