跳转至

关系模型

基本概念

给定集合 \(D_1, D_2, \cdots, D_n\),一个关系 \(r\) 就是 \(D_1 \times D_2 \times \cdots \times D_n\) 的子集,它是一个 \(n\) 元组的集合。

\(A_1, A_2, \cdots, A_n\)属性 (attribute),其可能取到的值的集合称为域 (domain)。属性的值需要是原子的 (atomic)。每个值域都包含一个特殊的值,称为空值 (null)

\(R = (A_1, A_2, \cdots, A_n)\) 是一个关系模式 (relation schema),它定义了一个关系的属性集合,\(r(R)\) 则是 \(R\) 的一个关系实例 (relation instance)

数据库模式 (database schema) 是数据库的逻辑设计,包括所有关系模式的集合。数据库实例 (database instance) 是数据库的一个具体的状态,包括所有关系实例的集合。


如果 \(K\subseteq R\) 足以唯一地标识 \(r(R)\) 中的元组,那么称 \(K\)\(R\) 的一个超键 (superkey),如 {ID, Name}。

如果一个超键 \(K\) 是最小的,那么称 \(K\)\(R\) 的一个候选键 (candidate key),如 {ID}。候选键之一可以被选为主键 (primary key)

若一个外键 (foreign key) 从关系 \(r_1\) 的属性 \(A\) 指向关系 \(r_2\) 的主键 \(B\),则该约束规定,在任意数据库实例上,\(r_1\) 中每个元组的 \(A\) 值也必须是 \(r_2\) 中某个元组的 \(B\) 值,其中 \(r_1\) 是 Referencing relation,\(r_2\) 是 Referenced relation。

参照完整性 (Referential integrity) 约束要求出现在引用关系 \(r_1\) 中的任何元组的指定属性 \(A\) 中的值也出现在被引用关系 \(r_2\) 中的至少一个元组的指定属性 \(B\) 中。

参照完整性约束是一个更广泛的术语,它包括了外键约束,比外键约束更弱,可以不是主键。在符号表示上,外键是单箭头,参照完整性是两个连在一起的箭头。


关系代数

形式化关系查询语言分为以下三种:

  • 元组关系演算 (Tuple relational calculus)
  • 域关系演算 (Domain relational calculus)
  • 关系代数 (Relational algebra) 描述了关系的操作,有六种基本操作:
    • 选择 (Select): \(\sigma\)
    • 投影 (Project): \(\prod\)
    • 并 (Union): \(\cup\)
    • 差 (Set Difference): \(-\)
    • 笛卡尔积 (Cartesian Product): \(\times\)
    • 重命名 (Rename): \(\rho\)

选择操作的定义为 \(\sigma_p(r) = \{ t | t\in r \text{ and } p(t) \}\),其中 \(p(t)\) 是一个选择谓词 (selection predicate),它是一个关于 \(t\) 的布尔表达式。

投影操作的定义为 \(\prod_{A_1, A_2, \cdots, A_k}(r) = \{ t[A_1, A_2, \cdots, A_n] | t\in r \}\),其中 \(A_1, A_2, \cdots, A_k\)\(r\) 的属性。

并操作的定义为 \(r \cup s = \{ t | t\in r \text{ or } t\in s \}\),其中 \(r\)\(s\) 必须有相同的元数 (arity),属性的域也必须相容。

差操作的定义为 \(r - s = \{ t | t\in r \text{ and } t\notin s \}\),其中 \(r\)\(s\) 必须有相同的元数 (arity),属性的域也必须相容。

笛卡尔积操作的定义为 \(r \times s = \{ t_1, t_2 | t_1\in r \text{ and } t_2\in s \}\),其中 \(r\)\(s\) 的属性必须是不相交的,否则必须使用重命名。

重命名操作的定义为 \(\rho_x (E)\),会返回被重命名为 \(x\) 的表达式 \(E\)

Note

找到最多的薪水的查询可以写成 \(\prod_{\text{salary}}(\text{instructor}) - \prod_{\text{instructor.salary}}(\sigma_{\text{instructor.salary} < \text{d.salary}}(\text{instructor} \times \rho_d(\text{instructor})))\)

附加操作

附加操作可以用来简化查询,无法增加表达能力,包括:

  • 交 (Set Intersection): \(\cap\)
  • 自然连接 (Natural Join): \(\Join\)
  • 外连接 (Outer Join): \(⟕, ⟖, ⟗\)
  • 半连接 (Semijoin): \(\ltimes\)
  • 赋值 (Assignment): \(\leftarrow\)
  • 除 (Division): \(\div\)

交操作的定义为 \(r \cap s = \{ t | t\in r \text{ and } t\in s \} = r - (r - s)\)

自然连接操作会匹配在相同属性上有相同值的元组,每个元组会去搜索另一个关系中匹配的元组,将其扩展后加入结果中,例如,令 \(R = (A, B, C, D), S = (B, D, E)\),则 \(r \Join s = \prod_{A, B, C, D, E} (\sigma_{r.B=s.B \wedge r.D=s.D} (r \times s))\)

外连接操作会保留不匹配的元组,若一个元组无法与另一个关系匹配,就会将另一个关系的属性设为空,然后将被扩展的元组加入结果中。根据保留的元组在哪一侧,可以分为左外连接、右外连接和全外连接:

  • 左外连接:\(r ⟕ s = (r \Join s) \cup (r - \prod_R (r \Join s)) \times \{ (\text{null}, \cdots, \text{null}) \}\)
  • 右外连接:\(r ⟖ s = (r \Join s) \cup \{ (\text{null}, \cdots, \text{null}) \} \times (s - \prod_S (r \Join s))\)
  • 全外连接:\(r ⟗ s = (r \Join s) \cup (r - \prod_R (r \Join s)) \times \{ (\text{null}, \cdots, \text{null}) \} \cup \{ (\text{null}, \cdots, \text{null}) \} \times (s - \prod_S (r \Join s))\)

theta 连接操作的定义为 \(r \Join_{\theta} s = \sigma_{\theta}(r \times s)\),半连接操作的定义为 \(r \ltimes_{\theta} s = \prod_R (r \Join_{\theta} s)\),可用于用外部表的信息进行筛选。

除操作是找到最大 \(t(R - S)\),使得 \(t \times s \subseteq r\),即 \(r \div s = \prod_{R-S}(r) - \prod_{R-S} (\prod_{R-S}(r) \times s - r)\)。换句话说,如果 \(R - S\) 的一个元组 \(t\) 满足 \(t \times s \subseteq r\),那么 \(t\) 就会被保留。

除操作

\(r(\text{ID}, \text{course\_id}) = \prod_{\text{id}, \text{course\_id}} (\text{takes})\)

\(s(\text{course\_id}) = \prod_{\text{course\_id}} (\sigma_{\text{dept\_name="Biology"}} (\text{course}))\)

\(r \div s\) 代表的就是选择了所有生物课的学生。

扩展操作

扩展操作可以增加表达能力,包括:

  • 广义投影 (Generalized Projection),可以在投影中使用算术表达式
  • 聚合函数 (Aggregate Functions),可以接受一系列值并返回单个值,如 \(\text{avg}\), \(\min\), \(\max\), \(\text{sum}\), \(\text{count}\)
  • 聚合操作 (Aggregate Operations),可以将关系代数表达式按照属性分组,然后根据聚合函数返回值,形式为 \(_{G_1, \cdots, G_n} \mathcal{G}_{F_1(A_1), \cdots, F_n(A_n)} (E)\)

聚合操作

\(_\text{dept\_name} \mathcal{G}_{\text{avg(salary)}} (\text{instructor})\) 会返回每个部门的平均薪水

多重集关系代数

多重集关系代数 (multiset relational algebra) 允许重复元素,可以提高效率,其操作有一些区别:

  • 选择和投影操作不会去重
  • \(r\)\(s\) 中各有 \(m\)\(n\) 个副本,则叉积会产生 \(m \times n\) 个副本
  • 并:\(m + n\) 个副本
  • 交:\(\min(m, n)\) 个副本
  • 差:\(\max(m - n, 0)\) 个副本


SQL 和关系代数

在多重集关系代数中,

$\prod_{A_1, \cdots, A_n} \sigma_P (r_1 \times \cdots \times r_m) $ 等价于:

select A1, A2, ..., An
from r1, r2, ..., rm
where P

\(_{A_1, A_2} \mathcal{G}_{\text{sum}(A_3)} \sigma_P (r_1 \times \cdots \times r_m)\) 等价于:

select A1, A2, sum(A3)
from r1, r2, ..., rm
where P
group by A1, A2