前置知识: 计算机基础

数据库系统原理

9 minIntermediate2026/6/14

数据库系统原理:关系模型、关系代数、函数依赖、范式理论与查询优化

1. 数据库系统概述

1.1 数据模型演进

模型年代特点
层次模型1960s树形结构
网状模型1960s形结构
关系模型1970s二维表,数学基础
对象模型1990s面向对象
NoSQL2000s非关系型
NewSQL2010s兼顾关系与扩展

1.2 数据库系统结构

三级模式结构

  • 外模式:用户视
  • 概念模式:全局逻辑结构
  • 内模式:物理存储结构

两级映象

  • 外模式/模式映象:保证逻辑数据独立性
  • 模式/内模式映象:保证物理数据独立性

2. 关系模型

2.1 基本概念

  • 关系:一个二维表
  • 元组:表中的一行
  • 属性:表中的一列
  • :属性的取值范围
  • :唯一标识元组的属性集

2.2 关系完整性

实体完整性:主键不能为 NULL。

参照完整性:外键必须引用已存在的主键值或为 NULL。

用户定义完整性:业务规则约束(如年龄 > 0)。

3. 关系代数

3.1 基本运算

选择(Selection)σcondition(R)\sigma_{condition}(R)

选取满足条件的元组。

投影(Projection)πA1,A2,...,An(R)\pi_{A_1,A_2,...,A_n}(R)

选取指定属性列。

并(Union)RSR \cup S

两关系元组的并集(需并相容)。

差(Difference)RSR - S

在 R 但不在 S 的元组。

笛卡尔积(Cartesian Product)R×SR \times S

两关系元组的所有组合。

更名(Rename)ρnew_name(R)\rho_{new\_name}(R)

3.2 导出运算

交(Intersection)

RS=R(RS)R \cap S = R - (R - S)

连接(Join)

RconditionS=σcondition(R×S)R \bowtie_{condition} S = \sigma_{condition}(R \times S)

自然连接

RS=πattrs(σR.A=S.A(R×S))R \bowtie S = \pi_{attrs}(\sigma_{R.A=S.A}(R \times S))

除(Division)

R÷S={tsS:(t,s)R}R \div S = \{t \mid \forall s \in S: (t, s) \in R\}

用于”查找包含所有…的…”查询。

3.3 关系代数示例

“查找选修了所有课程的学生”:

π学号,课程号(选课)÷π课程号(课程)\pi_{学号,课程号}(选课) \div \pi_{课程号}(课程)

“查找年龄大于20的计算机系学生姓名”:

π姓名(σ年龄>20系别=计算(学生))\pi_{姓名}(\sigma_{年龄>20 \wedge 系别='计算机'}(学生))

4. 函数依赖与范式

4.1 函数依赖

定义:若 RR 中任意两个元组在属性集 XX 上的值相同,则在属性集 YY 上的值也相同,记为 XYX \to Y

Armstrong 公理

  1. 自反律:若 YXY \subseteq X,则 XYX \to Y
  2. 增广律:若 XYX \to Y,则 XZYZXZ \to YZ
  3. 传递律:若 XYX \to YYZY \to Z,则 XZX \to Z

推导规则

  • 合并律:XYX \to YXZX \to Z,则 XYZX \to YZ
  • 分解律:XYZX \to YZ,则 XYX \to YXZX \to Z
  • 伪传递律:XYX \to YYWZYW \to Z,则 XWZXW \to Z

4.2 属性闭包

X+={AXA 可由 Armstrong 公理推出}X^+ = \{A \mid X \to A \text{ 可由 Armstrong 公理推出}\}

用途

  • 判断 XYX \to Y 是否成立:YX+Y \subseteq X^+
  • 求候选键:X+=UX^+ = U 的最小属性集

4.3 最小函数依赖集

满足以下条件的函数依赖集 FF

  1. 每个依赖的右部是单个属性
  2. 不存在冗余依赖
  3. 每个依赖的左部无冗余属性

4.4 范式

1NF:属性不可再分。

2NF:在 1NF 基础上,非主属性完全函数依赖于候选键(消除部分依赖)。

3NF:在 2NF 基础上,非主属性不传递依赖于候选键。

3NF:XY    X 是超键Y 是主属性3NF: X \to Y \implies X \text{ 是超键} \vee Y \text{ 是主属性}

BCNF:在 3NF 基础上,每个决定因素都是候选键。

BCNF:XY    X 是超键BCNF: X \to Y \implies X \text{ 是超键}

范式关系

BCNF3NF2NF1NFBCNF \subset 3NF \subset 2NF \subset 1NF

4.5 模式分解

无损连接分解

R=R1R2R = R_1 \bowtie R_2

判定条件:(R1R2)(R1R2)(R_1 \cap R_2) \to (R_1 - R_2)(R1R2)(R2R1)(R_1 \cap R_2) \to (R_2 - R_1)

保持函数依赖分解

F+=(F1F2...Fn)+F^+ = (F_1 \cup F_2 \cup ... \cup F_n)^+

目标:既无损连接又保持函数依赖的分解。

  • 总能无损连接地分解到 BCNF
  • 不一定能既无损又保依赖地分解到 BCNF
  • 总能既无损又保依赖地分解到 3NF

5. 关系演算

5.1 元组关系演算

{tP(t)}\{t \mid P(t)\}

其中 P(t)P(t) 是谓词公式。

示例:查找年龄大于20的学生

{tStudent(t)t.age>20}\{t \mid Student(t) \wedge t.age > 20\}

5.2 域关系演算

{<x1,x2,...,xn>P(x1,x2,...,xn)}\{<x_1, x_2, ..., x_n> \mid P(x_1, x_2, ..., x_n)\}

5.3 表达能力等价

关系代数 ≡ 元组关系演算(安全表达式)≡ 域关系演算(安全表达式)

6. 查询优化

6.1 查询处理流程

SQL 查询 → 解析 → 查询树 → 逻辑优化 → 物理优化 → 执行计划

6.2 逻辑优化(代数优化)

基于等价变换规则的优化

  1. 选择下推:尽早执行选择操作
  2. 投影下推:尽早执行投影操作
  3. 连接顺序优化:小关系先连接

σc1c2(RS)=σc1(R)σc2(S)\sigma_{c_1 \wedge c_2}(R \bowtie S) = \sigma_{c_1}(R) \bowtie \sigma_{c_2}(S)

6.3 物理优化

选择操作的实现

方法适用条件代价
顺序扫描无索引O(n)O(n)
索引扫描有合适索引O(logn+k)O(\log n + k)

连接操作的实现

方法代价内存需求
嵌套循环O(n×m)O(n \times m)
排序归并O(nlogn+mlogm)O(n\log n + m\log m)
哈希连接O(n+m)O(n + m)

6.4 代价模型

总代价=I/O 代价+CPU 代价\text{总代价} = \text{I/O 代价} + \text{CPU 代价}

通常 I/O 代价是主要因素:

CIO=页面读写次数×tIOC_{IO} = \text{页面读写次数} \times t_{IO}

7. 事务管理

7.1 ACID 特性

特性含义实现技术
原子性事务不可分割日志(WAL)
一致性数据保持一致约束检查
隔离性事务互不干扰锁/MVCC
持久性提交后永久保存日志刷盘

7.2 并发问题

问题描述
脏读读到未提交数据
不可重复读同一查询两次结果不同
幻读同一查询两次行数不同

7.3 隔离级别

级别脏读不可重复读幻读
读未提交可能可能可能
读已提交避免可能可能
可重复读避免避免可能
序列化避免避免避免

7.4 封锁协议

两阶段锁(2PL)

  • 增长阶段:只加锁,不放锁
  • 收缩阶段:只放锁,不加锁

2PL 保证可串行化,但可能导致死锁。

死锁处理

  • 超时检测
  • 等待检测
  • 死锁预防(等待-死亡、伤害-等待)