【学习笔记】数据库系统原理 第二章 关系数据库

以下内容为参考课件和《数据库系统概论》(第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 \} RS={ttRtS}

(2)差运算: R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S =\{t | t\in R \wedge t \notin S \} RS={ttRt/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={tt=<r,s>rRsS}

广义:做运算的不是单值,而是元组

(4)选择: σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = ′ 真 ′ } \sigma _F(R)=\{t | t \in R \wedge F(t) = '真'\} σF(R)={ttRF(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]tR},AR

即选取若干(属性集合为A)列,

(6)其他运算

  • 交运算: R ∩ S = R − ( R − S ) R\cap S=R-(R-S) RS=R(RS)

  • 连接:在笛卡尔积的基础上给定属性间关系做选择,即 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θBRS={tt=<r,s>rRsSr[A]θs[B]}=σAθB(R×S)

    • 自然连接(记为 R ⋈ S R\Join S RS):选取相同属性列上取值相等的元组,并去掉重复的属性列
    • 复合连接:自然连接运算结果去掉连接(所使用的)属性
    • 半连接: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]rRr[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]rRΠ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])\} {tuv(Student(u)SC(v)v[2]=1u[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)={tR(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])}RS={tR(t)S(t)}RS={tR(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=1u1=3))}

3、关系演算的安全性

无穷验证:若 t t t定义域无穷,则如 ( ∃ t ) ( Φ ( t ) ) (\exists t)(\Phi(t)) (t)(Φ(t))这样的式子会发生无穷验证。

而关系代数只要输入的集合是有穷的,运算结果就是有穷的

解决方法:定义域有穷,即只在一个有穷域中验证

小结:关系的操作是对集合的操作,有如下三类语言,其中两类已经在本章中介绍,SQL将在下一章介绍
请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值