资源描述
第二章 关系数据模型,2.1 关系定义 2.2 关系运算和关系演算 2.3 函数依赖 2. 4 关系规范化,2.1 关系定义,1基本术语(terms) 关系模型并不难理解,但它是理论,大多数理论都带有它自己的专门术语,关系模型在这方面也不例外。 基本术语如图2.1-关系术语所示,有: 域 (domain) pool of legal values 元组 (tuple) row or record 关系 (relation) table 属性 (attribute) column or field 度 (degree) number of columns 势 (cardinality) number of records 主键 (primary key) unique identifier,域 : 一个域就是一个数据类型(简称为类型), (domain) 它可能是一种系统定义的类型,如 INTERGER ( int ) 或CHAR ( char )。更 常见的是用户自己定义的类型,如学生- 成绩数据库中的“学号”或“课程编号”等。 值集: 即值 的集合 (value set) 类型: 什么是一个类型呢?它是一个值的集合和 (data type) 定义在这个值集上的一组操作的总称。,伴随着给定的类型,就会出现操作符的问题:即何种 操作符能合法地应用于给定类型的值上;也就是说, 该类型的值只能被定义在相应类型上的操作符操作。 例如,对于INTEGER,系统提供: 操作符“=”、“”,等等,用来比较整数大小。 操作符“ +”、“*”,等等,执行整数上的算术操作。 对于INTEGER,系统不提供: 操作符“&”(连接)、SUBSTR(取子串)等操作符用 在整数上进行字符串操作。 换句话说,对于“INTEGER”类型系统不支持字符串 操作。,提示: 不同的关系数据库管理系统对每一种系统允许的 类型所提供的操作的操作符会有所不同。 例如:Access 中提供“+”和“&”操作符来支持对字符串 的连接操作, 如,“abc” + “efg” 结果是 “abcefg” “abc” & “efg” 结果也是 “abcefg”,2. 关系的数学定义 笛卡尔积: 给定一组域 D1,D2,Dn ,则 D1D2Dn =(d1,d2, ,dn)|diDi,i=1,2, ,n 称为D1,D2,Dn的笛卡尔积。 其中每个(d1,d2, ,dn)叫做一个 n 元组,元组中 的每个 di 是 Di 域中的一个值,称为一个分量。,例如, 设有域 D1 = “张金”,“王银”,“李玉”, D2 = “男”,“女” 则对应的笛卡尔积: D1D2 = (“张金”, “男”), (“张金”, “女”), (“王银”, “男”), (“王银”, “女”), (“李玉”, “男”), (“李玉”, “女”),关系: 简单地说,如果把关系看作一张表,那么一个元组 就是这张表的一行,一个属性 就是一列;元组的数目称为势 ,属性的数目称作度 ;域 是值的集合,关系中 属性的值取自域。,这里有一个关系的精确定义: 给定一个集合,它包含n个类型或域Ti(i= 1 , 2 , n),这些域没有必要各不相同。R 如果包含如下定义 的表头(heading)和主体(body),那它就是一个关系。 a) 表头是具有n个形式为Ai : Di的属性的集合,其中: Ai(必须各不相同)是R 的属性名;Ti 是相应类型的名字(i= 1 , 2 ,n)。 b) 主体是一个包含m个元组 t 的集合,其中,t 依次是形式为Ai : vi 的分量的集合,vi 是类型 Di 的值,即元组t 在属性 Ai 上的值(i= 1 , 2 ,n),教材中关于“关系”的定义: 设有属性A1,A2, ,An,它们分别在域 D1,D2,Dn 中取值,则笛卡尔积 D1D2Dn 中的任何一个子集称为 一个关系, 记为 R(A1,A2, ,An), R D1D2Dn 其中R为关系名,Ai为属性名(必须不同)。,“关系” 举例: 学生-性别(姓名,性别) = (“张金”,“男”), (“王银”,“男”), (“李玉”,“女”),3. 关系的性质 任何一个关系都具备以下特性:,关系中的每一个属性值都必须是不能再分割的数据值。 每一列中的数值是同类型的数据,来自同一个域 不同的列应给予不同的属性名。 同一个关系中不允许有相同的元组。 行、列的次序可以任意交换,不影响关系的实际意义。,2.2 关系运算和关系演算,任何一个 DBMS 都要提供能从 “关系” 的纵横两个方向(即:属性和元组)上进行检索、插入、更新和删除操作。操作的主要组成部分是关系代数,它是一个操作符的集合,以关系作为操作对象,返回的结果是一 个关系。(即所谓的“关系进,关系出”) Codd 定义了一个含 8 个操作符的集合,即通常所说 的基本(original)关系代数。它们是:,1.传统的集合操作符 并(union) 交(intersection) 差(difference) 笛卡尔积(Cartesian product) (所做的修改只是操作对象变为了特定的关系,而不再是任意的集合) 2.专门的关系操作符 选择(restrict,也称为select) 投影(project) 连接(join) 除(divide),1.传统的集合操作符 设 R1 和 R2 为参加运算的两个关系,如下图所示。 它们具有相同的度,且相对应的属性值取自同一个 域,则可定义以下的三种传统集合运算。 R1 R2,1)并( R1 R2 或 R1 UNION R2) 是相同类型的一个关系,关系的主体由出现在 R1 中 或 R2 中或同时出现在两者之中的所有元组组成。 R1 R2 R1 R2,2)交( R1 R2 或 R1 INTERSECT R2) 是相同类型的一个关系,关系的主体由同时出现在两 者之中的所有元组组成。 R1 R2 R1 R2,3)差( R1 R2 或 R1 MINUS R2 ) 是相同类型的一个关系,关系的主体包含属于 R1 但 不属于 R2 的所有元组。 R1 R2 R1 R2,4)笛卡尔积( R1R2 或 R1 TIMES R2 ) 设有关系 R1(A1,A2, ,Am) 和 R2(B1,B2, ,Bn) 其中 R1 和 R2 没有共同的属性名称, A1:a1,A2:a2,Am:am是 R1 中的一个元组 B1:b1,B2:b2,Bn:bn是 R2 中的一个元组 两元组的并 是一个元组: A1:a1,A2:a2,Am:a m,B1:b1,B2:b2, Bn:bn,则 R1 与 R2 的笛卡尔积 R1R2 是一个关系,它的表头是 R1 和 R2 表头的并,主体 包括所有 R1 中的元组和 R2 中的元组进行并操作而 得到的元组。注意结果的势是 R1 的势和 R2的势的乘 积,结果的度是 R1 的度和 R2 的度的和。 例如, R1R2 R1 R2,2.专门的关系操作符 1)选择 假设关系 A 含有属性 X 和Y(也可能有别的),是 一个比较操作符,诸如“=”、“”,等等,X Y 为定 义好的条件(F),若给 X 和 Y 赋予具体的值,则能计 算出真值(true或false)。关系 A 在属性 X 和 Y 上的选择是一个关系 F(A),关系的表头和 A 的 一样,主体包括所有满足条件X Y 为真的元组。 例如,关系 A 如左下表,条件 F 为 性别=“男” , 则F(A):,2)投影 投影运算是对属性的操作,是从一个给定关系的所有 属性中选择某些指定的属性 T 。 假定关系A有属性X,Y,Z(可能还有其他的)。关系 A 在T上的投影T(A)是一个满足如下条件的关系: 表头由 A 的表头除去不包含在属性集合T中的属性 而得到; 主体包含所有形式为X: x,Y: y , , Z: z的 元组,这样的元组是由对应关系 A 的属性 T 的值 组成。 注意:投影之后不仅取消了某些属性,而且因属性减 少可能会出现重复的元组,这些元组也将自动 取消。,例如关系 A 如左下表,选择的属性集合 T 为 性别 A 则T(A) : 实际中经常出现这种情况:指定被投影掉的属性比指定 投影的属性更方便。例如第13页图1-9 (b)所示的关系 P,可以说“从关系P中投影掉属性 颜色 ”,而不是 “关系P在属性零件号、零件名、重量、存放点 上的投影”。(就像下面:P ALL BUT WEIGHT ),3)连接 连接是从两个关系 R 和 S 的笛卡尔积中选取满足条 件的元组形成新的关系,记为 R F S。例如: R S R ZT S,如果条件 F 是一个相等条件,则称为等值连接,例如 R Z=T S 。 如果是同名属性的等值连接又称为自然连接。例如 R Y=Y S ,简记为 R S ,结果如下: 通常 JION 总是指自然连接。,4)除 除法运算表示为 RS。应满足以下条件: 关系S的属性全部包含在关系R中; 关系R的一些属性不包含在关系S中。 运算所得结果是一个关系(T),则 T 中的属性由 R 中 除 S 中的属性之外的属性组成,而 T 中的元组由 R 与 S 中在所有相同属性上有相等值的元组组成。,例如: R S RS,关系运算举例: 下面提供了用在查询中的有关关系代数表示的一些例子。对照 第13页图1 - 9中的数据检验这些例子。 1. 求提供零件 P2 的供应商名称 (SP JOIN S)WHERE 零件号 = 零件号(P2) )厂名 解释:首先构造关系 SP 和 S 在供应厂号上的自然连接,从 概念上来说,它扩展了每个 SP 元组相应的供应商信息(即 供应厂号、状态码和厂址的值)。随后这个连接以零件 P2 为 条件进行了选择。最后选择在 供应厂号 上做了投影。结果中 只有 供应厂号 这一个属性。 结果如下图所示:,关系 SP 和 S 在供应厂号上的自然连接:,结果:,关系运算举例: 2. 求提供至少一个红色零件的供应商名称 (P WHERE 颜色 = 颜色 ( “红” ) JOIN SP)供应厂号 JOIN S)厂名 结果唯一的属性还是 厂名。 下面给出对同一个查询的不同的表述: (P WHERE 颜色 = 颜色 ( “红” ) JOIN SP)零件号 JOIN S)厂名 这个例子说明了一个重要的事实:对同一个查询经常有不同的 表述。,关系演算 前面,我们说关系模型的操作部分是基于关系代数 的,同样我们也可以说它是基于关系演算的。 换句话说, 关系代数和关系演算是可以相互替代的。 它们之间的基本区别是: 关系代数提供了像连接、并和投影等明确的集合操作 符,并且这些集合操作符告诉系统如何从给定关系构 造所要求的关系;而关系演算仅提供了一种描述 (notation)来说明所要求的关系(这一关系是根据 给定关系导出的)的定义。,例如第13页图1-9所示的关系 SP 和 S。 查询提供零件P2的供应厂的厂名和厂址。 此查询的一个代数操作形式可以描述如下: 首先,根据供应厂号连接供货厂表(关系 S)和供货表(关系 SP)中的元组; 其次,在上述连接结果中选择零件号为P2的元组; 最后,将上述选择结果在供应厂号和厂址列上投影。,相比而言,一个演算形式可以简单地描述为: 查取供应厂号和厂址当且仅当在关系 SP 中存在这样 的一个元组:它具有同样的供应厂号,且它的零件号 取值 P2。 在后一种形式中,用户仅仅描述了所要求结果的定义 而把具体的连接、选择等操作留给了系统。,提示: 关系演算是描述性(descriptive)形式的,而关系代 数是说明性(prescriptive)形式的。 关系演算描述了问题是什么,而关系代数说明了解决 问题的过程。 或者,可以说, 关系代数是过程化的(诚然,是高级的,但仍然是过 程化的);而关系演算是非过程化的。 然而,我们强调的上述区别仅仅是表面上的。实际 上,关系代数和关系演算在逻辑上是等价的。即每一 个代数表达式都有一个等价的演算表达式,每一个演 算表达式都有一个等价的代数表达式。,关系演算举例: 下面给出一些范围变量的例子(用供应商表和零件表为例): RANGEVAR SX RANGES OVER S; RANGEVAR SPX RANGES OVER SP; 1. 找出提供零件 P2 的所有的供应商的信息 SX WHERE EXISTS SPX ( SPX.S# = SX.S# AND SPX.P# = P# ( P2 ) ) 注意此原型元组中范围变量名的使用。这个例子可以写成以下 形式: ( SX.S#, SX.SNAME, SX.STATUS, SX.CITY ) WHERE EXISTS SPX ( SPX.S# = SX.S# AND SPX.P# = P# ( P2 ) ),关系演算举例: 2. 找出至少供应一个红色零件的供应商名 SX.SNAME WHERE EXISTS SPX ( SX.S# = SPX.S# AND EXISTS PX ( PX.P# = SPX.P# AND EXISTS PX ( PX.P# = SPX.P# AND PX.COLOR = COLOR ( Red ) ) ) 其中, SNAME 厂名 S# 供应厂号 P# 零件号 COLOR 颜色,域演算 域演算不同于元组演算,它是定义在域上而不是定义 在元组上。 下面只给出“找出至少供应一个红色零件的供应商名” 这个例子的域演算的表示: NAMEX WHERE EXISTS SX EXXISTS PX ( S ( S# : SX, SNAME : NAMEX ) AND SP ( S# : SX, P# : PX ) AND P ( P# : PX, COLOR : COLOR ( Red ),SQL语言 一种给定的关系语言要么基于关系代数,要么基于关 系演算。那么 SQL 语言是基于哪一个呢?很遗憾, SQL 只有部分基于这两者,还有一部分并不基于它们。 下面只给出“找出供应零件 P2 的供应商的名字” 的 SQL 语言表示: SELECT DISTINCT S.SNAME FROM S WHERE S.S# IN (SELECT SP.S# FROM SP WHERE SP.P# = P2 );,2.3 函数依赖,在接下来的两节中介绍数据库的设计(更确切地说是关系数据库的设计),数据库设计问题可以简单地描述为:如果要把一组数据储存在数据库中,该如何为这些数据设计一个合适的逻辑结构?也即应该有哪些关系?每个关系该有哪些属性? 数据库设计应该说是一种艺术而不是一种科学。 自上而下的数据库设计问题:从现实世界的实体开始,以规范的关系设计结束。,1基本概念 为了解释本节的一些概念,把发货关系变量稍作修改,使它除了含有原来的属性: S#(供应商编号)、 P#(零件编号)和 QTY (发货量)外,(参见下页图表) 增加一个属性 CITY(城市),该属 性表示供应商的地址, 为了防止混淆,把这 个关系变量称为 SCP。 关系变量 SCP的一 个可能的值见右表。,供应商-零件 数据库(样本值),函数依赖 主要是指一个关系变量 中一个属性集 和另一个属性集间的多对一关系。例如: 在发货关系变量 SP 中存在由属性集 S#,P# 到属 性集 QTY 间的函数依赖,它的意思是,对于关系 变量 SP 的任意一个合法的值(关系): 对于任意给定的属性集 S# 和 P# 的值,只有一 个 QTY 的值与之对应;但是 2)可以存在许多 S# 和 P# 的不同的值,而它们所对 应的 QTY 的值相同。 注意:我们通常所举的 SP 的例子确实满足以上两个 条件。,定义1:假设 r 是一个关系, X 和Y 是 r 的属性集的任意子集,当且仅当 r 中任一给定的 X 的值,在 r 中存在一个唯一的 Y 与之对应。也就是说,如果 X 相等,Y 也相等,则 Y 函数依赖于 X,表示为 XY (读作 X 函数决定 Y,或简单读作 X 指向 Y)。 例如:关系 SCP 满足下述函数依赖: S#CITY 可以简记为: S#CITY (当且仅当 X 和Y 中只包含 一个属性) 因为这个关系的任一给定的 S# 值都有一个给定的 CITY 与之对应(任一给定的 CITY 值有多个 S# 与之 对应)。,事实上,该关系还满足下列函数依赖: S #,P # QTY S #,P # CITY S #,P # CITY,QTY S #,P # S # S #,P # S #,P #,CITY,QTY S # QTY QTY S # ,现在,有必要分清楚以下两种不同的情况: ( a )给定的关系变量在某一特定时间的值; ( b )给定关系变量在不同时候所有可能的值。 首先根据情况( a )讨论函数依赖,然后,把函数依赖 的概念扩展到情况( b )。 前面 定义1 给出的是符合情况 ( a ) 的函数依赖的 定义,即对关系变量的某个或某些关系适用的函数依 赖。 人们所感兴趣的是对关系变量的所有可能的值都适用的函数依赖。,例如在 SCP 中,函数依赖 S# CITY 对 SCP 的所有可能值都适用,因为在任何情况下,一个给定的供应商有一个确定的地址(CITY),所以在 SCP 中的任意两个元组,如果它的供应商编号( S# )相等,则它们的地址(CITY)相等。事实上,“任何时间”都适用的函数依赖(例如对所有S C P可能的值)是关系变量 SCP 的完整性约束条件它是对 SCP 所有被认为合法的值的一个限制。,下面是在情况(b)下函数依赖的定义: 设R 是关系变量,X、Y 是R 的属性集的任意子集,当且仅当对于R 的所有可能的合法值, X 的值和Y 的值密切相关。也就是说,对于R 的所有 可能的合法值,当两个元组的 X 值相等时,Y 值也相 等,则Y 函数依赖于X,表示为:XY 今后说“函数依赖”指的是要求更加严格的、具有时间独立性的函数依赖,而不必详细说明函数依赖成立的条件。,下面是关系变量S C P的一些函数依赖(具有时间独立性的函数依赖): S #,P # QTY S #,P # CITY S #,P # CITY,QTY S #,P # S # S #,P # S #,P #,CITY,QTY S# CITY,特别要注意下列函数依赖,它们在图1 0 - 1的情况下成立,但并不是任何时间对关系变量 SCP 都成立。 S #QTY QTYS # 换句话说,在前面所示的关系 SCP 中,命题“给定供应商的发货量是相等的”是真的,但并不是对关系变量 SCP 的所有可能的合法值都是真的。,问题: 即使只考虑任何时间都满足的函数依赖,一个给定的关系变量的完整函数依赖集还是很庞大的,如关系变量 SCP所示(练习:给出 SCP 的完整的函数依赖集)。应该寻找一个方法把这个集合缩小到一个可管理的范围。 给定一个函数依赖集 S,如果能找到一个集合 T,T 远远小于S,而集合 T 的函数依赖蕴涵集合 S 的所有函数依赖,则 DBMS只要实现函数依赖集 T,函数依赖集 S 中的所有函数依赖会自动实现,因此,寻找函数依赖集 T 具有实践上的重要性。,2平凡的函数依赖和非平凡的函数依赖 缩小函数依赖集大小的一个简单方法是消除平凡的函数依赖。 一个不可能不满足的函数依赖称为平凡的函数依赖。 在前面提到的关系变量 SCP 的一个函数依赖就是平凡的函数依赖,即函数依赖: S#,P# S# 事实上,当且仅当函数依赖的右边是左边的子集(不一定是真子集)时,该函数依赖才是平凡的函数依赖。 如果 X Y ,同时 Y X ,则称 X Y 是非平凡的函数依赖。,2.3 关系规范化(normalization),规范化是关系数据库理论的重要内容。所谓的规范化 就是按照统一标准对关系进行优化(规范),以提高 关系的质量(也称关系具有更“好”的表示形式)。 范式: 如果一个关系满足“每一个属性值都是不可再分的元素” 那么该关系是一个规范化(normalized)的关系。满足 这一要求(也是关系的最低要求)的关系叫做 第一范 式,简记为 1NF。在此基础上满足更高要求的称为 2NF、3NF 等。将第一范式转换为若干高一级范式的关 系的集合的过程就叫做 规范化。,关系数据强调某些具有特定意义的信息要组合起来, 成为一个全局。在真实世界里,我们可以分出许多这 样的特定信息,于是我们会有许多这样的信息群 ( Information Group )。而实际工作时,我们是从 每一个信息群中提取出需要的信息,或者将修改过的 信息再“还原”(Restore)到个别的信息群中。 这个特性也符合人类思维的模式,这就是我们从小受 教育时,被训练出来的“归纳与分析”的能力。,在人类的思维模式里,每个不同的信息群之间都有一些特定的关系。或许您不觉得,但是很奇怪的,人类就是会自动去检索这些关系,并存在脑海里。和它相比,数据库系统也是一样,我们可以为一个目标建立许多数椐文件,每个文件都包含某些特定类别的信息,常常我们会同时提取许多不同数据文件的信息来使用。 因此您要为每个数据文仵之间建立“关联性”(Relation)。这个关联性就是决定一件事:当您需要查着某项数据时,您应该到哪一个文件的哪些地方去寻找相关的信息。,下面介绍实用的关系规范化原则: 规则一:域的唯一性; 规则二:适当的主关键字(Primary Key); 规则三:功能上的相关性; 规则四:域的独立性。 下面以 “关系规范化示例-学费数据” 数据库为例来应 用以上四条规则进行验证。,域的唯一性(uniqueness) 所谓域的唯一性,是指在同一个 Table 中,每一个域 都应该具有唯一(unique)的性质。 也就是说,在同一个 Table 中,不应该有两个或两个 以上相同性质的域。 例如,表“学生缴费详情”中的 缴费项目1,金额1 和 缴费项目2,金额2 具有相同性质。 改进:去掉 域 缴费项目2,金额2 (属性值 转换为 一个新的元组值) 参见表“学生缴费详情改进”,适当的主关键字(Primary Key) 在一个良好的关联性数据库的设计里,定义适当的主 关键字是非常重要的。 例如,表“院系信息” 主关键字 院系代码 表“专业信息” 主关键字 专业编号 而 表“学生缴费详情” 没有 主关键字 改进:增设“缴费流水号” 为主关键字 参见表“学生缴费详情改进”,功能上的相关性(relativity) 这个检查也是相当重要的,一旦您确定 Table 里的主关键字之后,表示这个 Table 的主题已经非常明确了 ,这时候您就应该检查一下,是否所有其它的域都是 与这个主题有关的,您应该尽量剔除掉所有与 Table 主题无关的域。相反的,如果与这个主题有关的信息, 也应尽量完整地纳入,也就是说,整笔记录的所有域, 要能非常充份地描述该主题,这样才是一个好的数据 库设计。,例如,表“学生缴费详情” 包含的姓名,性别,准考证 号 与 “缴费流水号” 这个主关键字所代表的信息含 义不相关。 改进:增设表“学生信息” 主关键字学号 参见表“学生信息” 包含需要的属性,域的独立性(independence ) 最后这个规则通常是最难实践,而且也是造成 Table 修改幅度最大的关键。它的原则是,无论何时,当您 修改某个域的内容时,都不应该去影响到其它域的内 容,这就是域的独立性。 例如,表“学生缴费详情” 包含的金额1,金额2与 合计金额不独立。 改进:去掉 合计金额 通过查询可以获得合计金额, 参见查询“学生缴费详情合计金额”,
展开阅读全文