第六章 rdbms 的扩展
DESCRIPTION
第六章 RDBMS 的扩展. 关系模型中概括与聚合的扩展 支持共享与递归的分子对象概念 关系查询语言 QUEL 的扩展及其支持 关系模型中的抽象数据类型 XSQL 语言的扩展 嵌套的关系模型 NF2. ※6.1 关系模型中概括与聚集的扩展. 例 1 :关于人的特化模型示例. Persons. maritalStatus. nationality. sex. Singles. Austrians. Females. …. Canadians. Married. Males. 关系扩展模型 —— 一般化的 m 维特化示例. R. S km. - PowerPoint PPT PresentationTRANSCRIPT
第六章 RDBMS 的扩展• 关系模型中概括与聚合的扩展• 支持共享与递归的分子对象概念• 关系查询语言 QUEL 的扩展及其支持• 关系模型中的抽象数据类型• XSQL 语言的扩展• 嵌套的关系模型 NF2
※6.1 关系模型中概括与聚集的扩展
• 例 1 :关于人的特化模型示例Persons
sex maritalStatusnationality
Females Austrians Canadians… Singles
Males Married
关系扩展模型 —— 一般化的 m 维特化示例
R
Sk1Skm
……
R11R1p1 Rm1
Rmpm…… ……
扩展的关系模型的一般语法var R : generic
sk1=(R11,…,R1p1);
…
skm=(Rm1,…,Rmpm);
of
aggregate keylist
s1: key R1;
…
sn: key Rn;
end
对该语法的说明• 对 generic 关系 R ,具有 n 个属性,其中: -若是一般的类型,仅用类型符标识它 -若是一个聚集引用,即若引用一个 generic 关
系类型,则需要加前缀“ key” 进行区分• 对 R 可以特化,其 m 维的特化属性用 sk1…skm
表示• 每一个特化属性 ski 将 R 的实例化对象划分成 pi
个不相交的集合,每一个集合为 R 的一个特化集
• 因此,若 R 有 m 维特化属性,则将 R 的实例集进行 m 种划分,每一种划分都可以获得 R 的 Pi 个特化集( Ri1,…,Ripi
)
• M 个特化属性 sk1,…,skm 属于 R 的属性集 s1,…,sn 的子集。
正确定义一个 generic 的关系 R 需要如下规则:
1. R 的 n 个属性中,每个属性的类型定义 Ri
( 1≤i≤n )是以下两种类型: (1) 是一个类型标识符(前缀 key 必须不出现),
它表示了 Ri 是一个原子值。 (2) 是一个 generic 的标识符,则前缀 key 必须
在定义中出现 , 它表示对其他对象的引用。2. Keylist—— 主关键属性表是 {s1,…,sn} 的
子集
3. 每一个特化类型 Rij ( 1≤i≤m , 1≤j≤Pi )都是一个 generic 标识符,其关键字域与R 的相同,且其属性在定义时就要 copy父类型除特化属性外的所有属性。
4. 特化属性 Ski ( 1≤i≤m )都与 R 的某个属性 Sj ( 1≤j≤n )相同。
5. 如果 Ski 与 Sj 相同,则 Sj 的类型— Rj 的值域是( Ri1,…,Ripi )。
一个应用实例 — 基于扩展关系模型的 CSG 表示
• 参看 P31 页 CSG 的形式化表示: <mechanical part> ::= <object>
<object> ::= <primitive>|
<object> <motion op> <motion arguments>|
<object> <set operator> <object>
<primitive> ::= cube | cylinder | cone | …
<motion op> ::= rotate | scale | translate | …
<set operator> ::= union | intersection |difference |…
• 由此看出,一个 object 有三种类型:
1. Prim_obj (原始对象) 2. Mot_obj (运动对象) 3. Comp_obj (组合对象)
如下图:
扩展 CSG 实例化关系模型
Mech_objID
MAN
ARG_OBJ
LEFT_ARGRIGHT_ARGTYPE
Mot_obj Prim_obj Comp_obj
T MAT PRICE OP_CODE
PTYPE
cylinder … cuboid
LENGTH
WIDTH
HEIGHT
CSG 的关系模型表示 (1) var mech_obj: generic (2) TYPE = (prim_obj, mot_obj, comp_obj); (3) of (4) aggregate [ID] (5) ID : identifier; (6) MAN: manufacturer; (7) TYPE: structural_comp (8) end
Mech_obj 的三个特化子类型说明
var prim_obj : generic prim_obj 是 mech_obj 的 PTYPE =(cylinder,…,cuboid); 特化,而本身通过特化控制 of 属性 PTYPE 进一步被特
化 aggregate[ID] 为原始对象集合 ID:identifier; 这两个属性是父类属性, MAN:manufacturer; 除控制特化的 TYPE 属性 MAT:material; 外的全部属性的复制,以 PRICE:money; 此实现继承的概念 PTYPE:geom_form;
end
var cuboid cuboid 不是 generic 类型,
aggregate [ID] 它没有进一步特化(没有子类)
ID:identifier;
MAN:manufacturer; 这四个属性继承父类 MAT : material; 而来 PRICE:money;
LENGTH:real; 这三个属性是 cuboid
WIDTH:real; 自身的进一步描述 HEIGHT:real;
end
var mot_obj mot_obj 也不是 generic 类型 aggregate [ID]
ID:identifier;
MAN:manufacturer; ARG_OBJ: key mech_obj; 该属性表达了对
一 个对象的引用
T : matrix;
end
var comp_obj
aggregate [ID]
ID:identifier;
MAN:manufacturer;
LEFT_ARG_OBJ:key mech_obj;
RIGHT_ARG_OBJ: key mech_obj;
OP_CODE :( union,difference,intersection,…)
end
一个无孔支架 bracket 的 CSG 的关系实例
mech_obj
ID MAN TYPE
…
“bracket #1”
“plate #1”
“plate #2”
…
…
“Steal,Inc.”
“Steal,Inc.”
“Steal,Inc.”
…
…
“comp_obj”
“prim_obj”
“prim_obj”
…
comp_objID MAN LEFT_ARG_OBJ RIGHT_ARG_OBJ OP_CODE
…
“bracket #1”
…
…
“steal,Inc.”
…
…
“plate#1”
…
…
“plate #2”
…
…
“union”
…
prim_objID MAN MAT PRICE PTYPE
…
“plate #1”
“plate #2”
…
…
“steal,Inc.”
“steal,Inc.”
…
…
“iron”
“iron”
…
…
20.00
10.00
…
…
“cuboid”
“cuboid”
…
cuboid
ID MAN MAT PRICE LENGTH WIDTH HEIGHT
…
“plate #1”
“plate #2”
…
…
“steal,Inc.”
“steal,Inc.”
…
…
“iron”
“iron”
…
…
20.00
10.00
…
…
10
10
…
…
5
2
…
…
0.5
0.5
…
对该模型的总结与讨论特点: 1. 扩展了对概括抽象和聚集抽象的支 持 , 方法简单,易理解。 2. 通过复制方案实现继承。问题: 1. 由于复制造成大量冗余,效率低下。 2. 没有面向对象行为,即不允许具体 的行为操作。 3. 基本对象的语义结构仍然不易表达。 4. 为保证一致性,在更新操作时需要进行持 续的信息复制,开销较大。
※6.2 分子对象— 对 generic 类型的进一步扩展
• 分子对象 (Molecular Object )的概念 — 分子对象由分子集合组成 — 分子集合将一系列实例 ( 可以是不同类
型 )
和它们的关系,聚集对象为较高层次的 实体
• 分子对象的结构分类: — 不相交 / 非递归; — 相交 / 非递归; — 不相交 / 递归; — 相交 / 递归;
相交:指一个分子对象的组成部分是否能被其他同类型分子对象共享。递归 / 非递归:分子对象的结构是否是递归定义的。
四种类型分子的进一步说明• 不相交 / 非递归 ——是最简单的结构 — 分子集合内的所有分子之间均是两个不 相交的、结构不重叠的,因之也不是递 归定义的。 例如:原始对象集合。
• 相交 / 非递归的分子对象 — 分子间存在共享对象成份,即两个分子
可能在一些抵赖的分子对象上重叠。 例如:具有同一平台的两个几何体
• 不相交 / 递归 — 具有递归定义的不共享的分子结构, 例:几何对象的 CSG 表示是一个递归分
子 对象的典型例子,它构成一颗二叉树。
参照图 3.2 (支架表示)
• 递归 / 相交 — 如果允许 CSG 中的几何部件被共享,
则 它是一个有向无环图 DAG
CSG1
CSG2
6.3 将 QUEL 表达式作为类型的关系模型的扩展
• QUEL:— 由伯克利分校研制的 Ingres 查询语言 — 类似于元组关系演算• QUEL 的组成:由三个子句组合而成
—range of 子句:类似于 from 子句,作用为声明元组变量的取值范围,书写格式为
range of t is r(t 为关系 r 的一个元组变量 )—retrieve 子句:类似于 select 子句,作用为
确 定查询目标,其变量必须已经在 range子句中声明, retrive t.A 查询 t 的 A 属性
值—where P 子句:条件子句, P 为选择谓词
*请参考“数据库系统概念”第五章
一般化引用基制的模型构造• 纯关系结构示例:
E-R :• 关系表
boundary
GEO_ID FACE_ID
“cube#1”
…
“cube#1”
…
“cube#1”
…
“f1”
…
“f6”
…
“f1”
…
mech-part boundary facesN M
faces
ID SURFACE …
“f1”
“f2”
…
“f6”
…
…
…
…
…
…
…
…
…
…
…
…
…
…
mechanical_part
ID NAME …
“cube#1”
…
“cube#2”
…
“cube#3”
…
…
…
…
…
…
…
…
…
…
…
…
…
QUEL 查询语句序列• range of m is mechanical_part
range of f is facesrange of b is boundaryretrive m.all,f.allwhere m.ID = “cube#1”
and m.ID = b.GEO_IDand f.ID = b.FACE_ID
• range of m is mechanical_partretrive m.all, m.FACE_JOINwhere m.ID = “cube#1”
• range of f is facesretrive f.GEO_JOINwhere f.ID= “f1”
关系模型的扩展• 关系属性类型中扩展一个新类型— QUEL
类型• QUEL 类型为一个 QUEL 查询表达式,它
可以在被引用是触发执行• 使用 QUEL 类型代替外键联接关系,例如
上图 boundary ,从而将原来显示的联接隐含在父关系的某个属性中,只有在动态联接时才被激活
上述关系示例的扩展mechanical_part
ID NAME FACE_JOIN
“cube#1”
…
“cube#2”
…
…
…
“range of f is faces
retrive f.all
where f.ID in {“f1”, …}”
…
“range of …”
facesID SURFACE … GEO_JOIN
“f1”
“f2”
…
“f6”
10.0
15.0
…
…
…
…
…
…
“range of m is mechanical_part
retrieve m.all
where m.ID in {“cube#1”, “cube#2”}”
…
…
…
相应的 QUEL 查询语句• 利用 mech-part 的 FACE-JOIN 和 faces 中
的 GEO-JOIN 属性代码为:range of m is mech-partretrieve m.all,m.FACE-JOINwhere m.ID = “cube#1”
range of f is facesretrieve f.GEO-JOINwhere f.ID=“f1”
进一步的扩展• range of m is mech-part
retrive m.FACE-JOIN.SURFACE
where m.ID = “cube#1”
• 利用 QUEL 类型和操作符” .” 的重载,可以在构造一个复杂的引用链时,通过简化显式联接的方法简化查询和关系表的构建
安全性的缺陷• 由于采用隐式的联接方法 ( 通过 QUEL函数 ) ,使
得查询结果只有在运行时进行动态联接时才能确定,因而容易产生类型安全性错误
• 例如:
mechanical_partID NAME FACE_JOIN
“cube#3”
…
“cube#2”
…
…
…
“range of f is other_faces
retrive f.all
where f.ID in {“f20”, …,”f25”}”
“range of …”
other_facesID SURFACE … GEO_JOIN
“f20”
“f21”
…
“f25”
“smooth”
“smooth”
…
“rough”
…
…
…
…
“range of m is mechanical_part
retrieve m.all
where m.ID in {“cube#3”}”
…
…
…
安全性的缺陷 ( 续 )
• 程序range of m is mechanical_partretrive sum(m.FACE-JOIN.SURFACE)where m.ID = “cube#1”
range of m is mechanical_partretrive sum(m.FACE_JOIN.SURFACE)where m.ID = “cube#3”
6.4 关系模型中的抽象数据类型• 概念:该模型发展得最好的是 INGRES ,
他们在开始研制时已留有与 C 的接口——ADT-INGRES ,并进一步发展为 POSTGRES 。
抽象数据类型的建模过程• 在关系建模时,可以将某些属性显式地说明为一
个抽象数据类型 ADT• 例:
cuboids ( id: integer, material: char(10), description: char(20), V1: ADT: vertex_type, V2: ADT: vertex_type, … V8: ADT: vertex_type)
抽象数据类型的建模过程 ( 续 )• 用户在系统提供的环境上,定义一个 ADT 的接口说明• 例: define ADT
(typename = “vertex_type”,
bytesin = 9,
bytesout = 9,
inputfunc = “to_internal_vertex”,
outputfunc = “to_external_vertex”,
filename = “/usr/ingres/…/vertex”)
X Y Z
“X%%Y%%Z”
to_internal_vertex to_external_vertex
抽象数据类型的建模过程 ( 续 )
• 用户需要用 C(informix 也允许用 java) 语言实现 ADT 的结构读写程序,并存放在按接口说明的路径所示位置
• 在数据库运行时,需有用户需要检索 ADT的值,则系统自动进行动态联接,激活并运行相应的函数
• 例:执行一个查询range of c is cuboids
retrieve (c.material, c.description,c.V1)
where c.id = 5• 结果为:
material descritption V1
X Y Z
copper massive 1.0 3.5 2.0
• 用同样的方法,可以定义并实现在 ADT 域上的各种用户自定义操作
• informix 中使用 UDR工具实现• 例:
define adtop(opname = “Ry”, funcname = “rotate_abount_y”, filename = “/usr/ingres/../rotate_y”, result = ADT: vertex_type, arg1 = ADT: vertex_type, arg2 = ADT: angle_type, prec like “+”)
6.5 XSQL 支持的层次扩展模型• XSQL 是 Kifer 在 1992 中提出的一个 SQL
的面向对象的扩展模型• SQL-3 标准已包括了 SQL 面向对象的扩展• XSQL 支持的层次扩展主要针对复合对象模
型,其扩展的主要是聚合抽象的实现方法
基于纯关系模型的 XSQL 的基本构成
• 代用 Surrogates :由系统产生并维护的关系元组对象实例的逻辑标识符
• 特点1. 唯一性2. 系统内部产生,用户不能干涉3. 不可修改,在一个对象的生命周期中保持不变
4. 代用产生的标识符应当保证在“世界范围”内的唯一性,以保证基于广域网
的分布式 DB 中每个元组的唯一性生成方法: processor ID date & time
• component –of 属性—— XSQL利用该属性建立元组间的引用关联。关联的语义为 part-of
特点: component-of 属性支持元组间的 1:1 和 1:N的联接
• E-R 表示:
• 关系表的定义create table E1(E1-ID:identifier,
E1_DATA:…)create table E2(E2-ID:identifier,
E2_FATHER:component of (E1), E2_DATA:…)• component of 的值是与 E2 的一个元组 e2 具有
R1联系的 E1 的元组 e1 的 ID 值
NE1 R1 E2
componet of
1
• 多层次的引用结构E1
E2 E3
E4
R1 R2
R3
(0,*) (0,*)1 1
(1,1)
(0,*)
(1,1)
(1,1)
N N
N
1
create table E1(E1-ID:identifier, E1_DATA:…)create table E2(E2-ID:identifier, E2_FATHER:component of (E1), E2_DATA:…)
E2
E2-ID E2-FATHER E2-DATA
$589000101
$589000103
…
$589000100
$589000100
…
…
…
…
E3
E3-ID E3-FATHER E3-DATA
$589000102
$589000104
…
$589000100
$589000100
…
…
…
…
E4
E4-ID E4-FATHER E4-DATA
$589000105
…
…
$589000101
…
…
…
…
…
E1
E1-ID E1-DATA
$589000100
$589000200
…
…
…
…
•代用标识符的组成含有元组对象间的依赖关系,即对属于同一个复合对象的元组,其 ID 值具有相同的前缀•系统对每一个复合对象建立一个 map 的映射,含有指向该元组的存储位置指针 TIDs
元组间 N:M联系的扩展方法• 原理:由于 XSQL 是在纯关系上进行的扩
展,因此,不可能表示集合属性,解决 N:M 关联的方法只能采用第三方关系——专门定义一个引用关系表 R ,将两个有联系的元组对应起来
• reference 属性,它建立了一个引用关联
一般的 N:M联系的关系表定义• E-R 表示:
• 关系表定义:create table E1(E1-ID:identifier,
E1_DATA:…)create table E1(E2-ID:identifier,
E2_DATA:…)create table R(R-ID:identifier,
RtoE1: reference(E1),RtoE2: reference(E2))
E1 R1 E2N M
XSQL 模型的评价创新点:• 元组的逻辑标识符概念的引入• 在关系模型的基础上建立了关系间的层次结构• 解决了数据类型的 QUEL 的安全隐患局限性:• component-of 属性可以较好支持 1:N联系,但是
在共享低层对象时,由于关系不能表示集合,会造成大量的冗余,即一个引用就需产生一个对象元组,由此造成查询的复杂低效,和一致性更新维护困难
局限性 (续 )
• 对引用属性的支持力度很弱。由于 reference 属性相当于纯关系系统中的联接关系,因此直接按照引用属性链完成检索是不可能的,只能采用多个表的 JOIN 方法进行显式地重构。
• 由于复合对象的管理由系统完成,即 map对用户不可见,因而进行复合对象物理存储的集束 (clustering)优化是困难的 ( 即在一个页面上汇集不同元组组成的复合对象 ) 。