关系模型

元组与属性

  • 元组:表中的一行,顺序无所谓
  • 属性:必须为原子的,具有属性域(取值范围,也包含数据类型的限定)
    • 空值为特殊值,表示取值未知或不存在

关系模式可表示为:$R(A_1,A_2,…,A_n)$

  • $A_i$ 表示属性
  • 在关系模型中,使用相同属性可将不同关系的元组联系起来

关系实例

  • 关系模式:关系的逻辑设计
  • 关系实例:给定时刻关系中数据的一个快照

即类型与变量的关系

Keys(键/码)

超码

$K$ 能唯一标识关系 $r(R)$ 中的一个元组,则称 $K$ 是关系 $r(R)$ 的超码(Superkey)

  • 超码 $K$ 是一个或多个属性的集合,$K\subseteq R$
    • 其中,$R$ 是关系模式 $r$ 的属性集合
    • 例:{ID} 和 {ID, name} 是 instructor 的超码
  • 超码可能包含无关紧要的属性
  • $K$ 的任意超集也是超码

候选码

任何真子集都不能成为超码的最小超码称为候选码(candidate key)

  • 例:{ID} 是 instructor 的候选码

主码

选择一个候选码作为主码(primary key)

  • 选择那些值从不或极少变化的属性
  • 习惯将一个关系模式的主码属性列在属性列的最前面

外码

一个关系模式 $(r1)$ 在其属性上包含另一个关系模式 $(r2)$ 的主码,此属性在 $r1$ 上称为引用 $r2$ 的外码(foreign key), $r1$ 称为外码依赖的引用关系,$r2$ 称为外码的被引用关系

参照关系中的任意元组在特定属性(如外码)上的取值,必须等于被引用关系中的某个元组在该特定属性上的取值,这种约束要求称之为引用完整性约束(referential integrity constraint),如外码约束

模式图

一个含有主码和外码依赖的数据库模式可用模式图来表示

  • 每一个关系模式用一个矩形来表示
  • 主码属性用下划线标注
  • 外码约束(依赖)用从参照关系的外码到被引用关系的主码之间的箭头表示
  • 不应与 E-R 图混淆

关系查询语言

  • 命令式/过程化查询语言
  • 函数式查询语言(functional query language)
  • 声明式/非过程化语言

关系代数

所有的过程化查询语言都提供了一组关系运算,这些运算施加于单个关系上,或者一对关系上;运算结果总是单个关系

6 中基本关系运算:

  • 选择:$\sigma$
  • 投影:$\prod$
  • 集合并:$\cup$
  • 集合差:$-$
  • 笛卡尔积:$\times$
  • 更名:$\rho$

选择运算

  • 作用:选择满足给定谓词条件的元组
  • 符号表示形式: $\sigma_{p}(r)$,$p$ 是选择谓词

示例:选择物理系的所有老师信息

$$\sigma _\text{dept_name=’Physics’} (instructor)$$

形式化定义:$\sigma _{p}(r) = {t | t \in r \wedge p(t)}$

$p$ 是一个由一至多个元组选择条件组成的谓词,而这些条件是由 $\wedge$ (and), $\vee$ (or), $\urcorner$ (not)连接起来的

每个条件可表示为:

$$
\text{<属性>/<常量>} op \text{<属性>/<常量>}
$$

其中,$op$ 可以是:$=$、$\neq(<>)$、$>$、$\geq$ 、$<$ 、$\leq$ 等比较运算符的其中一种

投影运算

  • 作用:过滤掉特定的属性
  • 符号表示形式:$\prod _{A_1,A_2,…,A_m} (r)$
  • 操作结果:通过去除未列出的列,获得的一个 m 列的关系

示例:去除 instructor 的 dept_name 属性

$$\prod _{\text{ID, name, salary}} (instructor)$$

形式化定义:

$$
\pi _{i_1,i_2,…,i_m}={t|t=<t_{i_1},…t_{i_m}>\vee <t_1,…,t_{i_1},…,t_{i_m},…t_n>\in R}
$$

笛卡尔积运算

  • 作用:结合来自任意两个关系的信息
  • 符号表示: $r \times s$

示例: $instructor \times teaches$

由于相同的属性名可能同时出现在 $r(R)$ 和 $s(S)$ 中,所以在笛卡尔积运算结果中需要重命名来区别这些属性,例如:$instructor.ID,teaches.ID$

形式化定义:

$$r \times s = {<t ,q> | t \in r \wedge q \in s}$$

可以使用多种运算构建表达式

如,表的连接运算: $\sigma_{A=C}(r\times s)$

连接运算

  • 作用:可以将选择运算笛卡尔积运算合并为一个运算操作,连接两个表的信息
  • 符号表示: $r \bowtie {\theta} s = \sigma{\theta} (r \times s)$
    • $\theta$ 是 $R \cup S$ 模式属性上的一个选择谓词

例:

$$
\sigma _{\text{instructor.id = teaches.id}} (\text{instructor} \times \text{teaches} )
$$

等价于:

$$
\text{instructor} \bowtie _{\text{instructor.id = teaches.id}} teaches
$$

集合并运算

  • 符号表示: $r \cup s$
  • 形式化定义:$r \cup s = {t | t \in r \vee t \in s}$
  • 要使 $r \cup s$ 有意义,要求以下两个条件同时成立:
    • 关系 $r$ 和 $s$ 必须同元,即它们的属性数目必须相同
    • 属性域必须相同

找出开设在 2009 年秋季学期或者 2010 年春季学期的所有课程编号的集合

$$
\prod _{course_id} (\sigma _{semester=’Fall’ \wedge year=2009} (section))
\cup
\prod _{course_id} (\sigma _{semester=’Spring’ \wedge year=2010} (section))
$$

集合差运算

  • 符号表示:$r – s$
  • 形式化定义:$r – s = {t | t \in r \wedge t \notin s}$
  • 集合差必须保证集合差运算在相容的关系间进行
    • $r$ 和 $s$ 必须是同元的
    • $r$ 和 $s$ 的属性域必须相同

找出所有开设在 2009 年秋季学期但不在2010 年春季学期开设的课程的编号

$$
\prod _{course_id} (\sigma _{semester=’Fall’ \wedge year=2009} (section))

\prod _{course_id} (\sigma _{semester=’Spring’ \wedge year=2010} (section))
$$

更名运算

通过更名运算,可以用一个新的名称来指代一个关系(或关系代数表达式的结果)

  • $\rho _x (E)$
  • 返回表达式 $E$ 的结果,并把名字 $x$ 赋给它

假设关系代数表达式 $E$ 是多元的,则表达式

$$
\rho _{x(A_1,A_2, …, A_n)}(E)
$$

返回表达式 $E$ 的结果,并赋给它名字 $x$,同时将各属性更名为 $A1 , A2 ,\dots, An$

找出大学里的最高工资

找出所有“不是最高工资”的工资值

$$
\prod {instructor.salary} (\sigma{instructor.salary <d.salary}(instructor \times \rho_d (instructor))
$$

使用集合差,计算得到最高工资

$$
\prod _{salary}(instructor)

\prod {instructor.salary} (\sigma{instructor.salary <d.salary}(instructor \times \rho_d (instructor))
$$

集合交运算

  • 符号表示:$r \cap s$
  • 形式化定义:$r \cap s = { t | t \in r \wedge t \in s }$
  • $r$, $s$ 必须满足两个条件:
    • $r$, $s$ 必须是同元的
    • $r$ 和 $s$ 的属性必须相同

任何集合交都可以用一对集合差运算来表示:

$$
r \cap s = r-(r-s)
$$

自然连接运算

已知关系 $r (R)$ 和 $s(S)$,那么,$r \bowtie s$ 是在 $R \cup S$ 模式下获得的关系,具体如下:

  • 依次比较关系 $r$ 的元组 $t_r$ 和关系 $s$ 的元组 $t_s$
  • 如果在 $R \cap S$ 模式中,元组 $t_r$ 和元组 $t_s$ 的属性相同,就将一个元组 $t$ 加入到元组中,则
    • 元组 $t$ 和关系 $r$ 中的 $t_r$ 有相同的属性值
    • 元组 $t$ 和关系 $s$ 中的 $t_s$ 有相同的属性值

如:R = $(A, B, C, D)$;S = $(E, B, D)$

自然连接结果为:$(A,B,C,D,E)$

赋值运算

赋值操作($\leftarrow$)可以使复杂查询的表达变得简单,即将查询表达为一个顺序程序,包括:

  • 一系列的赋值
  • 一个值被做为查询结果显示的表达式

例:找出所有所在部门为”Physics”和”Music”的老师

$$
\begin{array}{l}
\text{Physics} \leftarrow \sigma_{dept_name=’Physics’}(instructor) \newline
\text{Music} \leftarrow \sigma_{dept_name=’Music’}(instructor) \newline
\text{Physics}\cup\text{Music}
\end{array}
$$

  • 赋值赋给一个临时关系变量,并不修改数据库关系实例
  • 赋值赋给一个数据库关系,修改数据库关系实例

修改数据库

可以使用赋值运算符来表示修改数据库的操作:删除、插入、更新

删除

只可以删除整个元组,不能删除特定的属性值

$$
r \leftarrow r-E
$$

$r$ 是关系,$E$ 是一个关系代数查询

删除 Perryridge 支行的所有账户记录

$$
\text{account} \leftarrow \text{account}-\sigma_{\text{branch_name=’Preeyridge’}}(account)
$$

插入

插入对象:

  • 特定一个元组
  • 查询结果是元组的查询语句

$$
r \leftarrow r \cup E
$$

$r$ 是关系,$E$ 是一个关系代数查询。插入单一的元组表示假设 $E$ 是一个包含一个元组的常数关系

在数据库中插入信息指明 Smith 在 Perryridge 的分行的账户有 $1200

$$
\begin{array}{l}
\text{account} \leftarrow \text{account} \cup {(‘1024’,’Perryridge’,1200)}\newline
\text{depositor}\leftarrow \text{depositor}\cup {(‘Smith’,’1024’)}
\end{array}
$$

更新

数据库更新需改变元组中的一个属性值,而不需要改变元组中所有的值

可以使用广义投影操作来完成这个任务

$$
r \leftarrow \prod_{F_1,F_2,\dots,F_I}(r)
$$

每个 $F_i$ 是以下两者之一:

  • 如果第 $I$ 个属性没有更新,$F_i$ 可以是关系 $r$ 的第 $I$ 个属性;
  • 如果属性需要被更新,$F_i$ 可以是一个关于常数和 $r$ 的属性 $i$ 的表达式,给属性赋与新值

将余额的 5%作为利息

$$
\text{account} \leftarrow \prod _{account_number, branch_name, balance * 1.05} (account)
$$

例题

列出至少选修过一门课程的所有学生姓名

$$
\prod _{Students.StudentName} \sigma(Students\bowtie Enrollments)
$$

查询选修了“计算机科学”系课程的所有学生的姓名和所选课程名称

$$
\prod _{Students.StudentName, Courses.CourseName}\sigma _{Courses.Department=\text{‘计算机科学’}}(Students\bowtie Enrollments \bowtie Courses)
$$

查询 2023 年选修课程且成绩在 80 分以上的学生姓名和课程名称

$$
\prod _{Students.StudentName, Courses.CourseName} \sigma _{Enrollments.Semester=2023 \wedge Enrollments.Grade > 80}(Students\bowtie Enrollments \bowtie Courses)
$$