|
知识路径: > 数据库技术 > 数据库标准语言—SQL > SQL-99所支持的对象关系模型 >
|
相关知识点:16个
|
|
|
|
嵌套关系只是对基本关系模型扩展的一个实例,其他非原子数据类型,如嵌套记录,同样已被证明是有用的。面向对象数据模型已经导致了对于诸如对象的继承和引用之类特征的需求。有了复杂对象系统和面向对象,我们能够直接表达E-R模型的一些概念,如实体标识、多值属性及一般化和特殊化,而不再需要经过到关系模型的复杂转化。
|
|
|
在本节中,主要描述为允许复杂类型对SQL所做的扩展,包括嵌套关系以及面向对象特征。我们的介绍是基于SQL-99标准的一些特征。
|
|
|
|
|
|
这个表的定义不同于普通关系数据库中表的定义,因为它允许属性是集合(set),所以E-R图中的多值属性能够直接表示。
|
|
|
集合是集合体类型(collection type)的一个实例,其他的集合体类型包括数组(array)和多重集合(multiset)(即无序的集合体,其中一个元素可以出现多次),下面的属性定义了数组的声明:
|
|
|
|
这里author-array是最多10位作者名的数组,我们可以通过指定数组下标来访问数组中的元素,例如author-array[1],author-array[2],…,author-array[10]。数组是SQL-99中唯一支持的集合体类型,使用语法如前所述。SQL-99不支持无序集合或多重集合,尽管它们可能会在SQL将来的版本中出现。
|
|
|
许多现在的数据库应用需要存储的属性很大(大约几千字节),比如一个人的相片,或者更大的(大约几兆甚至上吉字节),比如高分辨率的医学图像或者录像剪辑。因此SQL-99提供了新字符型数据大对象数据类型(clob)和二进制数据大对象数据类型(blob)。数据类型中的“lob”意为“Large Object”。例如,声明属性:
|
|
|
|
执行一个SQL查询通常把结果中的一条或多条记录放入内存。大对象一般用于外部的应用,把整个大对象(几M甚至上G字节)放入内存中是非常低效和不现实的。即通过SQL对它们进行全体检索是毫无意义的,取而代之,应用程序一般用一个SQL查询来检索大对象的“定位器”,然后用定位器从宿主语言中一点一点地操作该对象。例如,JDBC允许程序员分成小片来存取一个大对象,而不是一次全取出来,很像从操作系统文件中存取数据。
|
|
|
|
在SQL-99中结构类型声明以及使用方法如下例所示。
|
|
|
|
在SQL-99中构造器函数(constructor function)用来创建结构类型的值。与结构类型同名的函数就是这个结构类型的构造器函数。
|
|
|
然后我们可以用Publisher('McGraw-Hill','New York')来创建Publisher类型的值。
|
|
|
SQL-99也支持除构造器之外的其他函数。这些函数的名字必须不同于任何结构类型的名字。注意在SQL-99中,不像在面向对象数据库中,构造器创建的是类型的一个值,而不是类型的一个对象。也就是说,构造器创建的值没有对象标识。在SQL-99中对象相当于关系中的元组,通过在关系中插入一个元组来创建。
|
|
|
默认的情况下,每一个结构类型都有一个不带参数的构造器,它将属性设为默认值。任何其他的构造器必须被显式地创建。对同一个结构类型可以有不止一个构造器,虽然它们有一个相同的名字,但是它们必须以参数的个数和类型来相互区别。
|
|
|
|
|
我们可以在圆括号中列出它的属性来构造一行的值。例如,我们声明Publisherl属性为一个行类型,我们可以这样构造它的值:
|
|
|
|
|
通过在关键字set之后的圆括号内列举它的元素的方法创建以集合为值的属性,例如keyword-set。可以像集合值一样创建多重集合值,此时只需要用multiset替换set。
|
|
|
可以创建用一个books关系定义的类型的一个元组如下:
|
|
|
|
这里通过合适参数调用Publisher的构造器函数创建了Publisher属性的值。如果想在books关系中插入上述元组,可以执行语句:
|
|
|
|