# 关系模型 & 关系运算

# 关系模型概述

  • ✏️ 关系模型是从 Table 表及表的处理方式中抽象出来的, 在对传统表及其操作进行数学化定义的基础上, 引入 "集合理论" 和 "逻辑学理论" 提出的;
  • SQL 语言建立在关系模型的基础上;
  • 关系模型由三个部分组成:
    • 描述表的基本结构形式;
    • 描述表与表之间可以发生的各种操作 (关系运算);
    • 描述这些操作应遵守哪些约束条件 (完整性约束);

# 什么是关系

# 关系的定义

在关系模型中, 关系也被称为表 Table;

2020-05-24-18-34-50

在表中,『 』的取值范围被称为『 域 Domain 』:

  • 域是一组值的集合, 这组值有相同的数据类型;
  • 集合中元素的个数称为域的『 基数 Cardinality 』

2020-05-24-18-37-39

从每列各自的域中取出一个值, 可以组成表中的一行, 也就是一个『 元组 』;

  • 元组 (d1,d2,...,dn)(d_1, d_2, ..., d_n) 中任意一个值 did_i 叫做一个『 分量 Component

每个域中任取一个值所可能构成的组合的集合, 是一个『 笛卡尔积

  • 笛卡尔积是由 nn 个域形成的所有可能的 nn-元组的集合;
  • DiD_i 的基数是 mim_i, 则笛卡尔积的基数 (包含元素的个数) 是 m1m2...mnm_1 * m_2 * ... * m_n

2020-05-24-19-56-46 2020-05-24-18-41-01


✏️ 笛卡尔积中的所有元组, 并不都是有意义的. 其中有意义的元组的组合构成一个关系

  • 也就是, 关系是一组域的笛卡尔积的子集;

🌰 例如, 下面右边的表, 从左边的笛卡尔积中抽取出了符合 "家庭" 关系的元组;

  • 笛卡尔积中的 "男人", "女人", "儿童" 是 "域名", 下面对应的所有值是 "域值", 所有的域值构成了表中对应列的取值范围;
  • 表中 "丈夫", "妻子", "子女" 是 "列/属性名", 下面对应的值是 "列/属性值";

2020-05-24-20-06-32

关系可用 R(A1:D1,A2:D2,...An:Dn)R(A_1:D_1, A_2:D_2, ... A_n:D_n) 表示, 也可简化为 R(A1,A2,...An)R(A_1, A_2, ... A_n), 这种描述被称为『 关系模式 Schema 』或『 表标题 Head 』

  • R 是关系的名字;
  • AiA_i 是属性;
  • DiD_i 是属性对应的域;
  • nn 是关系的『 度 Degree 』或『 目 』
  • 关系中元组的数目称为关系的『 基数 』

🌰 上面的例子中的关系可以描述为: "家庭(丈夫:男人, 妻子:女人, ... 子女:儿童)" 或者 "家庭(丈夫, 妻子, ... 子女)"


关系模式 & 关系:

  • 同一关系模式下, 可能有很多的关系;
  • 关系模式时关系的结构, 关系是关系模式在某一时刻的数据;
  • 关系会随着我们对于表中数据的增删改而变化;

🌰 下图表现了同一个关系模式, 但是不同关系的情况:

2020-05-24-20-20-19

# 关系的特性

  • 列是同质的, 表中每一列中数据值属于同一域, 是同一类型的数据;
  • 不同的列可以来自同一个域, 但表中每个列都具备不同的列名;

关系之间是以内容来区别的, 而不是列或行的位置:

  • 列位置互换性: 区分哪一列靠列名;
  • 行位置互换性: 区分哪一行靠某个或某几个列的值;

属性不可再分:

  • 每一列的属性是单一的, 不可再分的;
  • 也称为『 关系第一范式 』;

🌰 例如, 由下角的 name 属性还可以分成 inamefname 这就是不符合第一范式了;

2020-05-24-22-55-04

# 候选码/候选键

  • 关系中的一个属性或一组属性, 其值能唯一标识一个元组, 若从该组属性中去掉任意一个属性, 它就不具备这一性质了, 这样是属性组称作『 候选码
  • 候选码, 也称为『 候选键 』
  • 🌰 例如, 公民身份信息表中, 身份证号可以作为候选码;
  • 候选码可以作为表的『 主键 Primary Key
  • DBMS 以主键作为主要线索管理表中的各个记录;

主属性 & 非主属性:

  • 包含在任何一个候选码中的属性被称作『 主属性 』
  • 其他的属性叫做『 非主属性 』
  • 假如关系中的所有属性都可以作为关系的候选码, 那这称为『 全码 All-Key 』关系;

  • 假如关系 RR 的单一非主属性或非主属性组, 与另外一个关系 SS 的候选码相对应, 则称这个属性/属性组为 RR 的『 外键 Foreign Key
  • 外键也称为『 外码 』
  • 两个关系通常靠外键连接起来;

# 关系模型中的完整性约束

# 实体完整性

  • 关系的主码中的属性值不能是空值;
  • 空值: 不存在, 无意义的值;
  • 关系中的元组是对应到现实世界上相互之间可以区分的一个个个体, 这些个体通过主码来唯一标识. 若主码为空, 则会出现不可表示你的个体, 这是不允许的;

# 参照完整性

  • 如果关系 RR 的外键与关系 SS 的主键相对应, 则 RR 中的每一个元组的外键值要么等于 SS 中的某个元组的主键值, 要么是空值;
  • 因为如果关系 RR 中的某个元组参照了关系 SS 的某个元组, 那么这个元组在关系 SS 中必须存在;

# 用户自定义完整性

  • 用户针对具体的应用环境定义的完整性约束条件;

2020-05-25-00-08-36

# 关系代数

  • 基于集合, 提供了一系列关系代数操作;
  • 关系代数操作以一个或多个关系为输入, 结果是一个新的关系;
  • 使用关系的运算来表达查询, 运算具有过程性 (一步一步地算出来);
  • 关系代数是一种抽象的语言, 是学习数据库语言的基础;

# 基本操作

  • 在计算机中, 我们把基础的逻辑动作 "与", "或", "非" 抽象成计算机能够执行的 "AND", "OR", "NOT" 指令;
  • 之后用抽象出来的基本指令组合编写复杂的动作, 也就是程序;
  • 计算机能够解释复杂组合的动作, 并且按照次序去执行它里面包含的基本动作;

2020-05-25-09-36-25

对于关系代数操作来讲, 也有基本动作:

  • 并 Union ;
  • 差 Difference -;
  • 笛卡尔积 Cartesian Product ××;
  • 选择 Select σσ;
  • 投影 Project ΠΠ;

2020-05-25-09-38-46

  • 将基本动作抽象成指令, 然后用算法去实现;
  • 通过组合基本动作可以实现更复杂的关系代数操作;
  • DBMS 可以解释并执行组合起来的复杂关系代数操作;

# 并相容性

  • 某些关系代数操作, 例如, "并", "差", "交" 等, 需要满足『 并相容性 』
  • 并相容性: 参与运算的两个关系及其属性之间有一定的对应性, 可比性, 或意义关联性;
  • 定义: 关系 RR 与关系 SS 存在相容性, 当且仅当:
    • 关系 RR 和 关系 SS 的属性数目必须相同;
    • 对于任意 ii, 关系 RR 的第 ii 个属性的域必须和关系 SS 的第 ii 个属性的域相同;

🌰 例如, 假设有关系 R(A1,A2,...,An)R(A_1, A_2, ... , A_n)S(B1,B2,...,Bn)S(B_1, B_2, ... , B_n), 如果 RRSS 满足并相容性:

  • n=mn = m;
  • Domain(Ai)=Domain(Bi)Domain(A_i) = Domain(B_i);

🌰 下面的 STUDENT 关系和 PROFESSOR 关系也是相容的:

2020-05-25-10-23-34

# 并操作 Union

  • 假设关系 RRSS 是并相容的, 则关系 RRSS 的并运算结果也是一个关系;
  • 记作: RSR ∪ S;
  • 它由或者出现在关系 RR 中, 或者出现的 SS 中的元素组成;
  • 数学描述: RS={ttRtS}R ∪ S = \{t | t ∈ R ∨ t ∈ S\}, tt 是并运算结果中的元组;
  • 日常语言中, "或者 ... 或者 ..." 通常表达的是并运算;

2020-05-25-10-32-21

2020-05-25-10-33-00

2020-05-25-10-33-24

# 差操作 Difference

  • 假设关系 RRSS 是并相容的, 则关系 RRSS的差运算结果也是一个关系;
  • 记作 RSR - S;
  • 它由出现在关系 RR 中, 但是不出现在关系 SS 中的元组构成;
  • 数学描述 RS={ttRtS}R - S = \{t | t ∈ R ∧ t ∉ S \}
  • RSR - SSRS - R 是不同的;

2020-05-25-10-38-24

2020-05-25-10-39-47

2020-05-25-10-40-01

# 笛卡尔积操作 Cartesian Product

  • 关系 RRSS 的笛卡尔积运算结果也是一个关系;
  • 记作: R×SR × S;
  • 它由关系 RR 中的元组和关系 SS 中的元组进行所有的可能的拼接构成;
  • 数学描述: R×S={<a1,a2,...,an,b1,b2,...,bn><a1,a2,...,an>RR × S = \{<a_1, a_2, ..., a_n, b_1, b_2, ..., b_n> | <a_1, a_2, ..., a_n> ∈ R <b1,b2,...,bn>S}∧ <b_1, b_2, ..., b_n> ∈ S \}
    • <a1,a2,...,an><a_1, a_2, ..., a_n><b1,b2,...,bn><b_1, b_2, ..., b_n> 指的是关系 RRSS 中的元组;
  • 两个关系 RRSS 它们的元组个数分别是 xxyy, 度 (属性的数量) 分别为 aabb:
  • 笛卡尔积结果的 "基数" (元组个数) 为 xyx * y
  • 笛卡尔积结果的 "度" (属性个数) 为 a+ba + b

2020-05-25-10-50-16

2020-05-25-10-51-42

# 选择操作 Select

  • 给定一个关系 RR, 同时给定一个选择的条件 Condition (简写为 concon), 选择运算的结果也是一个关系;
  • 记作 σcon(R)σ_{con}(R)
  • 它从关系 RR 中选择出满足给定条件的元组;
  • 数学描述: σcon(R)={ttRcon(t)=true}σ_{con}(R) = \{t | t ∈ R ∧ con(t) = true\}
  • 条件由 "逻辑运算符" 连接 "比较表达式" 组成:
    • 逻辑运算符: ¬∨ ∧ ¬
    • 比较表达式: XθYX θ Y:
      • X 和 Y 可以是元组中的分量, 常量, 或者简单函数;
      • θθ 是比较运算符, >,,<,,=>, \geq, <, \leq, =

2020-05-25-11-17-05

2020-05-25-11-23-53

# 投影操作 Project

  • 给定一个关系 RR, 投影运算结果也是一个关系;
  • 记作 ΠA(R)Π_A(R);
  • 它从关系 RR 中选出属性包含在 AA 中的列构成的关系;
  • 数学描述: ΠAi1,Ai2,...,Aik(R)={<t[Ai1],t[Ai2],...,t[Aik]>tR}Π_{Ai1, Ai2, ..., Aik}(R) = \{ <t[A_{i1}], t[A_{i2}], ..., t[A_{ik}]> | t∈R\}
  • R(A1,A2,...,An)R(A_1, A_2, ..., A_n)
    • {Ai1,Ai2,...,Aik}{A1,A2,...,An}\{A_{i1}, A_{i2}, ..., A_{ik}\} ⊆ \{A_1, A_2, ..., A_n\}
    • t[Ai]t[A_i] 是元组 tt 中对应属性 AiA_i 的分量 (属性值)
  • "投影操作" 从给定关系中选出某些 "列" 组成新的关系, 而"选择操作" 是从给定关系汇总选出某些 "行" 组成新的关系;

2020-05-25-11-43-28

2020-05-25-11-44-57

2020-05-25-11-45-50

# 扩展操作

# 交操作 Intersection

  • 假设关系 RRSS 是并相容的, 则关系 RRSS 的交运算结果也是一个关系;
  • 记作: RSR ∩ S
  • 它由同时出现在关系 RRSS 中的元组构成;
  • 数学描述: RS={ttRtS}R ∩ S = \{t | t ∈ R ∧ t ∈ S\}
  • 交运算可以由 "差运算" 来实现: RS=R(RS)=S(SR)R ∩ S = R - (R - S) = S - (S - R)
  • 日常语言中, "即 ... 又 ...", "... 并且 ..." 通常表示是交运算;

2020-05-25-13-48-58

2020-05-25-13-49-43

2020-05-25-13-50-00

# theta θ 连接操作 & 更名操作 Rename

  • 投影和选择操作是在单个表上进行的, 实际应用中经常需要在多个表之间进行操作, theta 连接操作可以在多表之间进行;
  • 给定关系 RRSSθθ 连接运算结果也是一个关系;
  • 记作:
    • 2020-05-25-13-58-56
  • 它由关系 RRSS 的笛卡尔积中, RR 中属性 AASS 中属性 BB 满足 θθ 条件的元组构成;
  • 数学描述:
    • 2020-05-25-13-56-27
    • AA 是关系 RR 中的属性;
    • BB 是关系 SS 中的属性;
    • tt 是关系 RR 中的元组;
    • ss 是关系 SS 中的元组;
    • R×SR \times S 是关系 RRSS 的笛卡尔积;
    • 属性 AABB 具有可比性;
    • θθ 是比较运算符;

2020-05-25-14-02-59

2020-05-25-14-04-38

2020-05-25-14-05-15


更名操作 Rename:

  • 在关注做 θθ 连接操作时, 可能会进行自己与自己的连接;
  • 这个时候为了避免重名, 需要进行『 更名操作 Rename 』;
  • ⚠️ 更名操作算是一个『 基本操作 』

2020-05-25-14-08-37


等值连接操作 Equi-Join:

  • 是一种特殊的 θθ 连接操作, 当 θθ 运算符为 == 时就是『 等值连接 』

2020-05-25-14-13-03

2020-05-25-14-14-03

# 自然连接操作 Natural - Join

  • 记作: RSR ⋈ S
  • 它由关系 RRSS 的笛卡尔积中选取相同的属性组 BB 上值相等的元组构成;
  • 数学描述:
    • 2020-05-25-14-18-54
  • 自然连接是一种特殊的等值连接;
  • 要求关系 RRSS 必须有相同的属性组 $B;
  • 要在结果中取出掉重复属性列, 因为 R.BiR.B_i 的值一定是等于 S.BiS.B_i 的值, 所以每个重复的列只需保留一个;

2020-05-25-14-21-57

2020-05-25-14-24-57

2020-05-25-14-25-15

2020-05-25-14-25-41

# 除操作 Division

  • 前提条件: 给定关系 R(A1,A2,...,An)R(A_1, A_2, ..., A_n)nn 度关系, S(B1,B2,...,Bm)S(B_1, B_2, ..., B_m)mm 度的关系. 如果想要进行关系 RRSS 的除运算, 当且仅当, 属性集 {B1,B2,...,Bm}\{B_1, B_2, ..., B_m\}{A1,A2,...,An}\{A_1, A_2, ..., A_n\} 的真子集, 即 m<nm < n
  • 记作: R÷SR \div S
  • R÷SR \div S 结 果的属性集是 {C1,C2,...,Ck}\{C_1, C_2, ..., C_k\} 等于 {A1,A2,...,An}{B1,B2,...,Bm}\{A_1, A_2, ..., A_n\} - \{B_1, B_2, ..., B_m\}
    • k=nmk = n - m
    • R÷SR \div S 结果是一个 nmn - m 度的关系;
  • R÷SR \div S 结果关系中的元组满足下列条件:
    • SS 中的每一个元组组合形成的新元组必须是 RR 关系中的一个元组;

2020-05-25-14-41-38

  • ΠRS(R)Π_{R-S}(R): 关系 RR 中属性集与关系 SS 中的属性集进行差操作, 其结果在关系 RR 上的投影;
  • uS(tuR)∀u \isin S(tu \isin R): 所有的属于关系 SS 的元组 uuR÷SR \div S 结果关系中的元组 tt 组合起来, 都是属于关系 RR 的元组;

2020-05-25-14-46-29

2020-05-25-14-54-51

# 外连接操作 Outer Join

  • 两个关系 RRSS 进行连接时, 如果关系 RR ( 或 SS ) 中的元组在 SS ( 或 RR ) 中找不到匹配的元组, 为了避免信息丢失, 从而将该元组与 SS ( 或 RR ) 中假定存在的全为空值的元组形成连接, 这种连接成为『 外连接 Outer Join 』

2020-05-25-15-12-53

  • 外连接可以细分为:
    • 左外连接: 自然连接/ θθ 连接 + 左侧表中失配的元组;
    • 右外连接: 自然连接/ θθ 连接 + 右侧表中失配的元组;
    • 全外连接: 自然连接/ θθ 连接 + 两侧表中失配的元组;

2020-05-25-15-14-55

2020-05-25-15-19-03

2020-05-25-15-19-37

🌰 查询所有老师的个人信息, 工资, 所教课程信息:

2020-05-25-15-20-54

🌰 查询所有课程的信息, 课程任课老师信息:

2020-05-25-15-22-36

🌰 查询所有老师和课程的信息:

2020-05-25-15-22-58

# 关系演算

  • 关系演算以数理逻辑中的谓词演算为基础, 是一种用逻辑表达查询的思维;

  • 『 谓词 』用来表明语句主语的一个性质;

    • 例如, 语句 “x 大于 3” 可以分成两个部分:
      • 变量 x 是语句的主语;
      • 谓词 “大于 3”,表明语句主语的一个性质;
  • 根据谓词变量的不同, 可以分为:

    • 关系元组演算;
    • 关系域演算;

# 关系元组演算

  • 关系元组演算公式基本形式: {tP(t)}\{t | P(t)\}
  • 公式表示, 所有使谓词 PP 为真的元组 tt 的集合;
  • tt 是元组变量;
  • PP 是谓词逻辑的公式;
  • 以元组为基本单位进行循环, 通过对具体元组分量进行谓词判断, 来得出符合条件的元组集合;

# 原子公式

2020-05-25-18-33-47

2020-05-25-18-34-43

2020-05-25-18-34-55

2020-05-25-18-35-19

2020-05-25-18-35-57

# 全称量词 & 存在量词

2020-05-25-18-38-10

2020-05-25-18-42-37

2020-05-25-18-43-05

# 等价变换

2020-05-25-18-44-05

2020-05-25-18-44-28

2020-05-25-18-44-58

# 元组演算 vs 关系代数

2020-05-25-18-46-42

2020-05-25-18-47-15

2020-05-25-18-47-41

2020-05-25-18-48-03

# 元组演算公式与关系代数的等价性

2020-05-25-18-49-15

# 关系域演算

  • 关系域演算是以『 域 』为谓词变量的逻辑演算;
  • 公式的基本形式: {<x1,x2,...,xn>P(x1,x2,...,xn)}\{ <x_1, x_2, ..., x_n> | P(x_1, x_2, ..., x_n) \}
  • xix_i 代表域变量;
  • PP 是以 xix_i 为变量的公式;

2020-05-25-18-56-13

2020-05-25-18-57-16

  • 域演算时, 是对每个域中所有可能的值进行判断, 看看是否在关系中有对应的元组, 再看看是否符合判断条件;

# 安全性

  • 不产生无限关系和无穷验证的运算被称为是安全的.
  • 关系代数是一种集合运算, 是安全的;
    • 集合本身是有限的, 有限元素集合的有限次运算依然是有限的;
  • 关系演算不一定是安全的;
    • 🌰 例如: {t¬R(t)}\{ t | ¬R(t) \} 可能表示无限关系;
    • 因为虽然 R(t)R(t) 是有限的, 但是不在 R(t)R(t) 中的元素可能是无限的;
  • 需要对关系演算施加约束条件, 以保证安全性;

# 关于三种关系运算的一些观点

  • 三种关系运算都是抽象的数学运算, 体现了三种不同的思维:
    • 关系代数: 以集合为对象的操作思维, 由集合到集合的变换;
    • 元组演算: 以元组为对象的操作思维, 取出关系的每一个元组进行验证看是否满足条件;
    • 域演算: 以域为对象的操作思维, 取出域中的每一个变量进行验证看是否满足条件;
  • 三种运算之间是等价的, 每一种形式的表达式都可以等价地转换成另一种形式;
  • 三种关系是衡量数据库语言完备性的基础:
    • 一种数据库语言如果能够等价地实现这三种关系运算的操作, 则说该语言是完备的;
    • 目前常用的数据库语言都在实现这三种运算的基础上, 还添加很多其他的操作,;
上次更新: 7/4/2020, 4:14:54 AM