Bootstrap

关系数据库

1.关系数据库概述

1.1 基础知识

1)关系的相关名词术语

  • 关系:简单来说,就是一张二维表格。
  • 属性(Attribute):也称字段或列,在现实世界中,要描述一个事务常常取若干特征来表示。这些特征称为属性。例如学生用学号、姓名、性别、系别、年龄、籍贯等属性来描述。
  • 域(Domain):每个属性的取值范围所对应一个值的集合,称为该属性的域。如学号的域是6位整型数,姓名的域是10位字符,性别的域为{男,女}。 一般在关系数据模型中,对域还加了一个限制,所有的域都应是原子数据(at omicdata)。例如,整数、字符串是原子数据,而集合、记录、数组是非原子数据。关系数据模型的这种限制称为第一范式(first normal form,简称1NF)条件。但也有些关系数据模型突破了1NF的限制,称为非INF。
  • 元组:关系中的某一行记录。
  • 分量:某一条元组在字段上的某个值。
  • 目或度(Degree): D 1 × D 2 × . . . × D n D_1\times D_2\times ...\times D_n D1×D2×...×Dn的子集的称或关系模式作在域 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn上的关系,表示 R ( D 1 , D 2 , . . . , D n ) R(D_1,D_2,...,D_n) R(D1,D2,...,Dn)。这里的R表示关系的名字,n是关系的目或度。
  • 候选码(Candidate Key):若关系中的某一属性或属性组的值能唯一标识一个元组,则称该属性或属性组为候选码。
  • 主码(Primary Key):或称主键,若一个关系有多个候选码,则选定其中一个为主码。
  • 主属性(Prime attribute):包含在任何候选码中的属性称主属性。不包含在任何候选码中的属性称为非主属性(NonPrime attribute)。
  • 外码(Foreign key):如果关系模式R中的属性或属性组非该关系的码,但它是其他关系的码,那么该属性集对关系模式R而言是外码。如客户与贷款之间的借贷联系c-l(c-id,Loan-no),属性c-id是客户关系中的码,所以 c-id是外码,属性loan-no是贷款关系中的码,所以loan-no也是外码。
  • 全码(All key):关系模型的所有属性组是这个关系模式的候选码,称为全码。如R(T,C,S),属性T表示教师,属性C表示课程,属性S表示学生。

属性或字段加下划线表示该属性是主码,元组就是记录。

2)笛卡儿积与关系

定义1: D 1 , D 2 , D 3 , . . . , D n D_1,D_2,D_3,...,D_n D1,D2,D3,...,Dn为任意集合,定义 D 1 , D 2 , D 3 , . . . , D n D_1,D_2,D_3,...,D_n D1,D2,D3,...,Dn的笛卡尔积为
D 1 × D 2 × D 3 × . . . × D n = { ( d 1 , d 2 , d 3 , . . . , d n ) ∣ d i ∈ D i , i = 1 , 2 , 3 , . . . , n } D_1\times D_2\times D_3\times ...\times D_n=\{(d_1,d_2,d_3,...,d_n)|d_i\in D_i,i=1,2,3,...,n\} D1×D2×D3×...×Dn={(d1,d2,d3,...,dn)diDi,i=1,2,3,...,n}
其中集合的每个元素 ( d 1 , d 2 , d 3 , . . . , d n ) (d_1,d_2,d_3,...,d_n) (d1,d2,d3,...,dn)叫做一个n元组(n-tuple,即n个属性的元组),元素的每一个值 d i d_i di叫做元组一个分量。若 D i ( i = 1 , 2 , 3 , . . . , n ) 为有限集,其基数( C a r d i n a l n u m b e r , 元组的个数为 D_i(i=1,2,3,...,n)为有限集,其基数(Cardinal number,元组的个数为 Di(i=1,2,3,...,n)为有限集,其基数(Cardinalnumber,元组的个数为m_i(i=1,2,3,…,n) ,则 ,则 ,则D_1\times D_2\times D_3\times …\times D_n$的基数M为:

M = ∏ i = 1 n m i M=\prod\limits_{i=1}^{n}{m_i} M=i=1nmi

定义2: D 1 × D 2 × . . . × D n D_1\times D_2\times ...\times D_n D1×D2×...×Dn的子集的称作在域 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn上的关系,表示 R ( D 1 , D 2 , . . . , D n ) R(D_1,D_2,...,D_n) R(D1,D2,...,Dn),称为关系R为n元关系。

元数(属性的个数),基数(记录的条数)。

示例:若 D 1 = 0 , 1 , D 2 = a , b , D 3 = c , d D_1={0,1},D_2={a,b},D_3={c,d} D1=0,1,D2=a,b,D3=c,d,求解 D 1 × D 2 × D 3 D_1\times D_2\times D_3 D1×D2×D3,以及 D 1 × D 2 × D 3 D_1\times D_2\times D_3 D1×D2×D3的基数。

分析:根据定义1可知 D 1 × D 2 × D 3 D_1\times D_2\times D_3 D1×D2×D3中的每一个元素是一个三元组,其结果为:
D 1 × D 2 × D 3 = { ( 0 , a , c ) , ( 0 , a , d ) , ( 0 , b , c ) , ( 0 , b , d ) , ( 1 , a , c ) , ( 1 , a , d ) , ( 1 , b , c ) , ( 1 , b , d ) } D_1\times D_2\times D_3= \{(0,a,c),(0,a,d),(0,b,c),(0,b,d),(1,a,c),(1,a,d),(1,b,c),(1,b,d) \} D1×D2×D3={(0,a,c),(0,a,d),(0,b,c),(0,b,d),(1,a,c),(1,a,d),(1,b,c),(1,b,d)}
由于 D 1 D_1 D1的基数 m 1 = 2 m_1=2 m1=2 D 2 D_2 D2的基数 m 2 = 2 m_2=2 m2=2 D 3 D_3 D3的基数 m 3 = 2 m_3=2 m3=2,所以 D 1 × D 2 × D 3 D_1\times D_2\times D_3 D1×D2×D3的基数 M = m 1 × m 2 × m 3 = 8 M=m_1\times m_2\times m_3=8 M=m1×m2×m3=8,也可以用二维表来表示如下:

笛卡尔积结果

3)关系的类型

关系的三种类型如下:

  • 基本关系(通常又称为基本表或基表):实际存在的表,它是实际存储数据的逻辑表示。
  • 查询表:查询结果对应的表。
  • 视图表:是由基本表或其他视图表导出的表。由于它本身不独立存储在数据库中,数据库中只存放它的定义,所以常称为虚表。

1.2 关系模式

关系的描述称为关系模式(Relation Schema),可以表示为 R ( U , D , d o m , F ) 。其中, R 表示关系名, U 是组成该关系的属性名集合, D 是属性的域, d o m 是属性向域的影响集合常常直接说明属性的类型、长度, F 为属性间数据的依赖关系集合。也可以简记为 R(U,D,dom,F)。其中,R表示关系名,U是组成该关系的属性名集合,D是属性的域,dom是属性向域的影响集合常常直接说明属性的类型、长度,F为属性间数据的依赖关系集合。也可以简记为 R(U,D,dom,F)。其中,R表示关系名,U是组成该关系的属性名集合,D是属性的域,dom是属性向域的影响集合常常直接说明属性的类型、长度,F为属性间数据的依赖关系集合。也可以简记为R(U)或R(A_1,A_2,A_3,…,A_n)$,A_1,A_2,A_3,…,A_n为属性名或域名,通常在关系模式主属性上加下划线表示该属性为主码属性。

完整性规则提供了一种手段来保证当授权用户对数据库做修改时不会破坏数据的一致性。分类如下:

  • 实体完整性(Entity Integrity):规定基本关系R的主属性A不能取空值。
  • 参照完整性(Referential Integrity):也称引用完整性,关系与关系间的引用。属性上加实下画线,通常表示该属性为主码属性。属性上加虚下画线,通常表示该属性为外码属性。值必须为外码中某个元组的主码值或取空值。
  • 用户定义完整性(User defined Integrity):针对某一具体的关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求,有应用的环境决定。例如,银行的用户账户规定必须大于等于100000,小于999999。

2.关系运算

关系代数运算符有集合运算符、专门的关系运算符、算术比较符和逻辑运算符,如下:

关系代数

1)并(Union)

关系R与S的并由属于R或属于S的元组构成的集合组成,定义为 R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R\cup S=\{t|t\in R \vee t\in S\} RS={ttRtS},t为元组变量,R与S具有相同的关系模式(结构相同)

并
等价SQL:

SELECT A,B,C FROM R
UNION 
SELECT A,B,C FROM S;

2)差(Difference)

关系R与S的差由属于R但不属于S的元组构成的集合组成,定义为 R − S = { t ∣ t ∈ R ∧ t ∉ S } R - S=\{t|t\in R \wedge t\notin S\} RS={ttRt/S},t为元组变量,R与S具有相同的关系模式(结构相同)

差
等价SQL:

SELECT A,B,C FROM R
EXCEPT
SELECT A,B,C FROM S;

3)交(Intersection)

关系R与S的差由属于R同时又属于S的元组构成的集合组成,定义为 R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R \cap S=\{t|t\in R \wedge t\in S\} RS={ttRtS},t为元组变量,R与S具有相同的关系模式(结构相同)。也可以表示成 R ∩ S = R − ( R − S ) , 或者 R ∩ S = S − ( S − R ) R \cap S =R-(R-S), 或者R \cap S=S-(S-R) RS=R(RS),或者RS=S(SR)

交
等价SQL:

SELECT A,B,C FROM R
INTERSECT
SELECT A,B,C FROM S;

4)笛卡尔积(Extended Cartesian Product)

两个元数分别为n目和m目的关系R和S的广义笛卡尔积是一个(n+m)列的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组,形式定义 R × S = { t ∣ t = < t n , t m > ∧ t n ∈ R ∧ t m ∈ S } R \times S=\{t|t= < t^n,t^m > \wedge t^n\in R \wedge t^m \in S \} R×S={tt=<tn,tm>tnRtmS}。其中, < t n , t m > < t^n,t^m > <tn,tm>表示元组 t n 和 t m t_n和t^m tntm拼接成的一个元组,t为元组变量。

若R有 K 1 K_1 K1个元组,S有 K 2 K_2 K2个元组,则R和S的广义笛卡尔积有 K 1 × K 2 K_1 \times K_2 K1×K2个元组。

笛卡尔积
等价SQL:

SELECT * FROM R
CROSS JOIN S;

5)投影(projection)

投影是从垂直方向进行运算,在关系R中选择出若干属性列A组成新的关系,形式定义为 π A ( R ) = { t ∣ t [ A ] ∣ t ∈ S } \pi_A(R) =\{t|t[A]|t\in S\} πA(R)={tt[A]tS}

投影
等价SQL:

SELECT A,C FROM R;

6)选择(Selection)

选择运算是从关系的水平方向进行运算,是从关系R中选择满足给定条件的诸元组,形式定义为 σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = T r u e } \sigma_F(R)=\{t|t\in R \wedge F(t)=True\} σF(R)={ttRF(t)=True}

其中,F中的运算对象是属性名(或列的序号)或常数,运算符是算术比较符(<、≤、>、≥)和逻辑运算符( ∧ 、 ∨ 、 − \wedge、\vee、- )。例如, σ 1 ≥ 6 ( R ) \sigma_{1≥6}(R) σ16(R)表示选取R关系中第1个属性值大于等于第6个属性值的元组; σ 1 > 6 ( R ) \sigma_{1>6}(R) σ1>6(R)表示选取R关系中第1个属性值大于6的元组。

选择
等价SQL:

SELECT A,B,C FROM R WHERE A>B;

7)除(Division)

除运算是同时从关系的水平方向和垂直方向进行运算。给定关系R(X,Y)和S(Y,Z),X、Y、Z为属性组。 R ÷ S R\div S R÷S应当满足元组在X上的分量值 x x x的象集 Y x Y_x Yx包含关系S在属性组Y上投影的集合。形式定义为 R ÷ S = { t n [ X ] ∣ t n ∈ R ∧ π y ( S ) ⊆ Y x R\div S=\{t_n[X]|t_n\in R \wedge \pi_y(S) \subseteq Y_x R÷S={tn[X]tnRπy(S)Yx

其中, Y x 为 x Y_x为x Yxx在R的象集, x = t n [ X ] x=t_n[X] x=tn[X]。且 R ÷ S R\div S R÷S的结果集的属性组为X。

示例:已知R和S的关系,求 R ÷ S R\div S R÷S

除

分析:根据定义,Y为属性CD,X为属性AB, R ÷ S R\div S R÷S应当满足元组在AB上的分量值 x x x的象集 Y x Y_x Yx包含关系S在属性组CD上投影的集合。关系S在Y上的投影为 π y ( S ) = { ( c , d ) , ( e , f ) } \pi_y(S)=\{(c,d),(e,f)\} πy(S)={(c,d),(e,f)},属性组X(即AB)可以取3个值 { ( a , b ) , ( b , d ) , ( c , k ) } \{(a,b),(b,d),(c,k)\} {(a,b),(b,d),(c,k)}

  • 象集 C D ( a , b ) = { ( c , d ) , ( e , f ) , ( h , k ) } 象集CD_{(a,b)}=\{(c,d),(e,f),(h,k)\} 象集CD(a,b)={(c,d),(e,f),(h,k)}
  • 象集 C D ( b , d ) = { ( e , f ) , ( d , l ) } 象集CD_{(b,d)}=\{(e,f),(d,l)\} 象集CD(b,d)={(e,f),(d,l)}
  • 象集 C D ( c , k ) = { ( c , d ) , ( e , f ) } 象集CD_{(c,k)}=\{(c,d),(e,f)\} 象集CD(c,k)={(c,d),(e,f)}

由于上述象集包含 π y ( S ) 有 { ( a , b ) } 和 { ( c , k ) } \pi_y(S)有\{(a,b)\}和\{(c,k)\} πy(S){(a,b)}{(c,k)},所以 R ÷ S = { ( a , b ) , { ( c , k ) } R\div S=\{(a,b),\{(c,k)\} R÷S={(a,b),{(c,k)}$

8)连接(join)

  1. θ \theta θ连接

θ \theta θ连接是从R与S的笛卡尔积中选取属性间满足一定条件的元组,形式定义:

R ⋈ X θ Y S = { t ∣ t = < t n , t m > ∧ t n ∈ R ∧ t m ∈ S ∧ t n [ X ] θ t m [ Y ] } R \bowtie_{X\theta Y}S=\{t|t= < t^n,t^m > \wedge t^n \in R \wedge t^m \in S \wedge t^n[X] \theta t^m[Y]\} RYS={tt=<tn,tm>tnRtmStn[X]θtm[Y]}

其中, X θ Y X\theta Y Y为连接的条件, θ \theta θ是比较运算符,X和Y分别为R和S上度数相等,且可比的属性组。 t n [ X ] t^n[X] tn[X]表示R中 t n t^n tn元组的对应于属性X的一个分量。 t n [ Y ] t^n[Y] tn[Y]表示R中 t m t^m tm元组的对应于属性Y的一个分量。

还可以表示为 R ⋈ X θ Y S = σ X θ Y ( R × S ) R \bowtie_{X\theta Y}S=\sigma_{X\theta Y}(R\times S) RYS=σY(R×S)或者 R ⋈ i θ j S = σ i θ ( i + j ) ( R × S ) R \bowtie_{i\theta j}S=\sigma_{i\theta (i+j)}(R\times S) RiθjS=σiθ(i+j)(R×S)

连接
等价SQL:

SELECT * FROM R
CROSS JOIN S
WHERE R.A<S.B;
  1. 等值连接

θ \theta θ为“=”时,称为等值连接,形式定义为 R ⋈ X = Y S = { t ∣ t = < t n , t m > ∧ t n ∈ R ∧ t m ∈ S ∧ t n [ X ] = t m [ Y ] } R \bowtie_{X= Y}S=\{t|t= < t^n,t^m > \wedge t^n \in R \wedge t^m \in S \wedge t^n[X] = t^m[Y]\} RX=YS={tt=<tn,tm>tnRtmStn[X]=tm[Y]}

  1. 自然连接

自然连接时一种特殊的等值连接,要求两个关系中进行比较的分量必须是相同的属性组,并且在结果集中将重复属性去掉。形式定义:

R ⋈ S = { t ∣ t = < t n , t m ∗ > ∧ t n ∈ R ∧ t m ∈ S ∧ S . B 1 = R . B 1 ∧ R . B 2 = S . B 2 ∧ . . . ∧ R . B n = S . B n } R \bowtie_S=\{t|t= < t^n,t^{m^\ast} > \wedge t^n \in R \wedge t^m \in S \wedge S.B_1=R.B_1\wedge R.B_2=S.B_2\wedge ... \wedge R.B_n=S.B_n \} RS={tt=<tn,tm>tnRtmSS.B1=R.B1R.B2=S.B2...R.Bn=S.Bn}

其中 t n t_n tn表示关系R的元组变量, t m t_m tm表示关系S的元组变量。R和S具有相同的属性组B,且 B = ( B 1 , B 2 , . . . , B k ) B=(B_1,B_2,...,B_k) B=(B1,B2,...,Bk)。假定R的属性为 A 1 , A 2 , . . . , A n − k , B 1 , B 2 , . . . , B k A_1,A_2,...,A_{n-k},B_1,B_2,...,B_k A1,A2,...,Ank,B1,B2,...,Bk,假定S的属性为 B 1 , B 2 , . . . , B k , B k + 1 , B k + 2 , . . . , B m B_1,B_2,...,B_k,B_{k+1},B_{k+2},...,B_m B1,B2,...,Bk,Bk+1,Bk+2,...,Bm,S的元组变量去除重复属性B所组成新的元组为 t m ∗ t^{m^\ast} tm

自然连接
等价SQL:

select R.A,R.B,R.C,R.D
from R,S 
where R.A=S.A and R.C=S.C;

要求两个关系中进行比较的分量必须是相同的属性组并且在结果集中将重复属性列去掉。

9)外连接(outer join)

外连接是连接运算的扩展,可以处理缺失的信息。

外连接

  • 左外连接(left outer join)。取出左侧关系中所有与右侧关系中任一元组都不匹配的元组,用空值null填充所有来自右侧关系的属性。
    等价SQL:
SELECT R.A,R.B,R.C,S.D
FROM R
LEFT JOIN S 
ON R.B=S.B AND R.C=S.C;
  • 右外连接(right outer join)。取出右侧关系中所有与左侧关系中任一元组都不匹配的元组,用空值null填充所有来自左侧关系的属性。
    等价SQL:
SELECT R.A,S.B,S.C,S.D
FROM R
RIGHT JOIN S 
ON R.B=S.B AND R.C=S.C;
  • 完全外连接(full outer join)。完成左外连接和右外连接的操作。既填充左侧关系中所有与右侧关系中任一元组都不匹配的元组,又填充右侧关系中所有与左侧关系中任一元组都不匹配的元组,将产生的新元组加入自然连接的结果中。
    等价SQL:
SELECT R.A,R.B,R.C,S.D
FROM R
LEFT JOIN S 
ON R.B=S.B AND R.C=S.C
UNION 
SELECT R.A,S.B,S.C,S.D
FROM R
RIGHT JOIN S 
ON R.B=S.B AND R.C=S.C;

10)聚集函数

聚集函数输入一个值的集合,返回单一值作为结果。如集合12,4,6,8,10,15}。将聚集函数sum用于该集合时返回和45;将聚集函数avg用于该集合时返回平均值7.5;将聚集函数count用于该集合时返回集合中元数的个数6;将聚集函数min用于该集合时返回最小值2;将聚集函数max用于该集合时返回最大值15。

3.元组演算

表现形式为 { t ∣ P ( t ) } \{t|P(t)\} {tP(t)}。其中,t是元组变量, P ( t ) P(t) P(t) 是元组关系演算公式,公式是由原子公式组成的。

原子公式有如下三种形式:

  1. R ( t ) R(t) R(t)。R是关系名,t是元组变量,表示命题为“t是关系R的一个元组”。
  2. t [ i ] θ C 或 C θ t [ i ] t[i]\theta C 或C\theta t[i] t[i]θCCθt[i] t [ i ] t[i] t[i]表示元组变量t的第i个分量,C是常量, θ \theta θ为算术比较运算符。表示命题为“元组变量t的第i个分量与C直接满足 θ \theta θ运算“。如 t [ 3 ] < ′ 8 ′ t[3]<'8' t[3]<8表示t的第三个分量小于8。
  3. t [ i ] θ u [ j ] t[i]\theta u[j] t[i]θu[j]。t、u是两个元组变量,表示命题为“元组变量t的第i个分量与元组变量u的第j个分量直接满足 θ \theta θ运算”。如 t [ 2 ] ≥ u [ 4 ] t[2]\geq u[4] t[2]u[4]表示t的第二个分量大于等于u的第四个分量。

若一个公式中的一个元组变量前有全称量词 ∀ \forall 或存在量词 ∃ \exists 符号,则称该变量为约束变量,否则称之为自由变量。公式可递归定义:

  • 原子公式是公式。
  • 如果是 φ 1 \varphi_1 φ1 φ 2 \varphi_2 φ2公式,那么, ¬ φ 1 、 φ 1 ∨ φ 2 、 φ 1 ∧ φ 2 、 φ 1 ⇒ φ 2 \lnot \varphi_1、\varphi_1 \vee \varphi_2、\varphi_1 \wedge \varphi_2、\varphi_1 \Rightarrow \varphi_2 ¬φ1φ1φ2φ1φ2φ1φ2 也都是公式。分别表示命题: ¬ φ 1 \lnot \varphi_1 ¬φ1表示“ φ 1 \varphi_1 φ1不是真“; φ 1 ∨ φ 2 \varphi_1 \vee \varphi_2 φ1φ2表示“ φ 1 \varphi_1 φ1 φ 2 \varphi_2 φ2 φ 1 和 φ 2 \varphi_1和\varphi_2 φ1φ2为真”; φ 1 ∧ φ 2 \varphi_1 \wedge \varphi_2 φ1φ2表示“ φ 1 \varphi_1 φ1 φ 2 \varphi_2 φ2都为真”; φ 1 ⇒ φ 2 \varphi_1 \Rightarrow \varphi_2 φ1φ2表示“若 φ 1 \varphi_1 φ1为真则 φ 2 \varphi_2 φ2为真”。
  • 如果是 φ 1 \varphi_1 φ1公式,那么, ∃ t ( φ 1 ) \exists t(\varphi_1) t(φ1)是公式。表示命题为“若有一个t使 φ 1 \varphi_1 φ1为真,则 ∃ t ( φ 1 ) \exists t(\varphi_1) t(φ1)为真,否则 ∃ t ( φ 1 ) \exists t(\varphi_1) t(φ1)为假”。
  • 如果是 φ 1 \varphi_1 φ1公式,那么, ∀ t ( φ 1 ) \forall t(\varphi_1) t(φ1)是公式。表示命题为“若对所有t使 φ 1 \varphi_1 φ1为真,则 ∀ t ( φ 1 ) \forall t(\varphi_1) t(φ1)为真,否则 ∀ t ( φ 1 ) \forall t(\varphi_1) t(φ1)为假”。

公式中运算符优先级(低到高):算术比较运算符 θ \theta θ ∃ \exists ∀ \forall ¬ \lnot ¬ ∧ \wedge ∨ \vee ⇒ \Rightarrow 。加括号时,括号中的运算符优先。

关系代数转化为元组演算:

  1. 并。 R ∪ S = { t ∣ R ( t ) ∨ S ( t ) } R\cup S=\{t|R(t) \vee S(t)\} RS={tR(t)S(t)}
  2. 差。 R − S = { t ∣ R ( t ) ∧ ¬ S ( t ) } R - S=\{t|R(t) \wedge \lnot S(t)\} RS={tR(t)¬S(t)}
  3. 笛卡尔积。 R × S = { t ∣ ( ∃ u ) ( ∃ v ) ( R ( u ) ∧ S ( v ) ∧ t [ 1 ] = u [ 1 ] ∧ . . . ∧ t [ n ] = u [ n ] ∧ t [ n + 1 ] = v [ 1 ] ∧ . . . ∧ t [ n + m ] = v [ m ] ) } R \times S=\{t|(\exists u)(\exists v)(R(u)\wedge S(v)\wedge t[1]=u[1]\wedge ... \wedge t[n]=u[n]\wedge t[n+1]=v[1]\wedge ... \wedge t[n+m]=v[m])\} R×S={t(u)(v)(R(u)S(v)t[1]=u[1]...t[n]=u[n]t[n+1]=v[1]...t[n+m]=v[m])}
  4. 投影。 π i 1 , i 2 , . . . , i k ( R ) = { t ∣ ( ∃ u ) ( R ( u ) ∧ t [ 1 ] = u [ i 1 ] ∧ t [ 2 ] = u [ i 2 ] ∧ . . . ∧ t [ k ] = u [ i k ] } \pi_{i_1,i_2,...,i_k}(R) =\{t|(\exists u)(R(u)\wedge t[1]=u[i_1]\wedge t[2]=u[i_2]\wedge ... \wedge t[k]=u[i_k]\} πi1,i2,...,ik(R)={t(u)(R(u)t[1]=u[i1]t[2]=u[i2]...t[k]=u[ik]}
  5. 选择。 σ F ( R ) = { t ∣ R ( t ) ∧ F } \sigma_F(R)=\{t|R(t) \wedge F\} σF(R)={tR(t)F}

4.查询优化

查询处理是从数据库中提取数据的一系列活动。
查询处理的代价:总代价=I/O代价+CPU代价+内存代价(多用户环境)。
查询优化:为查询选择最有效的查询计划的过程。

优化的准则:

  • 提早执行选取运算。
  • 合并乘积与其后的选择运算为连接运算。
  • 将投影运算与其后的其他运算同时进行,以避免重复扫描关系。
  • 将投影运算和其前后的二木运算结合起来,使得没有必要为去掉某些字段再扫描一遍关系。
  • 在执行连接前对关系做适当的预处理,就能快速地找到要连接的元组。方法有两种:索引连接法、排序合并连接法。
  • 存储公共子表达式。

5.关系数据库设计基础理论

5.1 基础知识

关系数据库设计的目标是生成一组合适的、性能良好的关系模式,以減少系统中信息存储的冗余度,但又可方便地获取信息。

数据依赖是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系,是现实世界属性间联系和约束的抽象,是数据内在的性质,是语义的体现。函数依赖则是一种最重要、最基本的数据依赖。

函数依赖:设R(U)是属性集U上的关系模式,X和Y是U的子集。若R(U)的任何一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的值不等,则称X函数决定Y或Y函数依赖于X,记作X->Y。

  • 如果X->Y,但 Y ⊊ X Y\subsetneq X YX,则称X->Y是非平凡的函数依赖。如(Sno,Cno)->Sno。
  • 如果X->Y,但 Y ⊆ X Y\subseteq X YX,则称X->Y是平凡的函数依赖。如(Sno,Cno)->Grade。

任何可能的关系:若X->Y,则X叫做决定因子;若X->Y,Y->X,则记做X<–>Y;若Y函数不依赖于X,则记作 X ≠ > Y X \neq> Y X=>Y

常见的函数依赖:

  • 完全函数依赖:在R(U)中,设X->Y,且对于X的任何一个真子集 X ′ X^{'} X,都有 X ′ X^{'} X不能决定Y,则称Y对X完全函数依赖。如(Sno,Cno)->Grade,但 S n o ≠ > G r a d e Sno \neq> Grade Sno=>Grade
  • 部分函数依赖:在R(U)中,设X->Y,但Y不完全依赖于X,则称Y对X部分函数依赖。
  • 传递函数依赖:在R(U,F)中,如果X->Y, Y ⊊ X , Y ≠ > X Y\subsetneq X,Y \neq> X YXY=>X,Y->Z,则称Z对X传递函数依赖。如Sno->Sdept、Sdept->Mname,则Sno->Mname。

多值函数依赖:在R(U,F)中,其属性集为U。X、Y、Z是U的子集,并且Z=U-X-Y。当且仅当对R(U)的任何一个关系r,给定一对(x,z)的值,这组值仅仅决定于x值而与z值无关,则称“Y多值依赖于X”或“X多值决定Y”,记X->->Y。

多值依赖具有6种性质

  • 具有对称性。若X->->Y,则X->->Z,其中Z=U-X-Y。
  • 传递性。若X->->Y,Y->->Z,则X->->Z-Y。
  • 函数依赖可以看成是多值依赖的特殊情况。
  • 若X->->Y,Y->->Z,则X->->YZ。
  • 若X->->Y,Y->->Z,则X->-> Y ∩ Z Y\cap Z YZ
  • 若X->->Y,Y->->Z,则X->->Z-Y。

Armstrong 公理系统:设关系模式R(U,F),其中U为属性集,F是U上的一组函数依赖,那么有一下推理规则:

  • 自反律:若 Y ⊆ X ⊆ Z Y\subseteq X\subseteq Z YXZ,则X->Y为F所逻辑蕴含。
  • 增广率:若X->Y为F所逻辑蕴含,且 Z ⊆ U Z\subseteq U ZU,则XZ->YZ为F所逻辑蕴含。
  • 传递率:若X->Y和Y-Z为F所逻辑蕴含,则X->Z为F所逻辑蕴含。
  • 合并规则:若X->Y,X->Z,则X->YZ为F所蕴含。
  • 传递递率:若X->Y,WY->Z,则XW->Z为F所蕴含。
  • 分解规则:若X->Y, Z ⊆ Y Z\subseteq Y ZY,则X->Z为F所蕴含。

最小函数依赖集:如果函数依赖集F满足下列条件,则称F为一个最小函数依赖集,或极小哈书依赖集或最小覆盖。

  • F种任一函数依赖的右部仅有一个属性,即无多余的属性。
  • F种不存在这样的函数依赖X->A,使得F与 F − { X − A } F-\{X-A\} F{XA}等价,即无多余的函数依赖。
  • F种不存在这样的函数依赖X->A,X有真子集Z使得F与 F − { X − > A } ∪ { Z − > A } F-\{X->A\}\cup \{Z->A\} F{X>A}{Z>A},即去掉各函数依赖左边的多余属性。即不存在部分函数依赖。

函数闭包:在关系模式R(U,F)中被F逻辑蕴含的函数依赖的全体构成的集合称F闭包,记作 F + F^{+} F+

求候选码:用图解法确定候选码

  1. 将关系的函数依赖关系,用“有向图”的方式表示。
  2. 找出入度为0的属性,并以该属性集合为起点,尝试遍历有向图,若能正常遍历图中所有结点,则该属性集即为关系模式的候选键。
  3. 若入度为0的属性集不能遍历图中所有结点,则需要尝试性的将一些中间结点(既有入度,也有出度的结点)并入入度为0的属性集中,直至该集合能遍历所有结点,集合为候选键。

示例1:给定关系R(A1,A2,A3,A4)上的函数依赖集F={A1->A2,A2->A3,A3->A2,A2->A4},R的候选关键字为A1。

示例2:关系R(A,B,C)满足下列函数依赖:F{B->C,B->A,A->BC},关系R的候选键为A和B。

5.2 规范化

示例:First(Sno,Sname,Status,City,Pno,Qty),F={Sno->Sname,Sno->Status,Status->City,(Sno,Pno)->Qty}

1)1NF(第一范式)

若关系模式R中,每个数据项都是不可再分的,则称R属于第一范式,简称1NF,记作 R ∈ 1 N F R\in 1NF R1NF

1NF存在4个问题:

  • 冗余度大。部分列可进行再分,部分列代表的信息量大。
  • 引起修改操作的不一致性。由于部分列数据行数相同,进行更新会引起不一致。
  • 插入异常。主码不能取空值或部分为空值,当插入时会异常。
  • 删除异常。如果某个产品不销售了,删除后无法再找回该产品,但是该产品客观存在。

2)2NF(第二范式)

若关系模式 R ∈ 1 N F R\in 1NF R1NF,并且每一个非主属性都完全依赖于R的码,则称R属于第二范式,简称2NF,记作 R ∈ 2 N F R\in 2NF R2NF。也就是说,1NF基础上消除了非主属性对码的部分函数依赖。主要进行分解关系模式。如First关系分解为First1(Sno,Sname,Status,City)和First2(Sno,Pno,Qty)。

3)3NF(第三范式)

若关系模式R(U,F)中不存在这样的码X,属性组Y及非属性Z( Z ⊊ Y Z\subsetneq Y ZY)使得X->Y,(YKaTeX parse error: Undefined control sequence: \eq at position 1: \̲e̲q̲>X)Y->Z,则关系模式 R ∈ 3 N F R\in 3NF R3NF2NF基础上消除了非主属性对码的传递函数依赖,则称3NF。由于First1中有Sno->Status,Status->City存在传递,First1分解为First11(Sno,Sname,Status)和First12(Status,City)。

产生冗余和异常的两个重要原因是部分依赖和传递依赖。因为3NF模式中不存在非主属性对码的部分函数依赖和传递函数依赖,所以具有较好的性能。

4)BCNF(Boyce Codd Normal Form,巴克斯范式)

关系模式 R ∈ 1 N F R\in 1NF R1NF,若X->Y且 Y ⊊ X Y\subsetneq X YX时,X必含有码,则关系模式 R ∈ B C N F R\in BCNF RBCNF。也就是说,当3NF消除了主属性对码的部分函数依赖和传递函数依赖,则称为BCNF。

性质如下:

  • 所有非主属性对每个码都是完全函数依赖。
  • 所有主属性对每一个不包含它的码,也是完全函数依赖。
  • 没有任何属性完全函数依赖于非码的任何一组属性。

示例:设R(Pno,Pname,Mname)的属性分别表示零件号、零件名和厂商名,如果约定,每种零件号只有一个零件名,但不同的零件号可以有相同的零件名;每种零件可以有多个厂商生产,但每家厂商生产的零件应有不同的零件名。这样我们可以得到如下一组函数依赖:Pno->Pname,(Pname,Mname)->Pno。

该关系模式R的候选码为(Pname,Mname)或(Pno,Mname),属性都是主属性,不存在非主席对码的传递依赖,是3NF,但主属性传递依赖于码(Pname,Mname),不是BCNF,可以分解成R1(Pno,Pname)和R2(Mname)。

5)4NF(第四范式)

关系模式 R ∈ 1 N F R\in 1NF R1NF,若对于R的每个非平凡多值依赖X->->Y且 Y ⊊ X Y\subsetneq X YX时,X必含有码(不为空),则关系模式 R ( U , F ) ∈ 4 N F R(U,F)\in4NF R(U,F)4NF4NF是限制关系模式的属性间不允许有非平凡且非函数依赖的多值依赖。如x、y、z,x–> y,z 为空集,则为平凡多值依赖,反之为非平凡多值依赖。

5.3 模式分解

分解:关系模式R(U,F)的一个分解 ρ = { R 1 ( U 1 , F 1 ) , R 2 ( U 2 , F 2 ) , . . . , R n ( U n , F n ) } \rho=\{R_1(U_1,F_1),R_2(U_2,F_2),...,R_n(U_n,F_n)\} ρ={R1(U1,F1),R2(U2,F2),...,Rn(Un,Fn)},其中, U = ⋃ i = 1 n U i U=\bigcup\limits_{i=1}^nU_i U=i=1nUi,并且没有 U i ⊆ U j ( 1 ≤ i , j ≤ n ) U_i\subseteq U_j(1 \leq i ,j \leq n) UiUj(1i,jn) F i F_i Fi是F在 U i U_i Ui上的投影, F i = { X − > Y ∈ F + ∧ X Y ⊆ U i F_i=\{X->Y\in F_{+} \wedge XY \subseteq U_i Fi={X>YF+XYUi

分解成n个关系,分解的属性都要在子表中,并且子表没有交叉关系,

对一个给定的模式进行分解,使得分解后的模式是否与原来的模式等价有三种情况:

  • 分解具有无损连接性。
  • 分解要保持函数依赖。
  • 分解既要无损连接性,又要保持函数依赖。

示例:关系模式Std(Sno,Sdept,Mname),其属性组上的函数依赖集是F={Sno->Sdept,Sdept->Mname}
a) R11(Sno,Mname)和R12(Sdept,Mname)
b) R21(Sno,Sdept)和R22(Sno,Mname)
c) R31(Sno,Sdept)和R32(Sdept,Mname)
d) R41(Sno)、R42(Sdept)和R43(Mname)

无损连接:关系模式R(U,F)分解为关系模式 ρ = { R 1 ( U 1 , F 1 ) , R 2 ( U 2 , F 2 ) , . . . , R n ( U n , F n ) } \rho=\{R_1(U_1,F_1),R_2(U_2,F_2),...,R_n(U_n,F_n)\} ρ={R1(U1,F1),R2(U2,F2),...,Rn(Un,Fn)},如果对于R的每一个满足F的具体关系r,都有 r = π R 1 ( r ) × π R 2 ( r ) × . . . × π R n ( r ) r=\pi_{R_1}(r)\times\pi_{R_2}(r)\times... \times \pi_{R_n}(r) r=πR1(r)×πR2(r)×...×πRn(r),即r在 R 1 , R 2 , . . . R n R_1,R_2,...R_n R1,R2,...Rn上投影的自然连接等于r,则称分解 ρ \rho ρ具有无损连接。分解后的每个表合并后记录数和列不变,具有无损连接的充分必要条件 U 1 ∩ U 2 − > U 1 − U 2 ∈ F + 或 U 1 ∩ U 2 − > U 2 − U 1 ∈ F + U_1\cap U_2 -> U_1-U_2 \in F^{+}或U_1\cap U_2 -> U_2-U_1 \in F^{+} U1U2>U1U2F+U1U2>U2U1F+

保持函数依赖:关系模式R(U,F)分解为关系模式 ρ = { R 1 ( U 1 , F 1 ) , R 2 ( U 2 , F 2 ) , . . . , R n ( U n , F n ) } \rho=\{R_1(U_1,F_1),R_2(U_2,F_2),...,R_n(U_n,F_n)\} ρ={R1(U1,F1),R2(U2,F2),...,Rn(Un,Fn)},如果 F + = ( F 1 ⋃ F 2 ⋃ . . . ⋃ F n ) + F^{+}=(F_1\bigcup F_2\bigcup ... \bigcup F_n)^{+} F+=(F1F2...Fn)+,即F所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖 F i F_i Fi逻辑蕴含,则称分解 ρ \rho ρ是保持函数依赖。

分解具有无损连接性和分解具有保持函数依赖是两个相互独立的标准。具有无损连接性的分解不一定保持函数依赖。保持函数依赖的分解也不一定具有无损连接性。

示例1:关系模式Std(Sno,Sdept,Mname),其属性组上的函数依赖集是F={Sno->Sdept,Sdept->Mname}

  • a) R11(Sno,Mname)和R12(Sdept,Mname)。 F 1 ⋃ F 2 = { S n o − > M n a m e , S d e p t − > M n a m e } F_1\bigcup F_2=\{Sno->Mname,Sdept->Mname\} F1F2={Sno>Mname,Sdept>Mname},无Sno->Mname,不保持函数依赖。
  • b) R21(Sno,Sdept)和R22(Sno,Mname) 。分析: U 1 ∩ U 2 = S n o → U 1 − U 2 = S d e p t U_1\cap U_2=Sno \rightarrow U_1-U_2=Sdept U1U2=SnoU1U2=Sdept,具有无损连接性。
  • c) R31(Sno,Sdept)和R32(Sdept,Mname)。分析: U 1 ∩ U 2 = S d e p t → U 2 − U 1 = M n a m e , U 1 − U 2 = S n o U_1\cap U_2=Sdept \rightarrow U_2-U_1=Mname,U_1-U_2=Sno U1U2=SdeptU2U1=MnameU1U2=Sno,具有无损连接性。 F 1 ⋃ F 2 = { S n o − > M n a m e , S d e p t − > M n a m e } F_1\bigcup F_2=\{Sno->Mname,Sdept->Mname\} F1F2={Sno>Mname,Sdept>Mname},都有,则保持函数依赖。
  • d) R41(Sno)、R42(Sdept)和R43(Mname)。

示例2:设关系模式R(U,F),其中U={A,B,C,D,E},F={A->BC,C->D,BC->E,E->A},则分解成 ρ = \rho= ρ={R1(ABCE),R2(CD)}满足具有无损连接和保持函数依赖。

分析: U 1 ∩ U 2 = C → U 1 − U 2 = A B E o r U 2 − U 1 = D U_1\cap U_2=C \rightarrow U_1-U_2=ABE or U_2-U_1=D U1U2=CU1U2=ABEorU2U1=D,具有无损连接性。F中的决定在分解的子表都存在。

;