关系数据库核心技术:从理论到实战的备考全解析

关系数据库是数据库系统工程师考试的“核心战场”——从关系模型的数学基础,到关系运算的逻辑推导;从查询优化的性能调优,到模式设计的规范化理论,每一个环节都需要深度理解。本文作为《数据库系统工程师备考》系列核心篇,围绕关系数据库基础、关系运算、元组/域演算、查询优化、设计理论五大模块,助您构建“理论+实战”的知识体系。


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必须是学生表存在的SnoNULL 外码与主码的匹配规则
用户定义完整性 用户自定义的约束(如范围、格式) 学生年龄Sage必须在15-30之间 CHECK约束、UNIQUE约束的应用

案例
电商订单表Orders(Ono, Cno, Odate),其中Cno是客户表Customers(Cno)的外码:

若插入Cno='C001',则Customers表必须存在C001(参照完整性)。
CnoNULL(如匿名订单),则允许插入(外码可为空)。


7.2 关系运算:从“查询需求”到“代数表达式”的转换

关系运算是关系数据库的“查询语言基础”,通过关系代数表达式描述数据操作。

7.2.1 关系代数运算:“集合操作”与“关系特有的操作”

关系代数的运算分为传统集合运算(并、差、交、笛卡尔积)和专门关系运算(选择、投影、连接、除)。

7.2.2 五种基本的关系代数运算:“所有运算的基石”

运算 符号 定义 示例
并(∪) 两个同构关系的元组合并(去重) 学生表S1S2的并集: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]θccθ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:域变量xiyj满足θ关系(如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表在OdateAmount上有联合索引,优化器会优先使用索引扫描,避免全表扫描。

优化后效果

全表扫描:需读取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→SdeptSdept→DeptHead,则Sno→DeptHead)。

案例
已知关系模式R(A,B,C,D),函数依赖A→BB→CC→D,推导A→D

由传递律,A→BB→CA→C
再由传递律,A→CC→DA→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→SnameSno→SdeptSdept→DeptHead

分解为2NF

R1(Sno,Sname,Sdept)(主码Sno,包含Sno→SnameSno→Sdept)。
R2(Sdept,DeptHead)(主码Sdept,包含Sdept→DeptHead)。

特性验证

无损连接:R1 ⋈ R2可恢复原R(通过Sdept连接)。
保持依赖:原依赖Sno→SnameSno→SdeptSdept→DeptHead均被分解后的R1和R2保持。


备考重点与考试趋势

1. 高频考点总结

关系完整性约束:实体完整性(主码非空唯一)、参照完整性(外码匹配规则)的判断。
关系代数运算:自然连接、除运算的表达式书写(如查询选了所有课程的学生)。
元组/域演算:将SQL查询转换为演算表达式(如查询年龄>20的学生姓名)。
查询优化策略:选择/投影下推的应用(如通过等价变换减少中间结果大小)。
规范化理论:判断关系模式属于第几范式(如存在部分依赖则为1NF),模式分解的无损连接性判断。

2. 数据库系统工程师考试趋势

关系代数与SQL的映射:给出SQL查询,要求写出对应的关系代数表达式(如SELECT对应投影和选择)。
规范化的实际应用:给出存在冗余的关系模式,要求分解到3NF并验证无损连接和保持依赖。
函数依赖推导:基于Armstrong公理推导新的函数依赖(如由X→Y和Y→Z推导X→Z)。


总结:关系数据库是考试的“核心枢纽”

从关系模型的数学基础,到关系运算的逻辑推导;从查询优化的性能调优,到模式设计的规范化理论,关系数据库贯穿数据库系统工程师考试的始终。备考时,建议通过手动书写关系代数表达式分析元组/域演算的逻辑条件模拟模式分解过程,将理论与实践结合,真正掌握这一核心技能。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容