# 关系数据库概述

# 相关名词

  1. 关系:在关系数据库中,实体以及实体间的联系都是用关系来表示的。类似于程序设计语言中变量的概念。
  2. 关系模式:是对关系的描述。类似于程序设计语言中类型定义的概念。
  3. 关系模型:是由若干个关系模式组成的集合。
  4. 属性:用来描述某一个事物的特征。
  5. 域:每个属性的取值范围所对应一个值的集合。
  6. 候选码:若关系中的某一属性或属性组的值能唯一标识一个元组,则称该属性或属性组为候选码。
  7. 主码:又称为主键,若一个关系有多个候选码,则选定其中一个为主码。
  8. 主属性:包含在任何候选码中的各个属性称为主属性。
  9. 非主属性:不包含在任何候选码中的属性称为非主属性。
  10. 外码:如果关系模式 RR 中的属性或属性组非该关系的码,但它是其他关系的码,那么该属性集对关系模式 RR 而言是外码。
  11. 全码:关系模型的所有属性组是这个关系模式的候选码,称为全码。
  12. 元组 / 记录:行
  13. 字段、数据项
  14. 元数:属性的个数(列数)
  15. 基数:记录的个数(行数)
  16. nn 元关系:元数为几,就是几元关系。

例:关系模式:Student(Sno, Sname, SD,  Sex)\text{Student(Sno,\ Sname,\ SD, \ Sex)}

# 关系数据库模式

关系模式可以表示为:R(U, D, dom, F))\text{R(U,\ D,\ dom,\ F))}

RR 表示关系名,UU 是组成该关系的属性名集合;DD 是属性的域;dom\text{dom} 是属性向域的映像集合;FF 为属性间数据的依赖关系集合。

通常将关系模式简记为:R(U)R(U)R(A1 ,A2, A3,, An)\text{R}(A_1\ ,A_2,\ A_3,…,\ A_n)

其中,RR 为关系名,A1,A2,A3,,AnA_1,A_2,A_3,…,A_n 为属性名或域名。

例:学生关系 SS 有学号 Sno\text{Sno}、学生姓名 Sname\text{Sname}、系名 SD\text{SD}、年龄 SA\text{SA} 属性;课程关系 CC 有课程号 Cno\text{Cno}、课程名 Cname\text{Cname}、先修课程号 PCno\text{PCno} 属性;学生选课关系 SC\text{SC} 有学号 SnoSno、课程号 Cno\text{Cno}、成绩 Grade\text{Grade} 属性。定义关系模式及主码如下(未考虑 FF,即属性间的依赖关系)。

  1. 学生关系模式 S(Sno,Sname,SD,SA)\text{S(Sno,Sname,SD,SA)}
  2. 课程关系模式 C(Cno,Cname,PCno),Dom(PCno)=Cno\text{C(Cno,Cname,PCno),Dom(PCno)=Cno}
  3. 学生选课关系模式 SC(Sno,Cno,Grade)\text{SC(Sno,Cno,Grade)}

# 关系的三种类型

  1. 基本关系(基本表或基表):它是实际存在的表,是实际存储数据的逻辑表示。
  2. 查询表。查询结果对应的表。
  3. 视图表。它是一种虚拟表,是由基本表或其他视图表导出的表。它本身是不独立存储在数据库的,数据库只存放它的定义。

# 关系的完整性约束

关系的完整性约束:是对关系的某种约束条件,用来保证用户对数据库作出修改时不会破坏数据的一致性,防止对数据的意外破坏。

  1. 实体完整性:是指基本关系 R 的主属性不能取空值。

  2. 参照完整性:

    S(S(学号,姓名,所属院系,年龄))

    D(D(院系编号,学院名称,学院地址,系主任))

  3. 用户定义完整性:是针对某一具体的关系数据库的约束条件,反映某一具体应用所涉及到的数据必须满足的语义要求。

# 关系运算

# 基本的关系代数运算

# 并 (Union)

关系 RRSS 具有相同的关系模式,即 RRSS 的元数相同(结构相同),关系 RRSS “并” 由属于 RR 或属于 SS 的元组构成的集合组成,记作 RSR∪S,其形式定义如下:

RS={ttRtS}R∪S=\{t|t\in R \lor t\in S\}

式中 tt 为元组变量

#

关系 RRSS 具有相同的关系模式,关系 RRSS 的差是由属于 RR 但不属于 SS 的元组构成的集合,记作 RSR-S,其形式定义如下:

RS={ttRtS}R-S=\{t|t\in R\land t\notin S\}

# 广义笛卡儿积

两个元数分别为 nn 目和 mm 目的关系 RRSS 的广义笛卡儿积是一个 (n+m)(n+m) 列的元组的集合。元组的前 nn 列是关系 RR 的一个元组,后 mm 列是关系 SS 的一个元组,记作 R×SR×S

# 投影及广义投影

投影是从关系的垂直方向进行运算,在关系 R 中选择出若干属性列 AA 组成新的关系,记作 ΠA(R)\Pi_A(R),其形式定义如下:

ΠA(R)={t[A]tR}\Pi_A(R)=\{t[A]|t\in R\}

广义投影运算允许在投影列表中使用算术运算,实现了对投影运算的扩充。若有关系 RR ,条件 F1,F2,,FnF_1,F_2,…,F_n 中的每一个都是涉及 RR 中常量和属性的算术表达式,那么广义投影运算的形式定义为:

ΠF1,F2,,Fn(R)\Pi_{F_1,F_2,…,F_n}(R)

# 选择

选择运算是从关系的水平方向进行运算,是从关系 RR 中选择满足给定条件的诸元组,记作 σF(R)σ_F(R),其形式定义如下:

σF(R)={ttRF(T)=True}σ_F(R)=\{t|t\in R\land F(T)=\mathrm{True}\}

其中,FF 中的运算对象是属性名(或列的序号)或常数,运算符、算术比较符(<, >, , , <,\ >,\ ⩾,\ ⩽,\ ≠)和逻辑运算符(, , ¬∧,\ ∨,\ ¬)。

例如,σ16(R)σ_{1⩾6}(R) 表示选取关系 RR 中第 11 个属性值大于等于第 66 个属性值的元组;

σ1>6(R)σ_{1>'6'}(R) 表示选取关系 RR 中第 11 个属性值大于 66 的元组。

注意 666'6' 的区别,66 是指从左往右数第 66 个属性,6'6' 是指数字 66(数值格式或文本格式)

例:设有关系 R,SR,S 如下图所示,请求出 R×S,ΠA,C(R),σA>B(R),σ3<4(R×S){R×S,\Pi_{A, C}(R), σ_{A>B}(R),σ_{3<4}(R×S)}

答案

# 扩展的关系运算

#

关系 RRSS 具有相同的关系模式,关系 RRSS 的交由属于 RR 同时又属于 SS 的元组构成,关系 RRSS 的交记作 RSR\cap S,其形式定义如下:

RS={ttRtS}R\cap S=\{t|t\in R\land t\in S\}

# 连接

分为 θθ 连接、等值连接与自然连接

# θθ 连接

可以由基本的关系运算笛卡儿积和选取运算导出。

RXθYS=σXθY(R×S)R\bowtie_{XθY}S=σ_{XθY}(R×S)

其中,θθ 为比较运算符,如 >,<,=,>,<,=,≠XXYY 分别为 RRSS 上可以进行比较的属性组。

例:设有关系RRSS 如下图所示,求RR.A<S.BSR ⨝_{R.A<S.B}S

答案

# 等值连接

θθ 为 “==” 时,称为等值连接,记为RX=YSR⨝_{X=Y}S

# 自然连接

是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果集中将重复属性列去掉。如果没有重复属性,那么自然连接就转化为笛卡儿积。

例:设有关系 RRSS 如下图所示,求RSR⨝S

答案

#

# 外连接

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

# 左外连接 (左侧为准,右侧填充)

取出左侧关系中所有与右侧关系中任一元组都不匹配的元组,用空值 NULL 填充所有来自右侧关系的属性,构成新的元组,将其加入自然连接的结果中。

# 右外连接 (右侧为准,左侧填充)

取出右侧关系中所有与左侧关系中任一元组都不匹配的元组,用空值 NULL 填充所有来自左侧关系的属性,构成新的元组,将其加入自然连接的结果中。

# 全外连接

# 对关系运算的简单总结

关系运算 运算符 示例 一句话记忆 前提条件
\cup RSR\cup S RR 中或者在 SS 中的行 RRSS 的关系模式相同
- RSR-S RR 中却不在 SS 中的行 RRSS 的关系模式相同
\cap RSR\cup S 既在 RR 中又在SS 中的行 RRSS 的关系模式相同
笛卡尔积 ×\times R×SR\times S
选择 σ\sigma σ1<3(R)\sigma_{1<3}(R) 选择满足条件的行
投影 Π\Pi ΠA,BC(R)\Pi_{A,B-C}(R) 选择满足条件的列
÷÷ R÷SR÷S
θ\theta 连接 XθY\Join_{X\theta Y} RXθYSR⨝_{X\theta Y}S 先求出笛卡儿积,再做选择运算,选取满足 “XθYXθY” 条件的行
等值连接 X=Y\Join_{X=Y} RX=YSR⨝_{X= Y}S 先求出笛卡儿积,再做选择运算,选取满足 “X=YX=Y” 条件的行
自然连接 \Join RSR\Join S RRSS 进行等值连接时,比较的属性相同,且结果中要去掉重复属性列 RRSS 有相同的属性列
左外连接 RSR ⟕ S 在自然连接的基础上,以左侧为准,右侧补齐
右外连接 RSR⟖S 在自然连接的基础上,以右侧为准,左侧补齐
全外连接 RSR⟗S 将左外连接和右外连接的结果求并集

# 元组演算、域演算与查询优化

# 元祖演算

元组关系演算是非过程化查询语言,简称元组演算。它只描述所需信息,而不给出获得该信息的 具体过程。

在元组演算中,其元组演算表达式中的变量是以元组为单位的,其一般形式为:

{tP(t)}\{t|P(t)\}

其中,tt 是元组变量,P(t)P(t) 是元组演算公式,公式是由原子公式组成。

# 原子公式

  1. R(t)R(t)

    RR 是关系名,tt 是元组变量,R(t)R(t) 表示:tt 是关系 RR 中的一个元组。

  2. t[i] θ Ct[i]\ θ\ CC θ t[i]C\ θ\ t[i]
    t[i]t[i] 表示元组变量 tt 的第 ii 个分量,CC 是常量,θθ 为算术比较运算符。

  3. t[i] θ u[j]t[i]\ θ\ u[j]
    ttuu 是两个元组变量。t[i] θ u[j]t[i]\ θ\ u[j] 表示元组变量 tt 的第 ii 个分量与元组变量 uu 的第 jj 个分量之间满足 θθ 运算。

# 公式的定义

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

  1. 原子公式是公式。

  2. 如果 φ1φ1φ2φ2 是公式,那么,¬φ1¬φ1φ1φ2φ1∨φ2φ1φ2φ1∧φ2φ1φ2φ1⇒φ2 也都是公式。分别表示如下命题: ¬φ1¬φ1 表示 “φ1φ1 不为真”,φ1φ2φ1∨φ2 表示 “φ1φ1φ2φ2 为真”,φ1φ2φ1∧φ2 表示 “φ1φ1φ2φ2 都为真”;φ1φ2φ1⇒φ2 表示 “若 φ1φ1 为真则 φ2φ2 为真”。

  3. 如果是 φ1φ1 公式,那么,t(φ1)∃t(φ1) 是公式。t(φ1)∃t(φ1) 表示这样一个命题: “如果有一个 tt 使 φ1φ1 为真,则t(φ1)∃t(φ1) 为真,否则 t(φ1)∃t(φ1) 为假”。

  4. 如果是 φ1φ1 公式,那么,t(φ1)⩝t(φ1) 是公式。t(φ1)⩝t(φ1) 表示这样一个命题: “如果对所有的 tt 使 φ1φ1 为真,则t(φ1)⩝t(φ1) 为真,否则 t(φ1)⩝t(φ1) 为假”。

公式中运算符的优先顺序为:

θ>θ > ⩝>¬>∃ > ¬ > ∧>∨ > ⇒,加括号时,括号中的运算符优先。

例:设有关系 RRSS 如下图所示,对如下所示的元组演算表达式,求出它们的值。

  1. R1={tR(t)¬S(t)}R1 = \{ t | R(t) ∧ ¬S(t) \}
  2. R2={tS(t)t[3]>t[2]t[2]<8}R2 = \{ t | S(t) ∧ t[3]>t[2] ∧ t[2]<8 \}
  3. R3={t(u)(R(t)S(u)t[3]<u[2])}R3 = \{ t | (∃u) (R(t) ∧ S(u) ∧ t[3]<u[2]) \}
  4. R4={t(u)(R(t)S(u)t[3]>u[1])}R4 = \{ t | (⩝u) (R(t) ∧ S(u) ∧ t[3]>u[1]) \}
  5. R5={t(u)(v)(R(u)S(v)u[2]>v[1]t[1]=u[1]t[2]=v[1]t[3]=v[3])}R5 = \{ t | (∃u) (∃v) (R(u) ∧ S(v) ∧ u[2]>v[1] ∧ t[1]=u[1] ∧ t[2]=v[1] ∧ t[3]=v[3]) \}
答案:

RR 表格如下:

A B C
1 2 3
4 5 6
7 8 9
10 11 12

SS 表格如下:

A B C
3 7 11
4 5 6
5 9 13
6 10 14

则有 R1R1

A B C
1 2 3
7 8 9
10 11 12

R2R2

A B C
3 7 11
4 5 6

R3R3u∃u 表示:只要有一个(存在一个)uu 使得后面的公式成立就可以了,即 t[3]t[3] 只要小于 u[2]u[2] 中的其中一个就可以了,如果 t[3]t[3]⩾ 所有 u[2]u[2],就说明不存在任何一个 uu 满足条件。

A B C
1 2 3
4 5 6
7 8 9

R4R4:对任意一个(所有的)uu,都要使后面的公式成立,只要有一个 uu 没有满足这个条件,就不行。即:满足条件的t[3]t[3] 应该大于所有的 u[1]u[1]

A B C
7 8 9
10 11 12

R5R5

R.A S.A S.C
4 3 11
4 4 6
7 3 11
7 4 6
7 5 13
7 6 14
10 3 11
10 4 6
10 5 13
10 6 14

# 域演算

域关系演算简称域演算。在域演算中,表达式中的变量是表示域的变量,可将关系的属性名视为 域变量,域演算表达式的一般形式为

{t1,,tkP(t1,,tk)}\{t_1,…,t_k|P(t_1,…,t_k)\}

其中,t1,,tkt_1,…,t_k 是域变量,P(t1,,tk)P(t_1,…,t_k) 是域演算公式。

# 原子公式

  1. R(t1,,ti,,tk)R(t_1,…,t_i,…,t_k)

    RRkk 元关系,tit_i 是元组变量 tt 的第 ii 个分量,R(t1,,ti,,tk)R(t_1,…,t_i,…,t_k) 表示这样一个命题: 以t1,,ti,,tkt_1,…,t_i,…,t_k 为分量的元组在关系RR

  2. tiθCt_iθCCθtiCθt_i

    tit_i 表示元组变量 tt 的第 ii 个分量,CC 是常量,θθ 为算术比较运算符。

  3. tiθujt_iθu_j

    tit_iuju_j 是两个域变量。tiθujt_iθ u_j 表示元组变量 tt 的第 ii 个分量与元组变量 uu 的第 jj 个分量之间满足 θθ 运算。

# 公式的定义

若一个公式的一个元组变量前有全称量词 或存在量词 符号,则称该变量为约束变量,否 则称之为自由变量。

公式可递归定义如下:

  1. 原子公式是公式。
  2. 如果 φ1φ1φ2φ2 是公式,那么,¬φ1¬φ1φ1φ2φ1∨φ2φ1φ2φ1∧φ2φ1φ2φ1⇒φ2 也都是公式。
  3. 如果是 φ1φ1 公式,那么,ti(φ1)∃t_i(φ_1) 是公式。ti(φ1)∃t_i(φ_1) 表示这样一个命题: “如果有一个 tit_i 使 φ1φ_1 为真,则 ti(φ1)∃t_i(φ_1) 为真,否则 ti(φ1)∃t_i(φ_1) 为假”。
  4. 如果 φ1(t1,,ti,,tk)φ_1(t_1,…,t_i,…,t_k) 是公式,那么,ti(φ1)⩝t_i(φ_1) 是公式。t(φ1)⩝t(φ_1) 表示这样一个命题: “如果对所有的 tit_i 使 φ1(t1,,ti,,tk)φ_1(t_1,…,t_i,…,t_k) 为真,则 ti(φ1)⩝t_i(φ_1) 为真,否则 ti(φ1)⩝t_i(φ_1) 为假”。

公式中运算符的优先顺序为: θ>θ > ⩝>¬>∃ > ¬ > ∧>∨ > ⇒,加括号时,括号中的运算符优先。

例:设有关系 RRSS 如下图所示,对如下所示的域演算表达式,求出它们的值。

  1. R1={t1t2t3R(t1t2t3)t1<t2t2>t3}R_1 = \{ t_1 t_2 t_3 | R (t_1 t_2t_3) ∧ t_1 < t_2 ∧ t_2 > t_3 \}
  2. R2={t1t2t3(R(t1t2t3)t1>4)(S(t1t2t3)t2<8)}R_2 = \{ t_1t_2t_3 | ( R (t_1t_2t_3) ∧ t_1>4 ) ∨ ( S (t_1t_2t_3) ∧ t_2<8) \}
  3. R3={t1t2t3(u)(v)(w)R(ut2v)S(t1wt3)u7v>w}R_3 = \{ t_1t_2t_3 | (∃u)(∃v)(∃w) R(ut_2v) ∧ S(t_1wt_3) ∧ u⩾7 ∧ v>w \}
答案:

RR

A B C
1 2 1
4 5 7
7 8 6
10 11 9

SS

A B C
1 2 3
4 5 6
7 8 8
10 11 11

R1R_1

A B C
1 2 1
7 8 6
10 11 9

R2R_2

A B C
7 8 6
10 11 9
1 2 3
4 5 6

R3R_3

S.A R.B S.C
1 8 3
4 8 6
1 11 3
4 11 6
7 11 9

# 查询优化

查询优化是指为查询选择最有效的查询计划的过程。一个查询可能会有多种实现方法,关键是如 何找出一个与之等价的且操作时间又少的表达式,以节省时间、空间,提高查询效率。

在关系代数运算中,笛卡儿积、连接运算是最耗费时间和空间的。

优化的准则:

  1. 提早执行选取运算。对于有选择运算的表达式,应优化成尽可能先执行选择运算的等价表达式, 以得到较小的中间结果,减少运算量和从外存读块的次数。
  2. 合并乘积与其后的选择运算为连接运算。
  3. 将投影运算与其后的其他运算同时进行,以避免重复扫描关系。
  4. 将投影运算和其前后的二目运算结合起来,使得没有必要为去掉某些字段再扫描一遍关系。
  5. 在执行连接前对关系适当地预处理,就能快速地找到要连接的元组。方法有两种:索引连接法、 排序合并连接法。
  6. 存储公共子表达式。对于有公共子表达式的结果应存于外存(中间结果),这样,当从外存读 出它的时间比计算的时间少时,就可节约操作时间。

例:供应商数据库中有:供应商 SS、零件 PP 、项目 JJ 、供应 SPJSPJ 四个基本表(关系),其关系模式如下所示:

S (Sno, Sname, Status, City)\text{S (Sno, Sname, Status, City)} 供应商编号,供应商名称,供应商城市

P (Pno, Pname, Color, Weight)\text{P (Pno, Pname, Color, Weight)} 零件号,零件名称,颜色,重量

J (Jno, Jname, City)\text{J (Jno, Jname, City)} 工程号,项目名称,所在城市

SPJ (Sno, Pno, Jno, Qty)\text{SPJ (Sno, Pno, Jno, Qty)} 供应商编号,零件编号,工程号,数量

若用户要求查询使用 “上海” 供应商生产的 “红色” 零件的工程号,请解答如下问题:

  1. 试写出该查询的关系代数表达式;
  2. 试写出查询优化的关系代数表达式。
  3. 画出该查询初始的关系代数表达式的语法树。
  4. 使用优化算法,对语法树进行优化,并画出优化后的语法树。
答案

πJno(σCity=Color=(SSPJP))\pi_{Jno}(σ_{City='上海'∧Color='红'}(S⨝SPJ⨝P) )

πJno(πSno(σcity=(S))πSno,Pno,Jno(SPJ)πPno(σColor=(P)))\pi_{Jno}(\pi_{Sno}(\sigma _{city = '上海'(S)}) \Join \pi_{Sno, Pno, Jno} (SPJ)\Join \pi_{Pno} ( \sigma_{Color} = '红' (P)))$

graph TD
	A("π_{Jno}")-->B("σ_{City='上海'∧Color='红'}")-->c("π_{Sno, Sname, Status, City, Pno, Jno, Qty, Pname, Color, Weight}")-->D("σ_{S.Sno=SPJ.Sno} ∧ _{SPJ.Pno=P.Pno}")-->E(x)-->F1(S)
	E(x)-->F2(x)-->G1(SPJ)
	F2-->g2(P)
graph TD
	A("π_{Jno}")-->B("σ_{SPJ.Pno=P.Pno}")-->C("x")-->D1("π_{Sno, Pno, Jno}")-->E1("σ_{S.Sno=SPJ.Sno}")-->F1(x)-->G1("π_{Sno}")-->H1("σ_{City}='上海'")-->J1(S)
	C-->D2("π_{Pno}")-->E2("σ_{Color='红'}")-->F2(P)
	F1-->G2("π_{Sno, Pno, Jno}")-->H2(SPJ)

# 关系数据库设计基础知识

# 函数依赖

定义:设 R(U)R(U) 是属性集 UU 上的关系模式,XXYYUU 的子集。** 若对 R(U)R(U) 的任何一个可能的关系 rr **,rr 中不可能存在两个元组在 XX 上的属性值相等,而在 YY 上的属性值不等, 则称 XX 函数决定 YYYY 函数依赖于 XX ,记作:XYX→Y

  • 如果 XYX→Y,那么对于任意两个相同的 XX,所对应的 YY 是一定相同的。

  • 如果 XYX→Y,但 YXY⊈X,则称 XYX→Y 是非平凡的函数依赖。一般情况下总是讨论非平凡 的函数依赖。

  • 如果 XYX→Y,但 YXY⊆X,则称 XYX→Y 是平凡的函数依赖。

函数依赖的定义要求关系模式 RR 的任何可能的 rr 都满足上述条件。因此不能仅考察关系模式 RR 在某一时刻的关系 rr,就断定某函数依赖成立。

函数依赖是语义范畴的概念,我们只能根据语义来确定函数依赖。

# 完全函数依赖与部分函数依赖

定义:在 R(U)R(U) 中,如果 XYX→Y,并且对于 XX 的任何一个真子集XX',都有 XX' 不能决定 YY ,则称 YYXX 完全函数依赖,记作:XYX→Y。如果 XYX→Y,但 YY 不完全函数依赖于 XX ,则称 YYXX 部分函数依赖,记作:XYX→Y。部分函数依赖也称局部函数依赖

例:选课关系 SC1 (学号,课程号,成绩),F={(学号,课程号)→ 成绩}

则有 (学号,课程号)→ 成绩,学号⇸成绩,课程号⇸成绩。

选课关系 SC2 (学号,课程号,学生姓名,课程名称,成绩),

F={(学号,课程号)→ 成绩,(学号,课程号)→ 课程名称,(学号,课程号)→ 学生姓名,学号→学生 姓名,课程号 → 课程名称}

# 传递函数依赖

定义:在 R(U,F)R(U,F) 中,如果 XYX→YYZY→ZYXY⊈XYXY⇸X,则称 ZZXX 传递依赖。

例:供应商(Sno,Sname,Status,City,Pno,Qty)\text{(Sno,Sname,Status,City,Pno,Qty)}​,及函数依赖集如下,判断该关系是否存在传递函数依赖和部分函数依赖。

答案

F={Sno→Sname, Sno→Status, Status→City,(Sno,Pno)→Qty}\text{F=\{Sno→Sname, Sno→Status, Status→City,(Sno,Pno)→Qty\}}

#

# 候选码和主码

KKR(U,F)R(U,F) 中的属性的组合,若 KUK→U,且对于 KK 的任何一个真子集 KK',都有 KK' 不 能决定 UU ,则 KKRR 的候选码,若有多个候选码,则选一个作为主码。

  • 候选码通常也可以称为候选关键字,主码通常也可以称为主关键字或主键。
  • 包含在任何一个候选码中的属性叫做主属性,否则叫做非主属性。

例:选课关系SC1(Sno,Cno,Sname,Cname,G)\text{SC1(Sno,Cno,Sname,Cname,G)} ,选课关系SC2(Sno,Cno,Sname,Cname)\text{SC2(Sno,Cno,Sname,Cname)}

# 外码

R(U)R(U) 中的属性或属性组 XXRR 的码,但 XX 是另一个关系的码,则称 XXRR 的 外码(Foreign Key)或称外键。

例:学生(学号,姓名,班主任,所属学院),教师(职工号,姓名),学院(编号,名称)

# 多值依赖

定义:若关系模式 R(U)R(U) 中,XXYYZZUU 的子集,并且 Z=UXYZ=U-X-Y。当且仅当对 R(U)R(U) 的任何一个关系 rr,给定一对 (x,z)(x,z) 值,有一组 YY 的值,这组值仅仅决定于 xx 值而与 zz 值无关,则称 “YY 多值依赖于 XX ” 或 “XX 多值决定 YY ” 成立。记为: $X→→Y

例:参考书目(课程,教师,参考书) ,课程 →→ 参考书

如果 Z=Z=∅,为平凡的多值依赖;

如果 ZZ≠∅,则为非平凡的多值依赖。

多值依赖具有如下 6 条性质:

  1. 多值依赖具有对称性。即若 XYX→→Y,则 XZX→→Z,其中Z=UXYZ=U-X-Y
  2. 多值依赖的传递性。即若 XY,YZX→→Y,Y→→Z, 则 XZYX→→Z-Y
  3. 函数依赖可以看成是多值依赖的特殊情况。
  4. XY,XZX→→Y,X→→Z,则 XYZX→→YZ
  5. XY,XZX→→Y,X→→Z,则 XYZX→→Y ⋂Z
  6. XY,XZX→→Y,X→→Z,则 XZYX→→Z-Y