# 02-关系模型

## 基础概念

* 域：具有相同数据类型的值的集合。（取值范围）

### 笛卡尔积

* 笛卡尔积：给定一组域$$D\_1, D\_2, \cdots, D\_n$$，它们的笛卡尔积是$${(d\_1, d\_2, \cdots, d\_n) | d\_i \in D\_i}$$
* 元组：笛卡尔积中的元素
* 分量：每个元素$$(d\_1, d\_2, \cdots, d\_n)$$中的$$d\_i$$
* 基数：元组的个数，$$|\prod\_{i=1}^{n} D\_i| = \prod\_{i=1}^{n} |D\_i|$$
* 笛卡尔积的表示方法：二维表，行是元组，列是域

### 关系

* 关系：$$\prod\_{i=1}^{n} D\_i$$的子集，叫做在域$$D\_1, D\_2, \cdots, D\_n$$上的关系，表示为$$R(D\_1, D\_2, \cdots, D\_n)$$
  * $$R$$：关系名
  * $$n$$：关系的度，$$n$$元关系
* 元组：关系中的每个元素，用$$t$$表示
* 也可用二维表表示
* 属性：每一列的名字
* 码
  * 候选码 Candidate Key：唯一标识元组的属性集，且其任意真子集都不能唯一标识元组
  * 主码：选定多个候选码中的一个
  * 主属性：主码中的属性
  * 外码：表中的属性，引用另一表的主码

#### 关系的类别

* 基本关系：实际存在的表，实际储存数据的逻辑表示
* 查询表：查询结果对应的表
* 视图表：由基本表或其他视图表导出的表，是虚表，不对应实际储存的数据

#### 基本关系的性质

* 列是同质的：每一列中的分量来自同一个域
* 不同的列可以出自同一个域：不同列的定义域可能相同
* 行、列的顺序无关紧要
* 任何两个元组的候选码不能相同
* 分量必须取原子值：每一个分量都是不可再分的数据项

#### 关系模式

* 对关系的描述，静态的、稳定的
  * 关系是动态的
* 定义：$$R(U,D,DOM,F)$$
  * $$R$$：关系名
  * $$U$$：属性名
  * $$D$$：属性的域
  * $$DOM$$：属性向域的映像集合
  * $$F$$：属性间的数据依赖关系
* 可简记为 $$R(U)$$ 或 $$R(A\_1,A\_2,\cdots,A\_n)$$，$$A\_i$$ 是属性名

### 关系数据库

* 所有关系的集合构成关系数据库
* 关系数据库的型: 关系数据库模式，是对关系数据库的描述
* 关系数据库的值: 关系模式在某一时刻对应的关系的集合，通常称为关系数据库

## 关系的完整性

* 实体完整性：主属性非空（不存在、无意义的数据）
* 参照完整性：当关系$$R\_1$$的外码引用关系$$R\_2$$的主码时，$$R\_1$$的每个元组的外码值必须是$$R\_2$$的某个元组的主码值或空值
* 用户定义完整性：用户自定义的完整性约束

## 关系操作 & 关系代数

### 集合运算

* 并：$$R \cup S = {t | t \in R \lor t \in S}$$，$$R$$ 和 $$S$$ 的属性、目数必须相同
* 交：$$R \cap S = {t | t \in R \land t \in S}$$，$$R$$ 和 $$S$$ 的属性、目数必须相同
* 差：$$R - S = {t | t \in R \land t \notin S}$$，$$R$$ 和 $$S$$ 的属性、目数必须相同
* 笛卡尔积
  * $$R$$：$$n$$目关系，$$k\_1$$个属性
  * $$S$$：$$m$$目关系，$$k\_2$$个属性
  * $$R \times S$$：$$n+m$$目关系，$$k\_1\*k\_2$$个属性
  * $$R \times S = {\overset{\frown}{t\_1 t\_2} | t\_1 \in R \land t\_2 \in S}$$
  * $$\overset{\frown}{t\_1 t\_2}$$：$$t\_1$$ 和 $$t\_2$$ 的连接

### 关系运算

* 选择（行的运算）：$$\sigma\_{F}(R)={t | t \in R \land F(t)}$$，$$F$$ 是布尔表达式（返回真或假），筛选满足 $$F$$ 的元组
* 投影（列的运算）：$$\Pi\_{A}(R)={t\[A] | t \in R}$$，$$A$$ 是属性名，筛选 $$A$$ 对应的列
  * 可能会导致行的减少：列删除后可能会产生重复的元组
* 连接：$$R \underset{A \theta B}{\bowtie} S = {\overset{\frown}{t\_r t\_s} | t\_r \in R \land t\_s \in S \land (t\_r\[A] \theta t\_s\[B])}$$
  * 在笛卡尔积后，选择符合条件，即$$t\_r\[A] \theta t\_s\[B]$$为真的元组
  * 等值连接：$$\theta$$ 是等于号，比较两个属性的值是否相等（不合并相同属性列）
  * 自然连接：特殊的等值连接，合并$$R$$ 和 $$S$$ 的相同属性列
  * 悬浮元组 Dangling tuple：在自然连接中，$$R$$ 中某些元组有可能在$$S$$中不存在公共属性上值相等的元组，导致$$R$$ 中的元组被舍弃
  * 外连接：保留悬浮元组，空值填充 `NULL`
  * 左/右外连接：只保留左/右表的悬浮元组，悬浮元组中右/左表独有的属性置为 `NULL`
* 除（行和列的运算）：$$R \div S = {t\_r\[X] | t\_r \in R \land \Pi\_Y(S)\subseteq Y\_X }$$，$$A$$ 和 $$B$$ 是属性名
  * $$R$$有属性$$X$$和$$Y$$，$$S$$有属性$$Y$$,$$Z$$，$$Y\_R$$和$$Y\_S$$的域相同
  * 找出满足所有$$Y$$的$$X$$（$$X$$的象集能够包含$$\pi\_Y(S)$$）
  * $$x$$在$$R$$中的象集：$$Y\_x={t\[Y] | \exists t \in R, t\[X]=x}$$
