关系代数、函数依赖、Armstrong公理及软考试题解析
注:本文面向于软考高级—系统架构设计师,具体来说是数据库部分,知识点偏零碎化。想要系统学习数据库原理的,可考虑去看《数据库原理》,清华大学出版社或其他出版社皆可。
概述
概念
关系,就是二维表。特性:
- 列不可分性:关系中每一列都是不可再分的属性,即不能出现如下复合属性
- 行列无序性:交换列的前后顺序不影响关系模式的语义表达
- 实体完整性:关系中不可能出现两个完全相同的元组
属性:二维表中的每一列称为属性,每个属性有一个名字称为属性名,某一列的值称为属性值。
值域:二维表中属性的取值范围。
元组:二维表中的一行数据称为元组,也叫记录。
分量:元组中的每个属性值称为元组的分量。
关系模式:关系的描述就是关系模式
超码:一个或多个属性的集合,这些属性的集合可以使我们在一个关系中唯一标识一个元组。
候选码:候选码是最小的超码,即候选码可以唯一标识一个元组,但除去候选码中的任何一个属性均不能唯一标识元组。
主码:当有多个候选码时可以选择一个作为主码,一个关系只有一个主码。主码能够唯一标识一个关系的元组且不含有多余元素。
外码:外码用于表示两个或多个实体间的关联关系。外码实际上是关系中的一个或多个属性,这些属性引用其他关系的主码或(候选码),详见参照完整性约束。
主属性:包含在任意候选码中的属性称为主属性,不包含在任意候选码中的属性叫非主属性。
逻辑蕴涵:设F是$R(U)$上的一个函数依赖集合,X和Y是R的属性子集。如果从F中的函数依赖能推导出$X→Y$,称F逻辑蕴涵$X→Y$,记作$F⊨X→Y$。
闭包:被F逻辑蕴涵的所有函数依赖集合称为𝐹的闭包,记作$F+$。如果$F=F+$,则F是一个全函数依赖族,或称函数依赖完备集。
完整性约束
数据完整性约束包含三大类:
- 实体完整性约束:可以通过Primary Key指定。指数据库所有表中都有主码,且表中不允许存在:a.无主码的记录 (数据库中所有记录主码中所有属性都不为空) b.主码相同的记录。
- 参照完整性约束:也称引用完整性,要求关系中不允许引用不存在的实体。描述实体间的联系,一般是指多个实体表之间的引用关系。通过Foreign Key指定,某些简单的约束可以通过Check、Assertion等实现。针对复杂的约束,系统提供触发器机制,通过用户编程实现。
- 用户自定义完整性约束:也称为域完整性和语义完整性,任何关系数据库管理系统都应支持实体完整性参照完整性,除此之外根据要求不同还需要加一些特殊的约束条件。
关系代数表达式
关系代数中包括:并(∪)、交(∩)、差(-)、乘(笛卡尔积,×)、选择(σ)、投影(π)、联接(等值联接,)、除(÷)、自然联接(⋈)等操作。
五个基本操作:并、差、笛卡尔积、投影、选择,四个组合操作:交、联接、除、自然联接。
等值连接:Equi Join,表示先做笛卡尔积(×)之后,对相应列进行选择或等值关联后的结果;仅筛选行、不筛选列。
自然连接:Natural Join,一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并在结果中把重复的属性列去掉。而等值连接并不去掉重复的属性列。
由关系代数运算经有限次复合而成的式子称为关系代数表达式。这种表达式的运算结果仍然是一个关系。可以用关系代数表达式表示对数据库的查询和更新操作。
关系代数表达式可使用属性列,也可以使用数字,两者是等价的。两个关系的共有属性列,需要标上关系.属性列,不能简单的使用属性列。
举例来说,有关系$R(A,B,C,D)$和$S(C,D)$,关系代数表达式$π_{A,R.D}(\sigma_{R.C=S.D}(R⋈S))$与关系代数表达式$π_{1,4}(\sigma_{3=6}(R⋈S))$等价。R.D不能写成D,因为D是两个关系里都有的属性列。
给定关系$R(A,B,C,D,E)$与$S(A,B,C,F,G)$,表达式$π_{1,2,4,6,7}(\sigma_{1<6}(R⋈S))$,因为A、B、C是两个关系的共有属性列,等价SQL语句为:SELECT R.A,R.B,D,F,G FROM R,S WHERE R.A=S.A AND R.B=S.B AND R.C=S.C AND R.A<S.F
候选码
也叫候选关键字。若关系中的一个属性或属性组的值能够唯一地标识一个元组,且他的子集不能唯一的标识一个元组,则称这个属性或属性组为候选码。
快速求候选码的方法
对于给定的关系模式$R(A_1,A_2,...,A_n)$和函数依赖集F,可以将它的属性划分为4类:
- L类:Left,仅出现在F的函数依赖左部的属性
- R类:Right,仅出现在F的函数依赖右部的属性
- N类:None,在F的函数依赖左部和右部均未出现的属性
- LR类:Left AND Right,在F的函数依赖左部和右部两部均出现的属性。
根据以下定理和推论来求解候选码。
- 定理1:若X(X∈R,下同)是L类属性,则X必为R的任一候选码的成员
- 推论1:若X是L类属性,且X+包含R的全部属性,则X必为R的唯一候选码
- 定理2:若X是R类属性,则X不在任何候选码中
- 定理3:若X是R的N类属性,则X必包含在R的任一候选码中
- 推论2:若X是R的N类和L类组成的属性集,且X+包含R的所有属性,则X是R的唯一候选码
图论判定方法
函数依赖
某个属性集决定另一个属性集时,称另一属性集依赖于该属性集。举例来说,在设计学生表时,一个学生的学号能决定学生的姓名,则称姓名依赖于学号。
函数依赖分为非平凡依赖,平凡依赖:
- 非平凡依赖:当关系中属性集合Y不是属性集合X的子集时,存在函数依赖X→Y
- 平凡依赖:当关系中属性集合Y是属性集合X的子集时(Y⊆X),存在函数依赖X→Y,即一组属性函数决定它的所有子集
从性质上还可以分为:
- 完全函数依赖:Full Functional Dependency,设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X
- 部分函数依赖:Part Functional Dependency,设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X
- 传递函数依赖:Transitive Functional Dependency,设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y!→X),Y→Z,则称Z传递函数依赖于X
属性关系与函数依赖
属性之间有三种关系,但并不是每一种关系都存在函数依赖。设R(U)是属性集U上的关系模式,X、Y是U的子集:
- 如果X和Y之间是
1:1
关系(一对一关系),则存在函数依赖X→Y和Y→X - 如果X和Y之间是
1:n
关系(一对多关系),则存在函数依赖Y→X - 如果X和Y之间是
m:n
关系(多对多关系),则X和Y之间不存在函数依赖
模式分解
模式分解是数据库设计中的重要步骤,即将一个关系模式分解成多个关系模式,以便更好地满足数据库设计的要求。
把一个关系模式分解成若干个关系模式的过程,称为关系模式的分解。把低一级的关系模式分解为若干个高一级的关系模式的方法不是唯一的。只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义。
判断分解是等价的方法:
- 分解具有无损连接性(Lossless Join)
- 分解要保持函数依赖(Preserve Dependency)
- 分解既要保持函数依赖,又要具有无损连接性
无损分解
Lossless Decomposition,对关系模式分解时,原关系模型下任一合法的关系值在分解之后应能通过连接操作(如自然联接)恢复起来(重新构造出原始的关系)。如果不能恢复,则是有损分解。
函数依赖分解
Functional Dependency Decomposition,指根据关系模式中的函数依赖关系,将一个关系模式分解成多个关系模式,以消除冗余和提高数据的完整性和一致性。
无损分解通常是函数依赖分解的结果之一。在进行函数依赖分解时,通常会通过分解来消除冗余和提高规范化程度,而同时保持分解后的关系能够无损地重构原始关系。
但是,某个分解是无损分解并不一定意味着它同时也是函数依赖分解。
最小覆盖
如果函数依赖集合F满足下面的条件,称F为最小覆盖或最小依赖集:
- F中每个函数依赖,右部都是单个属性。
- $∀X→A∈F$,有$F−{X→A}$不等价于F。即,F是最小的,去掉F中的任何一个函数依赖都不行。
- $∀X→A∈F$,$Z⊂X$,有$(F−{X→A})∪{Z→A}$不等价于F。即F中的任何一个函数依赖都是最小的,不可以把它们的左部缩小。
构造最小依赖的方法:
- 分解:将$X→AB$分解成$X→A$和$X→B$,即所有依赖的右部都是单一属性。
- 去除左部多余的属性:逐一检查所有的依赖项的左部。对于左部不是单一属性的依赖项,例如$XY→A$,判断Y是否多余。计算$X+$,如果$X+$包含$Y$,则Y就是多余的,可以去掉。
- 去掉多余的依赖:对于每一个依赖项$X→Y$,先去掉它,然后在其他项里求$X+$,如果$X+$包含Y,那么确实可以去掉它,否则就不能去掉。
ER图冲突
ER图集成时产生的冲突及解决办法:
- 属性冲突:包括属性域和属性取值的冲突
- 命名冲突:包括同名异义和异名同义
- 结构冲突:包括同一对象在不同应用中具有不同的抽象,以及统一实体在不同的局部E-R图中所包含的属性个数和属性排列次序不完全相同
元祖演算
合并规则
Armstrong公理系统
基于一些推理规则,从已知的一些函数依赖,可以推导出另外一些函数依赖。这些推理规则就是函数依赖的Armstrong公理系统。
设关系模式$R(U,F)$,其中U为属性集,F是U上的一组函数依赖,则有6条推理规则(根据下述前三条规则可推出后三条):
- 自反律:若属性集Y包含于属性集X,属性集X包含于U,则X→Y在R上成立。(此处X→Y是平凡函数依赖)
- 增广律:若X→Y在R上成立,且属性集Z包含于属性集U,则XZ→YZ在R上成立
- 传递律:若X→Y和Y→Z在R上成立,则X→Z在R上成立
- 合并规则:若X→Y,X→Z,则X→YZ在R上同样成立
- 分解规则:若X→W在R上成立,且属性集Z包含于W,则X→Z在R上也成立
- 伪传递规则:若X→Y在R上成立,且WY→Z,则XW→Z在R上也成立
Armstrong公理系统是有效且完备的:
- 有效性:由R出发根据Armstrong公理系统推导出来的每一个函数依赖一定是R所逻辑蕴含的函数依赖。
- 完备性:对于R所逻辑蕴含的每一函数依赖,必定可以由R出发根据Armstrong公理系统推导出来。
证明
实战
关系代数表达式
给定学生$S(学号,姓名,年龄,入学时间,联系方式)$和选课$SC(学号,课程号,成绩)$关系,若要查询选修1号课程的学生的学号、姓名、成绩,则该查询的关系代数表达式为:$π_{1,2,7}(\sigma_{6='1'}(S⋈SC))$
解析:先进行S与SC关系的自然连接,即选取S.学号=SC.学号的元组并去掉右边的重复属性学号
,生成的新关系为(学号,姓名,年龄,入学时间,联系方式,课程号,成绩),共有7个属性列。
$π_{1,2,7}(\sigma_{6='1'}(S⋈SC))$的含义为:进行S与SC关系的自然连接,选取S.学号=sc.学号的元组并去掉右边的重复属性学号
,再选取“课程号=1”的元组,最后进行学号、姓名和成绩的投影运算。
自然连接
关系R、S如下图所示,进行自认连接运算后的元祖个数和属性列数分别是(3和4);关系代数表达式$π_{1,4}(\sigma_{3=6}(R⋈S))$与关系代数表达式$π_{A,R.D}(\sigma_{R.C=S.D}(R⋈S))$等价。
R如下:
A | B | C | D |
---|---|---|---|
6 | 3 | 1 | 5 |
6 | 1 | 5 | 1 |
6 | 5 | 7 | 4 |
6 | 3 | 7 | 4 |
S如下:
C | D |
---|---|
1 | 5 |
7 | 4 |
解析:自然连接是在等值连接的基础上去掉重复的属性列,而等值连接又要求R和S有相等的属性才能连接。因此,$R⋈S$结果为
A | B | C | D |
---|---|---|---|
6 | 3 | 1 | 5 |
6 | 5 | 7 | 4 |
6 | 3 | 7 | 4 |
有3行,故而元祖个数为3。
投影
给定关系模式$R(A,B,C,D,E)$、$S(D,E,F,G)$和$π_{1,2,4,6}(R⋈S)$,经过自然连接和投影运算后的属性列数分别是(7和4)。
解析:自然连接$R⋈S$是指R与S关系中相同属性列名经过等值连接运算后,再去掉右边重复的属性列名S.D、S.E,所以经$R⋈S$运算后的属性列名为:R.A、R.B、R.C、R.D、R.E、S.F和S.G,共有7个属性列。
经过投影运算后的属性列名为:R.A、R.B、R.D、S.F,共有4个属性列。
候选码
给定关系模式$R(U,F)$,其中属性集$U={A_1,A_2,A_3,A_4,A_5,A_6}$,函数依赖集$F={A_1→A_2,A_1→A_3,A_3→A_4,A_1A_5→A_6}$,关系模式R的候选码为(A1A5)。由于R存在非主属性对码的部分函数依赖,所以R属于()。
解析:因为A1A5仅出现在函数依赖集F左部的属性,所以A1A5必为R的任一候选码的成员。又因为A1A5的闭包等于U,则A1A5必为R的唯一候选码。
元祖演算
给定元祖演算表达式$R*={t│(Эu)(R(t)∧S(u)∧t[3]<u[2])}$,若关系R、S如下图,则$R*={(1,2,3),(4,5,6),(7,8,9)}$。
R如下:
A | B | C |
---|---|---|
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
10 | 11 | 12 |
S如下:
A | B | C |
---|---|---|
3 | 7 | 11 |
4 | 5 | 6 |
5 | 9 | 13 |
6 | 10 | 14 |
解析:$R*={t│(Эu)(R(t)∧S(u)∧t[3]<u[2])}$的含义为:新生成的关系$R*$中的元组来自关系R,但该元组的第三个分量值必须小于关系S中某个元组的第二个分量值。显然查询结果只有R关系的第一个、第二个和第三个元组满足条件。
模式分解
无损分解
已知关系模式$R(U,F)$,属性集$U={A,B,C,D,E}$,函数依赖集$F={AB→C,C→D,D→E}$,R的一个分解为$p={R1(A,B,C),R2(C,D),R3(D,E)}$,判断是否为无损分解。
构造表初始化:根据分解的R进行构造,和F无关;根据表中行号中的元素,填上对应的$a_i$,空白部分则补上$b_{ij}$,于是得到
分解的关系模式 | A | B | C | D | E |
---|---|---|---|---|---|
ABC | $a_1$ | $a_2$ | $a_3$ | $b_{14}$ | $b_{15}$ |
CD | $b_{21}$ | $b_{22}$ | $a_3$ | $a_4$ | $b_{25}$ |
DE | $b_{31}$ | $b_{32}$ | $b_{33}$ | $a_4$ | $a_5$ |
由于AB→C,找AB列(不是A、B列),发现每一行(元组)中AB组合没有相同的,跳过;
由于C→D,找C列,发现1、2行相同(只看C列),因此将D列的1行改为$a_4$;
由于D→E,找到D列,发现1、2、3行全部相同(只看D列),因此将E列的1、2行都改为$a_5$。
于是得到
分解的关系模式 | A | B | C | D | E |
---|---|---|---|---|---|
ABC | $a_1$ | $a_2$ | $a_3$ | $a_{4}$ | $a_{5}$ |
CD | $b_{21}$ | $b_{22}$ | $a_3$ | $a_4$ | $a_{5}$ |
DE | $b_{31}$ | $b_{32}$ | $b_{33}$ | $a_4$ | $a_5$ |
全部处理完,发现第一行(只需要考虑某一行即可)出现$a_1$、$a_2$、$a_3$、$a_4$、$a_5$,因此本次分解为无损连接分解。
无损且函数依赖分解
设关系模式$R(U,F)$,R上的属性集$U={A,B,C,D,E}$,函数依赖集$F={A→B,DE→B,CB→E,E→A,B→D}$,分解(D)是无损分解,并保持函数依赖的。
A.$p={R1(AC),R2(ED),R3(B)}$
B.$p={R1(AC),R2(E),R3(DB)}$
C.$p={R1(AC),R2(ED),R3(AB)}$
D.$p={R1(ABC),R2(ED),R3(ACE)}$
解析:选择题,答案是D。构造初始的判定表如下:
分解的关系模式 | A | B | C | D | E |
---|---|---|---|---|---|
R1(ABC) | $a_1$ | $a_2$ | $a_3$ | $b_{14}$ | $b_{15}$ |
R2(ED) | $b_{21}$ | $b_{22}$ | $b_{23}$ | $a_4$ | $a_5$ |
R3(ACE) | $a_1$ | $b_{32}$ | $a_3$ | $b_{34}$ | $a_5$ |
分析函数依赖集,由于:
- A→B,属性A的第1行和第3行相同,可以将第3行第2列,$b_{32}$改为$a_2$;
- E→A,属性E的第2行和第3行相同,可以将属性A第2行$b_{21}$改为$a_1$;
- CB→E,属性BC的第1行和第3行相同,可以将属性E第1行$b_{15}$改为$a_5$;
- B→D,属性B的第1行和第3行相同,属性D第1行$b_{14}$和第3行$b_{34}$没有一行为$a_4$,因此改为同一符号,即取行号值最小的$b_{14}$;
修改后的判定表如下:
分解的关系模式 | A | B | C | D | E |
---|---|---|---|---|---|
R1(ABC) | $a_1$ | $a_2$ | $a_3$ | $b_{14}$ | $a_{5}$ |
R2(ED) | $a_{1}$ | $b_{22}$ | $b_{23}$ | $a_4$ | $a_5$ |
R3(ACE) | $a_1$ | $a_{2}$ | $a_3$ | $b_{14}$ | $a_5$ |
需要进一步分析:
由于E→A且A→B且B→D,所以E→D,属性E的第1~3行相同。可以将属性D第1行$b_{14}$和第3行$b_{14}$改为$a_4$(软考答案给出的解析。没看懂!!!!)。修改后的判定表如下:
分解的关系模式 | A | B | C | D | E |
---|---|---|---|---|---|
R1(ABC) | $a_1$ | $a_2$ | $a_3$ | $a_{4}$ | $a_{5}$ |
R2(ED) | $a_{1}$ | $b_{22}$ | $b_{23}$ | $a_4$ | $a_5$ |
R3(ACE) | $a_1$ | $a_{2}$ | $a_3$ | $a_{4}$ | $a_5$ |
发现第一行或第三行,全为a,故分解无损。
若分解保持函数依赖,那么分解的子模式的函数依赖集
$F+=(F_{R1}+F_{R2}+F_{R3})+=(A→B,CB→A,E→D,E→A)^+$
参考
- 软考高级试题
- 百度百科