关系数据库是数据库系统工程师考试的“核心战场”——从关系模型的数学基础,到关系运算的逻辑推导;从查询优化的性能调优,到模式设计的规范化理论,每一个环节都需要深度理解。本文作为《数据库系统工程师备考》系列核心篇,围绕关系数据库基础、关系运算、元组/域演算、查询优化、设计理论五大模块,助您构建“理论+实战”的知识体系。
7.1 关系数据库概述:从数学到工程的“关系模型”
7.1.1 基础知识:关系的“数学定义”
关系数据库的理论基础是关系代数,其核心概念源于集合论:
笛卡尔积(Cartesian Product):设D1,D2,...,Dn为n个域(数据集合),则笛卡尔积为所有可能的元组集合:
D1×D2×…×Dn = {(d1,d2,…,dn) | di∈Di, i=1,2,…,n}
关系(Relation):笛卡尔积的有限子集,用二维表表示。表中每行是一个元组(记录),每列是一个属性(字段)。
关键术语:
候选键(Candidate Key):能唯一标识元组的最小属性集(如学生表的“学号”)。
主码(Primary Key):从候选键中选定的一个(如“学号”作为主码)。
外码(Foreign Key):属性或属性组,引用另一个关系的主码(如选课表的“学号”引用学生表的主码)。
示例:
学生表Students(Sno, Sname, Sdept):
候选键:Sno(学号唯一)。
主码:Sno。
7.1.2 关系数据库模式:“结构定义”与“实例数据”
关系数据库模式(Schema)是关系的“结构定义”,而关系实例(Instance)是某一时刻的具体数据。
模式定义:
R(U, D, DOM, F),其中:
U:属性集合(如Sno,Sname,Sdept)。
D:属性的域(如Sno的域是CHAR(8))。
DOM:属性到域的映射(如Sno→CHAR(8))。
F:数据依赖(如Sno→Sname)。
示例模式:
学生表模式:Students(Sno CHAR(8), Sname VARCHAR(20), Sdept VARCHAR(10))。
7.1.3 关系的完整性约束:“数据正确性”的保障
关系数据库通过三类完整性约束确保数据的正确性:
| 类型 | 定义 | 示例 | 考试重点 |
|---|---|---|---|
| 实体完整性 | 主码值非空且唯一 | 学生表Sno不能为NULL |
主码必须满足非空和唯一 |
| 参照完整性 | 外码值要么是被参照表的主码值,要么为NULL |
选课表Sno必须是学生表存在的Sno或NULL |
外码与主码的匹配规则 |
| 用户定义完整性 | 用户自定义的约束(如范围、格式) | 学生年龄Sage必须在15-30之间 |
CHECK约束、UNIQUE约束的应用 |
案例:
电商订单表Orders(Ono, Cno, Odate),其中Cno是客户表Customers(Cno)的外码:
若插入Cno='C001',则Customers表必须存在C001(参照完整性)。
若Cno为NULL(如匿名订单),则允许插入(外码可为空)。
7.2 关系运算:从“查询需求”到“代数表达式”的转换
关系运算是关系数据库的“查询语言基础”,通过关系代数表达式描述数据操作。
7.2.1 关系代数运算:“集合操作”与“关系特有的操作”
关系代数的运算分为传统集合运算(并、差、交、笛卡尔积)和专门关系运算(选择、投影、连接、除)。
7.2.2 五种基本的关系代数运算:“所有运算的基石”
| 运算 | 符号 | 定义 | 示例 |
|---|---|---|---|
| 并(∪) | ∪ | 两个同构关系的元组合并(去重) | 学生表S1和S2的并集:S1∪S2(所有学生) |
| 差(-) | – | 属于R但不属于S的元组 | 学生表S中未选课程的学生:S - SC.Sno |
| 笛卡尔积(×) | × | 两个关系的所有元组组合(n×m行) | 学生表×课程表:生成所有学生-课程组合 |
| 选择(σ) | σ_F | 选择满足条件F的元组(行过滤) | 选年龄>20的学生:σ_{Sage>20}(Students) |
| 投影(π) | π_A | 选择指定属性列(列过滤) | 投影学生姓名和系别:π_{Sname,Sdept}(Students) |
实战案例:
某高校学生表Students(Sno,Sname,Sage),用关系代数表达“查询年龄>20且计算机系(Sdept=‘CS’)的学生姓名”:
π_{Sname}(σ_{Sage>20 ∧ Sdept='CS'}(Students))
7.2.3 扩展的关系运算:“复杂查询的利器”
| 运算 | 符号 | 定义 | 示例 |
|---|---|---|---|
| 交(∩) | ∩ | 同时属于R和S的元组(R∩S=R-(R-S)) | 同时选了课程C001和C002的学生:SC1 ∩ SC2 |
| θ连接(⋈_θ) | ⋈_θ | 按条件θ连接两个关系(如AθB) | 学生表与选课表按Sno=Sno连接:Students ⋈_{Sno=Sno} SC |
| 自然连接(⋈) | ⋈ | 同名属性等值连接,去重重复列 | 学生表与选课表自然连接(自动匹配Sno):Students ⋈ SC |
| 除(÷) | ÷ | 找出在R中满足与S所有元组匹配的元组 | 查询选了所有课程的学生:SC ÷ Courses |
案例:自然连接的应用
学生表Students(Sno,Sname),选课表SC(Sno,Cno,Score),自然连接后结果:
| Sno | Sname | Cno | Score |
|---|---|---|---|
| 001 | 张三 | C001 | 90 |
| 002 | 李四 | C001 | 85 |
7.3 元组演算:“基于元组变量”的查询描述
元组演算是一种非过程化查询语言,通过元组变量(表示关系中的一行)和逻辑公式描述查询需求。
7.3.1 原子公式:“最基本的逻辑条件”
原子公式是元组演算的基础,包括三类:
R(t):元组变量t属于关系R(如Students(t)表示t是学生表的一个元组)。
t[A]θu[B]:元组t的属性A与元组u的属性B满足θ关系(如t[Sage]>u[Sage])。
t[A]θc或cθt[A]:元组t的属性A与常数c满足θ关系(如t[Sdept]='CS')。
7.3.2 公式的定义:“逻辑条件的组合”
公式由原子公式通过逻辑运算符(¬、∧、∨)和量词(∃、∀)组合而成。
示例公式:
查询年龄>20的学生姓名:
{ t[Sname] | Students(t) ∧ t[Sage]>20 }
7.3.3 关系代数运算转换为元组演算表达式
关系代数的每个运算都可以用元组演算表示,例如:
选择运算:σ_F(R) = { t | R(t) ∧ F(t) }(F(t)是选择条件)。
投影运算:π_A(R) = { t | ∃u(R(u) ∧ t[A]=u[A]) }(t是投影后的元组)。
案例:
关系代数表达式π_{Sname}(σ_{Sdept='CS'}(Students))对应的元组演算:
{ t[Sname] | Students(t) ∧ t[Sdept]='CS' }
7.4 域演算:“基于属性域”的查询描述
域演算与元组演算类似,但变量是属性域的值(列的取值),更接近SQL的列操作。
7.4.1 原子公式:“属性域的条件”
原子公式包括:
R(x1,x2,…,xn):x1,x2,…,xn是关系R的一个元组的各属性值(如Students(sno,sname,sdept))。
xiθyj:域变量xi与yj满足θ关系(如sno='001')。
7.4.2 公式的定义:“域变量的逻辑组合”
公式由原子公式通过逻辑运算符和量词(∃、∀)组合,变量是域变量(列的值)。
示例公式:
查询选了课程C001且成绩>90的学生姓名:
{ sname | ∃sno,score (Students(sno,sname,sdept) ∧ SC(sno,'C001',score) ∧ score>90) }
7.4.3 举例:域演算的实际应用
问题:查询计算机系(Sdept=‘CS’)学生的学号和姓名。
域演算表达式:
{ (sno,sname) | Students(sno,sname,'CS') }
7.5 查询优化:“从低效到高效”的执行计划改进
查询优化是关系数据库的“性能核心”,通过调整运算顺序,降低查询代价(如I/O次数、CPU时间)。
7.5.1 基本概念:“代价模型”与“优化目标”
代价模型:通常用“磁盘I/O次数”衡量(I/O是数据库的主要瓶颈)。
优化目标:找到代价最小的执行计划(如全表扫描 vs 索引扫描)。
7.5.2 关系代数表达式中的查询优化:“等价变换规则”的应用
优化策略通过等价变换规则重写关系代数表达式,常见规则如下:
| 规则 | 描述 | 优化前表达式 | 优化后表达式 | 代价对比 |
|---|---|---|---|---|
| 选择下推 | 将选择操作尽可能提前 | π_A(σ_F(R×S)) |
π_A(σ_F(R)×S) |
减少笛卡尔积的元组数量(原R×S有n×m行,优化后σ_F®×S有k×m行,k<n) |
| 投影下推 | 将投影操作提前,减少属性数量 | σ_F(π_A(R×S)) |
π_A(σ_F(R×S)) |
减少中间结果的列数(原R×S有p列,优化后π_A(R×S)有q列,q<p) |
| 合并选择与投影 | 合并相邻的选择和投影 | π_A(σ_F(π_B(R))) |
π_A(σ_F(R)) |
减少中间步骤(避免多次投影) |
实战案例:电商订单查询优化
需求:查询2023年1月1日以后下单(Odate>‘2023-01-01’)且金额>1000元(Amount>1000)的订单编号(Ono)和客户编号(Cno)。
原始表达式:
π_{Ono,Cno}(σ_{Odate>'2023-01-01' ∧ Amount>1000}(Orders))
优化思路:
若Orders表在Odate和Amount上有联合索引,优化器会优先使用索引扫描,避免全表扫描。
优化后效果:
全表扫描:需读取100万行数据(I/O代价高)。
索引扫描:通过索引直接定位符合条件的行(仅读取1万行,I/O代价降低99%)。
7.6 关系数据库设计基础理论:“避免数据冗余”的规范化
关系数据库设计的核心是规范化(Normalization),通过分解关系模式,消除数据冗余、插入/删除异常。
7.6.1 基础知识:“函数依赖”与“范式”
函数依赖(FD):若属性集X确定唯一的Y,则称Y函数依赖于X(X→Y)。
示例:学生表中Sno→Sname(学号确定姓名)。
范式(NF):关系模式满足的某种约束条件(1NF→2NF→3NF→BCNF)。
7.6.2 规范化:“逐步消除冗余”的过程
| 范式 | 定义 | 示例 | 解决的问题 |
|---|---|---|---|
| 1NF | 所有属性不可再分(原子性) | 订单表Orders(Ono, [商品列表])不符合1NF(商品列表可分) |
避免复合属性导致的存储混乱 |
| 2NF | 消除非主属性对主码的部分依赖 | 原模式SC(Sno,Cno,Sname,Score)(主码(Sno,Cno)),存在Sno→Sname(部分依赖),分解为Students(Sno,Sname)和SC(Sno,Cno,Score) |
避免插入异常(插入新课程时需学生信息) |
| 3NF | 消除非主属性对主码的传递依赖 | 原模式Dept(Sno,Sdept,DeptHead)(主码Sno),存在Sno→Sdept→DeptHead(传递依赖),分解为DeptInfo(Sdept,DeptHead)和StudentDept(Sno,Sdept) |
避免删除异常(删除最后一个学生时丢失系主任信息) |
7.6.3 Armstrong公理系统:“函数依赖推导”的逻辑规则
Armstrong公理是推导函数依赖的基础,包括:
自反律:若Y⊆X⊆U,则X→Y(如Sno,Sname→Sno)。
增广律:若X→Y,则XZ→YZ(如Sno→Sname,则Sno,Cno→Sname,Cno)。
传递律:若X→Y,Y→Z,则X→Z(如Sno→Sdept,Sdept→DeptHead,则Sno→DeptHead)。
案例:
已知关系模式R(A,B,C,D),函数依赖A→B,B→C,C→D,推导A→D:
由传递律,A→B且B→C ⇒ A→C。
再由传递律,A→C且C→D ⇒ A→D。
7.6.4 模式分解及分解后的特性:“无损连接”与“保持依赖”
模式分解需满足两个关键特性:
| 特性 | 定义 | 验证方法 | 示例 |
|---|---|---|---|
| 无损连接 | 分解后的关系通过自然连接可恢复原关系 | 构造初始表,根据函数依赖修改,若存在全a行则无损 | 分解R(A,B,C)为R1(A,B)和R2(B,C),自然连接后得到原R |
| 保持函数依赖 | 分解后的函数依赖集等价于原依赖集 | 检查所有原依赖是否被分解后的依赖覆盖 | 原依赖A→B,分解为R1(A,B)(保持A→B)和R2(A,C)(无新依赖) |
案例:
原模式R(Sno,Sname,Sdept,DeptHead),函数依赖Sno→Sname,Sno→Sdept,Sdept→DeptHead。
分解为2NF:
R1(Sno,Sname,Sdept)(主码Sno,包含Sno→Sname,Sno→Sdept)。
R2(Sdept,DeptHead)(主码Sdept,包含Sdept→DeptHead)。
特性验证:
无损连接:R1 ⋈ R2可恢复原R(通过Sdept连接)。
保持依赖:原依赖Sno→Sname、Sno→Sdept、Sdept→DeptHead均被分解后的R1和R2保持。
备考重点与考试趋势
1. 高频考点总结
关系完整性约束:实体完整性(主码非空唯一)、参照完整性(外码匹配规则)的判断。
关系代数运算:自然连接、除运算的表达式书写(如查询选了所有课程的学生)。
元组/域演算:将SQL查询转换为演算表达式(如查询年龄>20的学生姓名)。
查询优化策略:选择/投影下推的应用(如通过等价变换减少中间结果大小)。
规范化理论:判断关系模式属于第几范式(如存在部分依赖则为1NF),模式分解的无损连接性判断。
2. 数据库系统工程师考试趋势
关系代数与SQL的映射:给出SQL查询,要求写出对应的关系代数表达式(如SELECT对应投影和选择)。
规范化的实际应用:给出存在冗余的关系模式,要求分解到3NF并验证无损连接和保持依赖。
函数依赖推导:基于Armstrong公理推导新的函数依赖(如由X→Y和Y→Z推导X→Z)。
总结:关系数据库是考试的“核心枢纽”
从关系模型的数学基础,到关系运算的逻辑推导;从查询优化的性能调优,到模式设计的规范化理论,关系数据库贯穿数据库系统工程师考试的始终。备考时,建议通过手动书写关系代数表达式、分析元组/域演算的逻辑条件、模拟模式分解过程,将理论与实践结合,真正掌握这一核心技能。




















暂无评论内容