以下内容为参考课件和《数据库系统概论》(第5版,王珊等著)的个人整理,若有错误欢迎指出
第二章 关系数据库
文章目录
从模型的组成元素角度,此依次介绍数据结构,完整性约束,基本操作(即关系代数、关系演算等)
一、关系模型数据结构的形式化定义
1、域(domain, D D D):一组具有相同数据类型的值的集合(一列)
2、笛卡尔积:构成行(一张表),每个元素是一个元组,但还没有约束
3、( n n n元)关系(relation, R ( D 1 , … … D n ) R(D_1,……D_n) R(D1,……Dn)):笛卡尔积的有限子集。限定:有意义,属性无序。
基本关系的性质:
- 列同质(每一列的分量来自同一个域),不同列可以出自同一个域
- 列的顺序无关紧要(可交换),行的顺序无关紧要
- 任意两个元组不能完全相同
- 每一个分量必须是不可再分的数据(即不可有复合、多值属性)
4、关系模式
关系的描述(一张表的结构),形式化地表示为 R ( U , D , d o m , F , I ) R(U,D,dom,F, I) R(U,D,dom,F,I),其中:
- R R R为关系名
- U U U为组成该关系的属性名集合
- D D D为属性集U所来自的域
- d o m dom dom为属性向域的映象集合
- F F F为属性间的数据依赖关系集合
- I I I为完整性约束集合。
关系模式通常可以简记作 R ( A 1 , A 2 , … , A n ) , A R(A_1 , A_2 ,…, A_n ),A R(A1,A2,…,An),A是属性 。
关系实例是关系模式在某一时刻的状态或内容。
5、关系数据库
在一个给定的应用领域中,所有实体及实体之间的联系的关系的集合(若干张表)构成一个关系数据库。
关系数据库的型称为关系数据库模式,是关系模式的集合,是对关系数据库的描述;值称为关系数据库实例,是关系实例的集合。
二、关系模型的完整性约束
1、相关概念
-
候选码:能唯一标识元组的属性集合(更严谨一些,还要最小性,即其子集不能满足条件)
全码:包含所有属性的候选码
-
主码:一个关系有多个候选码时,被选择的就是主码
-
主属性与非主属性:候选码中的诸属性是主属性,不包含在任何候选码中的属性是非主属性
-
外部码
设 F F F是基本关系 R R R的一个或一组属性,但不是 R R R的码。如果 F F F与基本关系 S S S的主码 K S K_S KS相对应,则称 F F F是关系 R R R的外部码(Foreign Key),并称 R R R为参照关系(Referencing Relation), S S S为被参照关系(Referenced Relation)或目标关系(Target Relation)。
一个帮助理解的例子:
对于两张表:学生(学号,……)、选课(学号,课程号,……)
学号不是选课表的码(选课表的码为(学号,课程号)),但它是学生表的主码,因此学号是选课表的外部码,学生表是被参照关系。也就是说外部码起到关联作用。
R R R和 S S S不一定是不同的关系。比如下图中的Cpno(先修课程号)也是外部码。
2、完整性约束
包含以下三个完整性:
-
实体完整性
主码中所包含的任意属性不能取空值。
-
参照完整性
如果关系 R 2 R_2 R2的外部码 F k F_k Fk与关系 R 1 R_1 R1的主码 P k P_k Pk相对应,则 R 2 R_2 R2中的每一个元组的 F k F_k Fk值或者等于 R 1 R_1 R1 中某个元组的 P k P_k Pk 值,或者为空值。
帮助理解的例子:
学生表的外部码系号,是系表的主码。那么在学生表中,系号的取值要么为空,要么是系表中有的值。不然没法参照。
-
用户定义的完整性
用户针对具体应用环境定义的约束条件,如某个属性的类型等
三、关系代数
1、关系代数运算符
集合运算中除了笛卡尔积外,要求参与运算的两个关系都是n元且对应属性的数据类型相同
2、基本运算
即其他运算可由以下五大基本运算完成
集合操作,都需要删除重复元素
(1)并运算: R ∪ S = { t ∣ t ∈ R ∧ t ∈ S } R\cup S =\{ t |t \in R \wedge t \in S \} R∪S={t∣t∈R∧t∈S}
(2)差运算: R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S =\{t | t\in R \wedge t \notin S \} R−S={t∣t∈R∧t∈/S}
(3)广义笛卡尔积: R × S = { t ∣ t = < r , s > ∧ r ∈ R ∧ s ∈ S } R \times S=\{ t | t=<r,s> \wedge r\in R\wedge s\in S \} R×S={t∣t=<r,s>∧r∈R∧s∈S}
广义:做运算的不是单值,而是元组
(4)选择: σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = ′ 真 ′ } \sigma _F(R)=\{t | t \in R \wedge F(t) = '真'\} σF(R)={t∣t∈R∧F(t)=′真′}
即选择满足条件的元组
F F F由逻辑运算符(与或非)连接算术表达式(属性名、常量、简单函数,及比较运算符)而成
(5)投影: Π A ( R ) = { t [ A ] ∣ t ∈ R } , A ⊆ R \Pi_A(R) = \{ t[A] | t\in R \} , A\subseteq R ΠA(R)={t[A]∣t∈R},A⊆R
即选取若干(属性集合为A)列,
(6)其他运算
-
交运算: R ∩ S = R − ( R − S ) R\cap S=R-(R-S) R∩S=R−(R−S)
-
连接:在笛卡尔积的基础上给定属性间关系做选择,即 R ⋈ S A θ B = { t ∣ t = < r , s > ∧ r ∈ R ∧ s ∈ S ∧ r [ A ] θ s [ B ] } = σ A θ B ( R × S ) \underset{A \theta B}{R\Join S}=\{t|t=<r, s> \wedge r\in R \wedge s\in S \wedge r[A] \theta s[B]\}=\sigma_{A \theta B}(R\times S) AθBR⋈S={t∣t=<r,s>∧r∈R∧s∈S∧r[A]θs[B]}=σAθB(R×S)
- 自然连接(记为 R ⋈ S R\Join S R⋈S):选取相同属性列上取值相等的元组,并去掉重复的属性列
- 复合连接:自然连接运算结果去掉连接(所使用的)属性
- 半连接:R与S的连接运算结果中只保留R的属性列。
- 外连接:自然连接中没连接的元组也保留在结果了,没有的属性值为NULL。(分为全、左、右外连接,即保留哪半边的)
-
除运算(笛卡尔积的逆运算)
象集(image set):关系 R ( X , Y ) R(X , Y) R(X,Y), X , Y X, Y X,Y是属性组, x x x是 X X X上的取值,定义 x x x在 R R R中的象集为 Y x = { r [ Y ] ∣ r ∈ R ∧ r [ X ] = x } Y_x = \{ r[Y] | r\in R \wedge r[X]= x \} Yx={r[Y]∣r∈R∧r[X]=x}。也就是选属性 X X X为 x x x的元组中其他属性分量(选择+投影操作)。
给定关系 R ( X , Y ) 和 S ( Y , Z ) R(X,Y)和S (Y,Z) R(X,Y)和S(Y,Z)( Y Y Y可以不同名但域一样),除运算 R ÷ S = { r [ X ] ∣ r ∈ R ∧ Π y ( S ) ⊆ Y x } R÷S=\{r[X]| r\in R\wedge\Pi_y(S) \subseteq Y_x\} R÷S={r[X]∣r∈R∧Πy(S)⊆Yx}。这定义了一个新的关系 P ( X ) P(X) P(X),是 R R R在 X X X下的投影,并且满足:在 R R R中 X X X的取值为 x x x的元组的 Y Y Y分量(也就是其象集),包含了 S S S中 Y Y Y分量的所有取值。
除运算还可以通过其他方式求得,如下图:
除运算实际应用的例子:找到选修全部课程的学生的学号, Π 学 号 , 课 程 号 ( 选 课 表 ) ÷ Π 课 程 号 ( 课 程 表 ) \Pi_{学号,课程号}(选课表)\div \Pi_{课程号}(课程表) Π学号,课程号(选课表)÷Π课程号(课程表)
细节:这里的投影是必要的,不然前者会要求其他属性也一样
四、关系演算
关系代数是对关系进行运算,而关系演算则是通过谓词来表示要求。
下面根据用来演算的变量类型分为元组和域关系演算:
1、元组关系演算
(1)元组关系演算表达式 { t ∣ Φ ( t ) } \{t|\Phi(t)\} {t∣Φ(t)}, t t t为元组, Φ \Phi Φ为公式
(2)公式的递归定义
原子公式有
R ( t ) R(t) R(t):关系 R R R中的一个元组 t t t
t [ i ] t[i] t[i]:元组 t t t的第 i i i个分量
公式以及连接符(或量词) ∧ ∨ ¬ ∃ ∀ \wedge\vee\neg\exists\forall ∧∨¬∃∀ 组成的也是公式
举例:
选课SC(学号、课程号),学生表Student(学号、姓名)。下面公式中出现的SC、Student是谓词,即SC(u)表示u是SC的元组。
选修了1号而没有选2号课程的学生号(元组作集合差) { t ∣ ( ∃ u ) ( S C ( u ) ∧ u [ 2 ] = 1 ∧ ¬ ( ∃ v ) ( S C ( v ) ∧ v [ 1 ] = u [ 1 ] ∧ v [ 2 ] = 2 ) ) ∧ t [ 1 ] = u [ 1 ] } \{t|(\exists u)(SC(u)\wedge u[2]=1 \wedge \neg(\exists v)(SC(v)\wedge v[1]=u[1]\wedge v[2]=2)) \wedge t[1]=u[1]\} {t∣(∃u)(SC(u)∧u[2]=1∧¬(∃v)(SC(v)∧v[1]=u[1]∧v[2]=2))∧t[1]=u[1]}
选修了1号课程的学生的姓名(元组作连接)
{ t ∣ ∃ u ∃ v ( S t u d e n t ( u ) ∧ S C ( v ) ∧ v [ 2 ] = 1 ∧ u [ 1 ] = v [ 1 ] ∧ t [ 2 ] = u [ 2 ] ) } \{t|\exists u \exists v (Student(u)\wedge SC(v)\wedge v[2]=1 \wedge u[1]=v[1] \wedge t[2]=u[2])\} {t∣∃u∃v(Student(u)∧SC(v)∧v[2]=1∧u[1]=v[1]∧t[2]=u[2])}
(3)元组关系演算和关系代数的等价性
证明五个基本运算都能用元组关系演算表示即可
Π i 1 , i 2 , … , i k ( R ) = { t k ∣ ( ∃ u ) ( R ( u ) ∧ t [ 1 ] = u [ i 1 ] ) ∧ . . . ∧ t [ k ] = u [ i k ] ) } σ F ( R ) = { t ∣ R ( t ) ∧ F } R × S = { t ( n + m ) ∣ ( ∃ u ( n ) ) ( ∃ v ( m ) ) ( R ( u ) ∧ S ( v ) ∧ t [ 1 ] = u [ 1 ] ∧ . . . ∧ t [ n ] = u [ n ] ∧ t [ n + 1 ] = v [ 1 ] ∧ . . . ∧ t [ n + m ] = v [ m ] ) } R ∪ S = { t ∣ R ( t ) ∨ S ( t ) } R − S = { t ∣ R ( t ) ∧ ¬ S ( t ) } \begin{aligned} &\Pi{i_1,i_2,…,i_k}(R) = \{t_k|(\exists u)(R(u)\wedge t[1] = u[i_1])\wedge...\wedge t[k] = u[i_k]) \}\\ &\sigma_F(R)= \{t|R(t)\wedge F \}\\ &R\times S = \{ t^{(n+m)}|(\exists u^{(n)})(\exists v^{(m)})(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\cup S=\{ t | R(t) \vee S(t)\}\\ &R-S=\{ t | R(t) \wedge \neg S(t)\}\\ \end{aligned} Πi1,i2,…,ik(R)={tk∣(∃u)(R(u)∧t[1]=u[i1])∧...∧t[k]=u[ik])}σF(R)={t∣R(t)∧F}R×S={t(n+m)∣(∃u(n))(∃v(m))(R(u)∧S(v)∧t[1]=u[1]∧...∧t[n]=u[n]∧t[n+1]=v[1]∧...∧t[n+m]=v[m])}R∪S={t∣R(t)∨S(t)}R−S={t∣R(t)∧¬S(t)}
2、域关系演算
基本形式 { t 1 . . t n ∣ Φ ( t 1 , . . . t n ) } \{t_1..t_n|\Phi(t_1, ...t_n)\} {t1..tn∣Φ(t1,...tn)}, t i t_i ti表示一个属性(域变量), Φ \Phi Φ是公式(公式定义也是类似的递归定义)
举例:(这里的SC表属性顺序为学号、课程号、成绩)
查找选修了1号或3号课程的学生的学号
{ t 1 ∣ ( ∃ u 1 ) ( ∃ u 2 ) ( S C ( t 1 u 1 u 2 ) ∧ ( u 1 = 1 ∨ u 1 = 3 ) ) } \{t_1|(\exists u_1)(\exists u_2)(SC(t_1u_1u_2)\wedge(u_1=1\vee u_1=3))\} {t1∣(∃u1)(∃u2)(SC(t1u1u2)∧(u1=1∨u1=3))}
3、关系演算的安全性
无穷验证:若 t t t定义域无穷,则如 ( ∃ t ) ( Φ ( t ) ) (\exists t)(\Phi(t)) (∃t)(Φ(t))这样的式子会发生无穷验证。
而关系代数只要输入的集合是有穷的,运算结果就是有穷的
解决方法:定义域有穷,即只在一个有穷域中验证
小结:关系的操作是对集合的操作,有如下三类语言,其中两类已经在本章中介绍,SQL将在下一章介绍