---
title: 数据库原理-关系数据
abbrlink: 8ce31cb6
date: "2025-09-20 11:04:55"
updated: "2025-09-20 13:29:35"
desc: 关系数据模型（Relational Data Model）是基于集合论和关系代数的数据库模型，由 E.F. Codd 于 1970 年提出。它将数据组织为关系（Relation），每个关系是一个二维表，行称为元组（Tuple），列称为属性（Attribute）。
categories:
    - 数据库原理
tags:
    - 数据库
    - 关系数据
---

:::tip

含有ai生成内容

AI整理文本

:::

## 关系数据模型的形式化定义

关系数据模型（Relational Data Model）是基于集合论和关系代数的数据库模型，由 E.F. Codd 于 1970 年提出。它将数据组织为关系（Relation），每个关系是一个二维表，行称为元组（Tuple），列称为属性（Attribute）。

### 基本概念

- **域（Domain）**：域 D 是一个值的集合，所有值具有相同的数据类型。例如，整数域 D_int = {..., -1, 0, 1, ...}，字符串域 D_string = {所有字符串}。
- **属性（Attribute）**：属性 A 是关系中的一列，对应一个域 D。属性名唯一标识列。
- **元组（Tuple）**：元组 t 是关系中的一行，由 n 个值组成，每个值来自对应属性的域。形式化表示为 t = <v1, v2, ..., vn>，其中 vi ∈ D_i。
- **关系（Relation）**：关系 R 是元组的集合，定义为 R ⊆ D1 × D2 × ... × Dn，其中 n 是关系的度（Degree）。关系可以表示为二维表：
    - 行：元组。
    - 列：属性。
      关系模式（Relation Schema）：关系模式 $$ R(A_1:D_1, A_2:D_2, \dots, A_n:D_n) $$ 定义关系的结构，包括属性名和对应域。
- **关系实例（Relation Instance）**：关系在某一时刻的具体元组集合。

### 示例关系

考虑学生关系 Student(SID: int, Name: string, Age: int)：

| SID | Name  | Age |
| --- | ----- | --- |
| 1   | Alice | 20  |
| 2   | Bob   | 22  |
| 3   | Carol | 21  |

- 度：3（三个属性）。
- 基数：3（三个元组）。

## 关系的运算

关系运算基于关系代数（Relational Algebra），包括集合运算和专门运算。运算结果仍是关系，可以用表格表示。

### 集合关系运算

假设有两个关系 R 和 S，具有相同的属性（兼容）。

1. **并（Union）**：R ∪ S = {t | t ∈ R ∨ t ∈ S}。合并两个关系的元组，去除重复。
    - 示例：学生表 A 和 B。
        - A:

            | SID | Name  |
            | --- | ----- |
            | 1   | Alice |
            | 2   | Bob   |

        - B:
            | SID | Name  |
            | --- | ----- |
            | 2   | Bob   |
            | 3   | Carol |
        - A ∪ B:
            | SID | Name  |
            | --- | ----- |
            | 1   | Alice |
            | 2   | Bob   |
            | 3   | Carol |

2. **交（Intersection）**：R ∩ S = {t | t ∈ R ∧ t ∈ S}。取共同元组。
    - 示例：A ∩ B:
        | SID | Name |
        | --- | ---- |
        | 2   | Bob  |

3. **差（Difference）**：R - S = {t | t ∈ R ∧ t ∉ S}。取 R 中不在 S 中的元组。
    - 示例：A - B:
        | SID | Name  |
        | --- | ----- |
        | 1   | Alice |

### 选择运算（Selection）

选择 $$ \sigma\_{\text{条件}}(R) $$ 从关系 R 中选择满足条件的元组。

- 形式化：$$ \sigma_F(R) = \{ t \mid t \in R \land F(t) = \text{true} \} $$，其中 F 是条件（如 Age > 20）。
- 示例：σ_Age>20(Student)
    - 原表：
        | SID | Name  | Age |
        | --- | ----- | --- |
        | 1   | Alice | 20  |
        | 2   | Bob   | 22  |
        | 3   | Carol | 21  |
    - 结果：
        | SID | Name  | Age |
        | --- | ----- | --- |
        | 2   | Bob   | 22  |
        | 3   | Carol | 21  |

### 投影运算（Projection）

投影 $$ \pi\_{\text{属性列表}}(R) $$ 从关系 R 中选择指定属性，去除重复。

- 形式化：$$ \pi\_{A_1, A_2, \dots, A_k}(R) = \{ t[A_1, A_2, \dots, A_k] \mid t \in R \} $$。
- 示例：π_Name,Age(Student)
    - 原表：
        | SID | Name  | Age |
        | --- | ----- | --- |
        | 1   | Alice | 20  |
        | 2   | Bob   | 22  |
        | 3   | Carol | 21  |
    - 结果：
        | Name  | Age |
        | ----- | --- |
        | Alice | 20  |
        | Bob   | 22  |
        | Carol | 21  |

### 连接运算（Join）

连接将两个关系基于条件组合。

- **自然连接（Natural Join）**：$$ R \bowtie S = \{ t[r] \cup t[s] \mid t[r] \in R, t[s] \in S, t[r][A] = t[s][A] \text{ for common attributes } A \} $$。
- 示例：学生表 Student(SID, Name) 和成绩表 Grade(SID, Course, Score)。
    - Student:
        | SID | Name  |
        | --- | ----- |
        | 1   | Alice |
        | 2   | Bob   |
    - Grade:
        | SID | Course | Score |
        | --- | ------ | ----- |
        | 1   | Math   | 90    |
        | 2   | Math   | 85    |
    - Student ⋈ Grade:
        | SID | Name  | Course | Score |
        | --- | ----- | ------ | ----- |
        | 1   | Alice | Math   | 90    |
        | 2   | Bob   | Math   | 85    |

- **θ-连接**：$$ R \bowtie\_\theta S = \{ t[r] \cup t[s] \mid t[r] \in R, t[s] \in S, \theta(t[r], t[s]) \} $$，θ 是比较条件。
- **外连接**：左外连接 $$ (R \ltimes S) $$、右外连接 $$ (R \rtimes S) $$、全外连接 $$ (R \bowtie_L S) $$，保留不匹配的元组，用 null 填充。

### 除运算（Division）

除 $$ R \div S $$ 基于 S 的属性划分 R。

- 形式化：$$ R \div S = \{ t \mid \forall u \in S, t \cup u \in R \} $$，其中 S 的属性是 R 的子集。
- 示例：供应商表 Supplier(SID, Part) 和零件表 Part(PID)。
    - Supplier:
        | SID | Part |
        | --- | ---- |
        | 1   | A    |
        | 1   | B    |
        | 2   | A    |
    - Part:
        | Part |
        | ---- |
        | A    |
        | B    |
    - Supplier ÷ Part:
        | SID |
        | --- |
        | 1   |

### 换名操作（Rename）

换名 $$ \rho*{\text{NewName}}(R) $$ 或 $$ \rho*{A \to B}(R) $$ 重命名关系或属性。

- 示例：ρ_StudentTable(Student) 将 Student 重命名为 StudentTable。
- 属性换名：ρ_SID→StudentID(Student) 将 SID 改为 StudentID。

## 关系的完整性约束

完整性约束确保数据库数据的正确性和一致性。

### 实体完整性（Entity Integrity）

- **定义**：关系的主键不能为 null。每个元组的主键值必须唯一且非空。
- **原因**：主键唯一标识元组，null 值会破坏唯一性。
- **示例**：在 Student 表中，SID 为主键，不能有 null 或重复值。

### 参照完整性（Referential Integrity）

- **定义**：外键的值必须匹配参照关系的主键，或为 null（如果允许）。
- **原因**：维护关系间的引用一致性，避免悬空引用。
- **示例**：Grade 表的 SID 外键必须存在于 Student 表的 SID 中。

### 用户定义完整性（User-Defined Integrity）

- **定义**：根据应用需求定义的约束，如域约束、检查约束。
- **类型**：
    - **域约束**：属性值必须在域内（如 Age > 0）。
    - **检查约束**：元组级条件（如 Score BETWEEN 0 AND 100）。
    - **断言**：跨关系约束。
- **示例**：Age 属性必须 >= 18。


---

**作者：**xingwangzhe

**本文链接：**[https://xingwangzhe.fun/posts/8ce31cb6/](https://xingwangzhe.fun/posts/8ce31cb6/)

本文采用[知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-sa/4.0/)进行许可。