DB02 Relational
2024-01-23 21:54:30

Def

简单来说,我们称 \(R\subseteq D_1\times D_2\cdots\times D_n\) 这样一个 \(n\)-tuple 构成的集合 \(R\) 为为 \(n\)-relation over domain \(D_1\ldots D_n\),简称为 \(n\)-relation。简单地说,一个 relation 包含了所有使这个关系成立的元素(组),因此在数据库的语境下“关系”与“集合”是等价的。

直观来看,一个关系实为一张巨大的 \(n\) 列表,每行为一个满足该关系的元素,每列代表了一个属性。

需要注意的是,在数据库的语境下,“集合”通常指“无序可重集合”,即两个元素的比较是 identity equality 而非 domain-induced equality。因此后面讲到的 primary key/super key 的重要性也就很直观了,因为这里(可能)需要统计重复出现的元素。

这两个视角没什么区别,感觉也没啥好说的。

一些边角要求

  • 通常 domain 有一个特殊的占位值,即取 \(D_\bot=D\cup\{\bot\}\) 作为真正使用的 domain(群友最爱的 optional<T>
  • 一般要求 \(D\) 中的元素是原子的,例如 int;非原子的例子有 varchar、逻辑上的集合

这一切都看起来和命题演算那么熟悉,像啊,很像啊

Strict structure

关系这样非常固化的结构带来了一些后果:

  • 处理起来非常简单
  • 用起来也非常简单
  • 不够灵活多变

Keys

数据库语境下的关系 \((R,\equiv)\) 实际上是二元组,分别由定义域和 tuple 上的等价关系组成

以网课签到为例,一个签到记录由三元组 (学号,名称,地点) 组成。

  • 一个人可以在不同地方签到多次,但只应被记录一次
  • 两个人只要学号和名称不同时相等,那么他们的签到就应当分开算

primary

这里 (学号,名称) 就是一组 primary key,它唯一确定了一个 tuple 的 identity

比我聪明的读者会发现这也说明

  • 签到表本质上是一个函数,即 (学号,名称) -> 地点
  • 以及 primary key constraint 本质上是 deterministic function constraint
  • 接上条,数据的本质是一堆 primary key 间的映射

candidate

指极小的列集合 \(K\) 满足 \(\forall r_1,r_2\in R,\forall k\in K, r_1\text{.}k\ne r_2\text{.}k\rightarrow r_1\text{.}k\not\equiv r_2\text{.}k\)

说人话:只要 \(K\) 中的属性不全相同,就认为是不同的 tuple

此处 candidate 的意思是可以作为 primary key 的备胎

去掉极小限制后的 candidate 叫做 super key

foreign/referential

考虑 tuple \(t_1\in R_1,t_2\in R_2\),如果 \(\text{$t_1$.$k_1$=$t_2$.$k_2$}\),那么我们称 \(k_1,k_2\)\(R_1,R_2\) 之间的 referential key。不失一般性地,如果 \(k_1\) 是 primary key,那么 \(k_2\) 就称为 \(R_2\)\(R_1\) 的 foreign key

如果用 \(\sigma_k\) 表示投影到 key \(k\),那么约束写出来就是 \(\sigma_{k_1}(R_1)\subseteq \sigma_{k_2}(R_2)\),so easy

需要注意的是,某个 foreign key 可能也是 primary key,这二者并不矛盾

联谊

以大学生喜闻乐见的脱单为例,不妨假设有一个男女配对环节,表 B=(名字,身高)G=(名字,院系)N=(名字,twitter_id) 分别表示男女和非二元性别,并且名字都是 primary key

  • 一张用来表示心动嘉宾的表 L=(名字,名字) 就由两个 foreign key 组成,foreign key constraint 的意义在于每个人的心动嘉宾应当出席了活动

  • 一张用来表示心动身高的表 D=(名字,身高) 就由 foreign key 和 referential key 组成,因为身高并非 primary key。referential key constraint 的意义在于活动中确实有人长这么高

不难发现 foreign key 是 referential key 的一个特例。直观上看,foreign key 更好实现(目标明确),referential key 适用范围更广(海王)

Relational algebra

非常的简单,书上介绍了这么几种:

  • project:删去一些列
  • select:filter by predicate
  • product:就是你想的那个 product
  • join:product + select 的语法糖
  • rename/assign:term rewriting 的语法糖