数据库系统 · 知识点梳理

📅 日期:2026-05-15

📚 科目:软件设计师 · 数据库系统

🏷️ 标签: 数据库关系代数范式 SQL事务并发控制

⭐ 重要度:高频考点(选择题 + 案例分析 + 论文)

📋 目录导航

一、数据库概述与三级模式

1.1 数据库发展阶段

阶段数据模型特点代表
第一代层次模型树形结构,一对多IMS
第一代网状模型图结构,多对多DBTG
第二代关系模型二维表结构,数学基础坚实Oracle, MySQL
第三代对象关系模型面向对象 + 关系PostgreSQL
新型NoSQL非关系型,高可扩展MongoDB, Redis

1.2 三级模式结构 ★★

三级模式与两层映射
层次名称别名内容对应对象
外层外模式子模式 / 用户模式用户看到的数据视图视图(VIEW)
中层模式概念模式 / 逻辑模式全局数据的逻辑结构基本表
内层内模式存储模式数据的物理存储方式物理文件

外模式/模式映射

保证:逻辑数据独立性

模式改变时,修改映射即可,外模式不变 → 应用程序不用改

模式/内模式映射

保证:物理数据独立性

存储结构改变时,修改映射即可,模式不变 → 逻辑结构不用改

🎯 三级模式速记

"外视内物中逻辑" → 外模式看视图,内模式管物理,模式是逻辑

"外/模式保逻辑独立,模式/内保物理独立"

1.3 数据库系统体系结构

📌 补充:集中式 / C/S / B/S 架构对比
架构特点优点缺点
集中式所有处理在主机完成管理简单扩展性差
C/S客户端负责表示逻辑,服务器负责数据管理响应快,交互好客户端维护成本高
B/S浏览器为客户端,Web服务器+数据库服务器部署简单,跨平台响应较慢

二、关系模型基础

2.1 关系模型基本术语

术语定义对应概念
关系一张二维表
元组表中的一行行 / 记录
属性表中的一列列 / 字段
属性的取值范围如:性别={男, 女}
基数关系中元组的个数行数
度(目)关系中属性的个数列数
候选键能唯一标识元组的最小属性集可能有多个
主键从候选键中选定的一个PRIMARY KEY
外键引用其他关系主键的属性FOREIGN KEY
超键能唯一标识元组的属性集(可含多余属性)候选键的超集
📝 关系性质(常考选择题)
  1. 列是同质的:每一列中的分量来自同一域
  2. 不同列可出自同一域,但每列必须有不同的属性名
  3. 列的顺序无所谓(列无序)
  4. 行的顺序无所谓(行无序)
  5. 任意两个元组不能完全相同
  6. 分量必须是原子值(第一范式要求

2.2 完整性约束

三大完整性约束
约束类型定义说明示例
实体完整性 主键不能为空(NOT NULL) 主键是元组的唯一标识 学生表的学号不能为空
参照完整性 外键值必须是被参照表中主键的有效值或NULL 外键引用必须有效 选课表的学号必须在学生表中存在
用户自定义完整性 用户定义的业务规则约束 CHECK、UNIQUE等 成绩在0-100之间

2.3 视图

视图的作用
作用说明
简化操作将复杂查询封装为视图
多方式查询不同用户通过不同视图访问数据
逻辑独立性模式改变时通过视图保持外模式不变
安全保护只暴露需要的数据给用户,隐藏敏感列
📌 补充:视图 vs 物化视图
对比普通视图物化视图
存储不存储数据(虚表)物理存储查询结果
查询速度每次查询重新计算直接读取,速度快
更新实时反映基表变化需刷新才能同步
空间不占空间占用存储空间

2.4 索引

索引类型对比
类型特点影响
聚簇索引数据物理存储顺序与索引顺序一致一个表只能有一个,影响内模式
非聚簇索引索引顺序与数据物理存储无关一个表可以有多个
唯一索引索引列的值不能重复保证数据唯一性
B+树索引最常用的索引结构查询效率O(log n)
💡 索引使用原则

适合建索引:查询频繁的列、WHERE/JOIN条件中的列、值分布广的列

不适合建索引:修改频繁的列、值很少的列(如性别)、小表

三、关系代数 ★★★

📝 考试重点

关系代数是案例分析必考内容,常考:选择、投影、连接、除法的表达式书写。

3.1 传统集合运算

运算符号定义要求
R ∪ S属于R或属于S的元组R和S同目(度相同)
R ∩ S既属于R又属于S的元组R和S同目
R - S属于R但不属于S的元组R和S同目
笛卡尔积R × SR的每个元组与S的每个元组组合无要求

3.2 专门的关系运算

选择(σ)— 行选择

符号:σ条件(R)

含义:从关系R中选取满足条件的元组(相当于SQL的WHERE

// 示例:查询年龄大于20的学生
σ年龄>20(Student)

// 等价SQL: SELECT * FROM Student WHERE 年龄 > 20

投影(π)— 列选择

符号:π属性列表(R)

含义:从关系R中选取指定的列(相当于SQL的SELECT列

// 示例:查询学生的姓名和年龄
π姓名,年龄(Student)

// 等价SQL: SELECT 姓名, 年龄 FROM Student
// 注意:投影会自动去除重复行!

连接(⋈)

连接类型详解
连接类型符号含义SQL对应
等值连接 R ⋈A=B S 在笛卡尔积中选取A=B的元组 WHERE R.A = S.B
自然连接 R ⋈ S 等值连接 + 去除重复列 NATURAL JOIN / USING
外连接 R ⟕ S / R ⟖ S / R ⟗ S 保留不匹配的元组(用NULL填充) LEFT/RIGHT/FULL OUTER JOIN
左外连接 R ⟕ S 保留R中所有元组 LEFT OUTER JOIN
右外连接 R ⟖ S 保留S中所有元组 RIGHT OUTER JOIN
全外连接 R ⟗ S 保留R和S中所有元组 FULL OUTER JOIN

除法(÷)

除法运算(案例分析常考)

符号:R ÷ S

含义:找出R中与S的所有元组都能匹配的元组在非公共属性上的投影

记忆:"找出...全部..."的问题就用除法

// R: 选课表(学号, 课程号)
// S: 某课程集合

// 查询"选修了S中所有课程的学生学号"
// 表达式:π学号,课程号(R) ÷ S

// 例:S = {C1, C2}
// R中选了C1和C2的学生才出现在结果中
💡 除法的本质

R ÷ S = πR-S的属性(R) - πR-S的属性((πR-S的属性(R) × S) - R)

简单理解:从R中去掉那些"没覆盖S全部"的元组

3.3 关系代数表达式总结

运算符号对应SQL操作对象
选择σWHERE
投影πSELECT 列
连接JOIN
除法÷NOT EXISTS嵌套"全部"问题
UNION元组
INTERSECT元组
-EXCEPT元组
笛卡尔积×CROSS JOIN元组
🎯 关系代数速记

σ选行,π选列,⋈连接,÷全部

并交差积是集合运算,选投连除是关系运算

四、规范化理论(函数依赖与范式)★★★

📝 考试重点

规范化理论是案例分析的高频考点,必须掌握:判断范式级别、分解到3NF/BCNF。

4.1 函数依赖

函数依赖类型
类型定义示例
完全函数依赖 X的任何真子集都不能决定Y,则Y完全依赖于X (学号,课程号) → 成绩(去掉任一个都不能确定成绩)
部分函数依赖 X的某个真子集就能决定Y (学号,课程号) → 姓名(学号 alone 就能决定姓名)
传递函数依赖 X→Y,Y→Z,且Y↛X,则Z传递依赖于X 学号→院系,院系→院长,则学号→院长(传递)
📌 补充:函数依赖的推理规则(Armstrong公理)
规则内容说明
自反律若Y⊆X,则X→Y属性集决定其子集
增广律若X→Y,则XZ→YZ两边同时加属性
传递律若X→Y,Y→Z,则X→Z依赖的传递
合并规则若X→Y,X→Z,则X→YZ合并右侧
分解规则若X→YZ,则X→Y,X→Z拆分右侧

4.2 候选键求解方法

📌 补充:求候选键的步骤(案例分析常考)
  1. 画函数依赖图:将所有函数依赖用有向图表示
  2. 分类属性
    • L类:只出现在依赖左边的属性 → 一定在候选键中
    • R类:只出现在依赖右边的属性 → 一定不在候选键中
    • LR类:两边都出现 → 可能在候选键中
    • N类:两边都不出现 → 一定在候选键中
  3. 计算闭包:从L+N类属性出发,计算属性闭包X+,若X+包含所有属性,则X是候选键
  4. 尝试LR类:若L+N的闭包不包含所有属性,逐个加入LR类属性再计算

4.3 范式体系 ★★★

🎯 范式强弱排序(必背!)

1NF ⊃ 2NF ⊃ 3NF ⊃ BCNF ⊃ 4NF

规范化程度越高,数据冗余越少,但查询越复杂(需要连接)

范式条件消除的问题关键词
1NF 每个属性都是不可再分的原子值 属性不可再分
2NF 在1NF基础上,消除非主属性对候选键的部分函数依赖 部分依赖 非主属性完全依赖于候选键
3NF 在2NF基础上,消除非主属性对候选键的传递函数依赖 传递依赖 非主属性不传递依赖于候选键
BCNF 在3NF基础上,消除主属性对候选键的部分和传递依赖 主属性的部分/传递依赖 每个决定因素都是候选键
4NF 在BCNF基础上,消除非平凡的多值依赖 多值依赖 消除多值依赖
📌 补充:BCNF详解(易混淆考点)

BCNF定义:关系R中,若每个决定因素都是候选键,则R属于BCNF。

判断方法:检查每个函数依赖X→Y,看X是否为超键。

// 例:关系 R(A,B,C),函数依赖:A→B, B→C
// 候选键:A
// 检查:A→B,A是候选键 ✓
// 检查:B→C,B不是候选键 ✗
// 结论:R属于3NF,但不属于BCNF
// 原因:B是决定因素但不是候选键

// 分解为BCNF:
// R1(B,C)  函数依赖:B→C
// R2(A,B)  函数依赖:A→B
// 两个关系的决定因素都是候选键,属于BCNF
📌 补充:多值依赖与4NF

多值依赖:若X→→Y,则X的每个值对应Y的一组值,且这组值与R的其他属性无关。

平凡多值依赖:Y⊆X 或 X∪Y=R

4NF条件:消除非平凡的多值依赖

// 例:关系(课程, 教师, 参考书)
// 一门课有多个教师,同时有多个参考书
// 教师和参考书之间没有直接关系
// 存在多值依赖:课程→→教师,课程→→参考书
// 不属于4NF,需要分解

4.4 规范化分解方法

分解原则
原则说明
无损连接性分解后能通过自然连接恢复原关系(必须满足
函数依赖保持分解后函数依赖不丢失(尽量满足

判断无损连接:若 R1∩R2 → R1-R2 或 R1∩R2 → R2-R1 成立,则分解是无损的。

📝 各范式判断速查

1NF:属性是否可再分?(可再分→不满足)

2NF:非主属性是否部分依赖于候选键?(是→不满足)

3NF:非主属性是否传递依赖于候选键?(是→不满足)

BCNF:每个决定因素是否都是候选键?(不是→不满足)

五、SQL语言 ★★★

📝 考试重点

SQL是案例分析必考内容,常考:查询语句编写、连接查询、子查询、GROUP BY/HAVING。

5.1 SQL语言分类

分类全称功能关键字
DDL数据定义语言定义和修改数据库结构CREATE, ALTER, DROP
DML数据操纵语言查询和修改数据SELECT, INSERT, UPDATE, DELETE
DCL数据控制语言权限控制GRANT, REVOKE
TCL事务控制语言事务管理COMMIT, ROLLBACK

5.2 DDL(数据定义)

-- 创建表
CREATE TABLE Student (
    Sno    CHAR(10)    PRIMARY KEY,      -- 主键
    Sname  VARCHAR(20) NOT NULL,          -- 非空
    Sage   INT         CHECK(Sage>=0),    -- 检查约束
    Sdept  CHAR(10)    DEFAULT '计算机系'  -- 默认值
);

-- 创建索引
CREATE INDEX idx_sname ON Student(Sname);          -- 非唯一索引
CREATE UNIQUE INDEX idx_sno ON Student(Sno);       -- 唯一索引

-- 修改表
ALTER TABLE Student ADD Sgender CHAR(2);           -- 添加列
ALTER TABLE Student DROP COLUMN Sgender;           -- 删除列
ALTER TABLE Student MODIFY Sname VARCHAR(30);      -- 修改列

-- 删除表
DROP TABLE Student;

5.3 DML(数据操纵)

-- 插入
INSERT INTO Student VALUES ('2024001', '张三', 20, '计算机系');
INSERT INTO Student(Sno, Sname) VALUES ('2024002', '李四');

-- 更新
UPDATE Student SET Sage = 21 WHERE Sno = '2024001';

-- 删除
DELETE FROM Student WHERE Sno = '2024001';

5.4 DQL(数据查询)— 重点 ★★★

-- 基本查询
SELECT Sname, Sage FROM Student WHERE Sage > 20;

-- 去重
SELECT DISTINCT Sdept FROM Student;

-- 排序
SELECT * FROM Student ORDER BY Sage DESC;  -- 降序

-- 模糊查询
SELECT * FROM Student WHERE Sname LIKE '张%';  -- 张开头
SELECT * FROM Student WHERE Sname LIKE '_三';  -- 第二字为三

-- 聚合函数
SELECT COUNT(*), AVG(Sage), MAX(Sage), MIN(Sage), SUM(Sage)
FROM Student;

-- 分组查询(重点!)
SELECT Sdept, COUNT(*) AS 人数, AVG(Sage) AS 平均年龄
FROM Student
GROUP BY Sdept
HAVING COUNT(*) > 5;  -- 分组后过滤
⚠️ WHERE vs HAVING 易错点

WHERE:分组前过滤(不能用聚合函数)

HAVING:分组后过滤(可以用聚合函数)

-- 正确:HAVING用聚合函数
SELECT Sdept, COUNT(*) FROM Student GROUP BY Sdept HAVING COUNT(*) > 5;

-- 错误:WHERE不能用聚合函数
-- SELECT Sdept FROM Student WHERE COUNT(*) > 5;  ← 语法错误!

5.5 连接查询

-- 等值连接
SELECT Student.Sname, SC.Grade
FROM Student, SC
WHERE Student.Sno = SC.Sno;

-- 内连接(推荐写法)
SELECT S.Sname, SC.Grade
FROM Student S INNER JOIN SC ON S.Sno = SC.Sno;

-- 左外连接(保留左表所有行)
SELECT S.Sname, SC.Grade
FROM Student S LEFT JOIN SC ON S.Sno = SC.Sno;

-- 右外连接(保留右表所有行)
SELECT S.Sname, SC.Grade
FROM Student S RIGHT JOIN SC ON S.Sno = SC.Sno;

-- 全外连接(保留两表所有行)
SELECT S.Sname, SC.Grade
FROM Student S FULL JOIN SC ON S.Sno = SC.Sno;

5.6 子查询

-- 非相关子查询(独立子查询,先执行内层)
SELECT Sname FROM Student
WHERE Sno IN (SELECT Sno FROM SC WHERE Cno = 'C1');

-- 相关子查询(内层引用外层变量,逐行执行)
SELECT Sname FROM Student S
WHERE EXISTS (
    SELECT * FROM SC
    WHERE SC.Sno = S.Sno AND SC.Cno = 'C1'
);

-- "全部"问题 → 用 NOT EXISTS + 双重否定
-- 查询选修了全部课程的学生姓名
SELECT Sname FROM Student S
WHERE NOT EXISTS (
    SELECT * FROM Course C
    WHERE NOT EXISTS (
        SELECT * FROM SC
        WHERE SC.Sno = S.Sno AND SC.Cno = C.Cno
    )
);
💡 "全部"问题的SQL写法

查询"选修了全部课程的学生" → NOT EXISTS + NOT EXISTS(双重否定表全称)

等价于关系代数的除法运算

口诀:"没有一门课他没选" = "他选了全部课"

5.7 视图操作

-- 创建视图
CREATE VIEW CS_Student AS
SELECT Sno, Sname, Sage FROM Student WHERE Sdept = '计算机系';

-- 查询视图(与表操作相同)
SELECT * FROM CS_Student WHERE Sage > 20;

-- 删除视图
DROP VIEW CS_Student;

5.8 DCL(数据控制)

-- 授权
GRANT SELECT, INSERT ON Student TO user1;
GRANT ALL PRIVILEGES ON Student TO user1;

-- 收权
REVOKE SELECT ON Student FROM user1;

六、E-R模型与数据库设计 ★★

6.1 E-R模型基本概念

概念图形含义示例
实体矩形现实世界中可区分的对象学生、课程
属性椭圆实体的特征姓名、年龄
联系菱形实体之间的关系选课
主键属性名加下划线唯一标识实体的属性学号

6.2 联系类型

类型表示示例转换规则
1:1 一对一 一个班级有一个班长 可将联系并入任一实体
1:N 一对多 一个班级有多个学生 将联系并入N端实体(加外键)
M:N 多对多 学生与课程(选课) 必须独立建表(关系表)

6.3 E-R图向关系模式转换

转换规则
E-R元素转换方式说明
实体转换为一个关系模式实体属性→关系属性,主键不变
1:1联系并入任一实体在任一方加入对方主键作为外键
1:N联系并入N端实体在N端加入1端主键作为外键
M:N联系独立建表关系表包含双方主键(联合主键)+ 联系属性
三个以上实体的多元联系独立建表包含各实体主键 + 联系属性
📌 补充:E-R图合并冲突
冲突类型说明示例
属性冲突同一属性在不同E-R图中类型/范围不同学号:一个用CHAR(10),一个用INT
命名冲突同名异义或异名同义"部门"和"处室"指同一概念
结构冲突同一实体在不同E-R图中结构不同一个E-R图中学生有年龄,另一个有出生日期

6.4 数据库设计过程

四阶段设计
阶段任务产出关键方法
需求分析 收集和分析用户需求 数据流图、数据字典、需求说明书 访谈、问卷、原型法
概念设计 建立概念模型 E-R图 E-R模型、视图集成法
逻辑设计 概念模型→关系模式 关系模式、规范化处理 E-R转关系模式、范式化
物理设计 确定存储结构和存取方法 物理存储方案 索引、聚簇、分区
📌 补充:反规范化技术(性能优化)

当规范化导致查询需要大量连接、性能下降时,可适当反规范化。

技术方法适用场景
增加冗余列在表中存储常用但来自其他表的列频繁连接查询
增加派生列存储计算结果(如总价=单价×数量)频繁计算
合并表将频繁一起查询的表合并1:1关系的表
分割表水平分割(按行)或垂直分割(按列)表过大、访问模式不同

6.5 SQL优化技巧

📌 补充:SQL优化原则
优化点建议原因
SELECT避免 SELECT *,只选需要的列减少数据传输和内存占用
子查询用不相关子查询代替相关子查询相关子查询逐行执行,效率低
IN vs ORIN 代替 ORIN可利用索引
EXISTS vs IN大表用EXISTS,小表用INEXISTS适合外表小内表大
JOIN合理使用JOIN代替子查询JOIN通常比嵌套子查询效率高
索引在WHERE/JOIN条件列上建索引加速查询
LIKE避免 LIKE '%abc'(左模糊)无法利用索引
连接池使用数据库连接池减少连接创建开销

七、事务与并发控制 ★★★

7.1 事务ACID特性

特性含义实现机制
A 原子性 事务中的操作要么全做,要么全不做 UNDO日志、回滚机制
C 一致性 事务执行前后数据库从一个一致状态到另一个一致状态 由其他三个特性共同保证
I 隔离性 并发事务之间互不干扰 封锁机制、MVCC
D 持久性 事务一旦提交,对数据库的改变是永久的 REDO日志
🎯 ACID速记

"原一隔永"(原子、一致、隔离、持久)

"一致性是目标,原子/隔离/持久是手段"

7.2 并发问题

并发事务带来的三大问题
问题定义示例
丢失更新 两个事务同时更新同一数据,一个的更新被覆盖 T1读A=10写A=20,T2读A=10写A=30,最终A=30(T1丢失)
不可重复读 同一事务内两次读取同一数据,结果不同(被其他事务修改) T1读A=10,T2改A=20并提交,T1再读A=20
读脏数据 读到其他事务未提交的数据(该事务可能回滚) T1改A=20但未提交,T2读A=20,T1回滚,T2读到无效数据

7.3 封锁技术

排他锁(X锁 / 写锁)

项目内容
加锁条件事务对数据进行写操作时加X锁
兼容性与其他任何锁不兼容
效果其他事务不能读也不能写

共享锁(S锁 / 读锁)

项目内容
加锁条件事务对数据进行读操作时加S锁
兼容性与其他S锁兼容,与X锁不兼容
效果其他事务可以读但不能写
锁兼容矩阵S锁X锁
S锁兼容 ✓不兼容 ✗
X锁不兼容 ✗不兼容 ✗

7.4 封锁协议

协议规则解决问题不能解决
一级封锁 修改数据前必须加X锁,事务结束释放 丢失更新 不可重复读、脏读
二级封锁 一级 + 读数据前加S锁读后即可释放 丢失更新 + 脏读 不可重复读
三级封锁 一级 + 读数据前加S锁事务结束才释放 丢失更新 + 脏读 + 不可重复读
📝 封锁协议记忆技巧

一级:只管写(X锁,事务结束释放)→ 防丢失更新

二级:管写+短读(X锁+S锁,读后释放)→ 防丢失更新+脏读

三级:管写+长读(X锁+S锁,事务结束释放)→ 防全部

口诀:"一写二短三长"

7.5 死锁与活锁

📌 补充:死锁与活锁(高频考点)

死锁

定义:两个或多个事务互相等待对方释放锁,形成循环等待

解决方法:

  • 预防:一次封锁法(一次性申请所有锁)、顺序封锁法(按固定顺序加锁)
  • 检测:等待图法(检测有向图中的环)
  • 解除:选择一个代价最小的事务回滚

活锁

定义:某个事务一直等待锁,但总被其他事务插队

解决方法:采用先来先服务策略

与死锁区别:活锁的事务有机会获得锁(理论上),死锁永远等不到

7.6 可串行化调度

📌 补充:可串行化(并发控制正确性标准)

可串行化调度:一个并发调度的结果等价于某个串行调度的结果,则该调度是可串行化的。

意义:可串行化是并发调度正确性的唯一标准

冲突可串行化

冲突操作:不同事务对同一数据的操作中至少有一个是写操作

判断方法:交换不冲突的操作,若能变成某个串行调度,则冲突可串行化。

优先图法:构造事务优先图,若图中无环则冲突可串行化。

7.7 两阶段锁协议(2PL)

两阶段锁协议
阶段规则说明
增长阶段只能获得锁,不能释放锁不断加锁
收缩阶段只能释放锁,不能获得锁不断解锁
💡 2PL的性质

2PL是可串行化的充分条件:遵循2PL的调度一定是可串行化的。

但2PL不能防止死锁:2PL可能导致死锁!

7.8 多版本并发控制(MVCC)

📌 补充:MVCC(现代数据库常用)

原理:为每个事务创建数据的"快照",读操作不阻塞写操作,写操作不阻塞读操作。

对比封锁机制MVCC
读写冲突读阻塞写,写阻塞读读写互不阻塞
并发度较低较高
实现锁表版本链
代表传统数据库PostgreSQL, MySQL InnoDB

八、数据库故障恢复

8.1 故障类型

故障类型原因恢复策略
事务故障事务执行中被撤销(运算溢出、违反约束等)UNDO(反向扫描日志,撤销修改)
系统故障系统崩溃(断电、OS故障),内存丢失UNDO未提交事务 + REDO已提交事务
介质故障磁盘损坏,数据丢失重装备份 + REDO(日志+备份恢复)

8.2 日志文件与恢复策略

UNDO / REDO 恢复策略
策略规则日志要求性能
UNDO 撤销未提交事务的修改 记录修改前的值(Before Image) 回滚较慢
REDO 重做已提交事务的修改 记录修改后的值(After Image) 恢复较快
UNDO+REDO 先UNDO未提交,再REDO已提交 同时记录前值和后值 最安全但日志量大

8.3 备份策略

按备份方式

类型说明
冷备份停止数据库后备份,简单但影响可用性
热备份数据库运行时备份,不影响正常使用

按备份范围

类型说明
完全备份备份所有数据
差量备份备份自上次完全备份后的变化
增量备份备份自上次备份(任何类型)后的变化

8.4 检查点机制

📌 补充:检查点(Checkpoint)

作用:定期将内存中的数据写入磁盘,减少恢复时需要扫描的日志量。

恢复步骤:

  1. 从检查点开始扫描日志
  2. 找出故障时的活动事务列表
  3. 对活动事务执行UNDO
  4. 对已提交事务执行REDO

8.5 数据库镜像

📌 补充:数据库镜像

原理:将数据库实时复制到另一个磁盘(镜像盘),当主盘故障时自动切换到镜像盘。

优点:提高可用性,减少介质故障恢复时间。

实现:通过日志传送或同步复制。

九、数据库安全与完整性

9.1 安全性措施

措施说明
用户标识与鉴定用户名/密码、生物识别
存取控制自主存取控制(DAC)、强制存取控制(MAC)
视图机制通过视图限制用户可见的数据
审计记录用户操作日志,事后追查
数据加密存储加密、传输加密

9.2 自主存取控制 vs 强制存取控制

DAC(自主存取控制)

MAC(强制存取控制)

9.3 完整性约束详解

📌 补充:完整性 vs 安全性
对比完整性安全性
关注点数据的正确性一致性数据的保护,防止未授权访问
防范对象不合语义的数据(如成绩为负数)非法用户和非法操作
实现方式CHECK、主键、外键、触发器用户认证、权限控制、加密
📌 补充:触发器

触发器:一种特殊的存储过程,在特定事件(INSERT/UPDATE/DELETE)发生时自动执行。

-- 创建触发器示例
CREATE TRIGGER check_grade
BEFORE INSERT ON SC
FOR EACH ROW
BEGIN
    IF NEW.Grade < 0 OR NEW.Grade > 100 THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = '成绩必须在0-100之间';
    END IF;
END;

十、分布式数据库与新技术

10.1 分布式数据库特点

特点说明
数据独立性数据分布对用户透明
集中与自治结合局部DBMS独立管理,全局统一协调
适当冗余多副本提高可用性和性能
全局一致性各节点数据保持一致

10.2 分布式透明性

透明性含义层次
分片透明用户不必关心数据如何分片最高级
位置透明用户不必关心数据存储在哪个节点中级
复制透明用户不必关心数据是否有副本低级
🎯 分布式透明性排序

"分片位置复制"(从高到低)

分片透明 > 位置透明 > 复制透明

10.3 CAP定理

📌 补充:CAP定理(分布式系统基础理论)

在分布式系统中,以下三者最多只能同时满足两个

属性含义说明
C(一致性)所有节点看到相同的数据强一致性
A(可用性)每个请求都能得到响应不保证是最新数据
P(分区容忍性)网络分区时系统仍能运行分布式系统必须满足
💡 CAP权衡

CP系统:放弃可用性,保证一致性和分区容忍(如 ZooKeeper、HBase)

AP系统:放弃强一致性,保证可用性和分区容忍(如 Cassandra、DynamoDB)

CA系统:不存在真正的CA系统(分布式必须容忍分区)

10.4 NoSQL数据库

📌 补充:NoSQL数据库类型
类型特点代表产品适用场景
键值型简单的Key-Value存储Redis, Memcached缓存、会话管理
文档型存储JSON/BSON文档MongoDB, CouchDB内容管理、日志
列族型按列存储,适合分析HBase, Cassandra大数据分析
图数据库存储节点和关系Neo4j, JanusGraph社交网络、推荐

10.5 数据仓库与数据挖掘

📌 补充:数据仓库特征
特征说明
面向主题按主题组织数据(如客户、产品)
集成的从多个数据源整合
非易失的数据加载后一般不修改
时变的记录历史变化,支持时间维度分析

十一、高频考点速记 & 口诀

11.1 选择题高频考点

#考点答案
1三级模式对应什么?外模式=视图,模式=基本表,内模式=物理文件
2两层映射保证什么?外/模式映射→逻辑独立性,模式/内→物理独立性
3关系的性质?列无序、行无序、分量原子值、无重复行
4范式排序?1NF⊃2NF⊃3NF⊃BCNF⊃4NF
52NF消除了什么?非主属性对候选键的部分依赖
63NF消除了什么?非主属性对候选键的传递依赖
7BCNF的条件?每个决定因素都是候选键
8ACID是什么?原子性、一致性、隔离性、持久性
9一级封锁防什么?丢失更新
10二级封锁防什么?丢失更新+脏读
11三级封锁防什么?丢失更新+脏读+不可重复读
122PL的性质?可串行化的充分条件,但不能防死锁
13CAP定理?一致性、可用性、分区容忍性最多满足两个
14分布式透明性排序?分片>位置>复制
15M:N联系怎么转换?独立建表

11.2 案例分析高频考点

#考点答题要点
1SQL查询语句编写SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY
2E-R图设计与转换识别实体/联系/属性→画E-R图→按规则转换关系模式
3范式判断与分解找候选键→判断依赖类型→确定范式级别→分解
4关系代数表达式σ选行、π选列、⋈连接、÷全部
5并发控制问题分析识别丢失更新/脏读/不可重复读→选择封锁协议

11.3 口诀汇总

考点口诀解释
三级模式"外视内物中逻辑"外模式看视图,内模式管物理,模式是逻辑
独立性"外/模式保逻辑,模式/内保物理"两层映射对应的独立性
范式排序"一二三BC四"1NF→2NF→3NF→BCNF→4NF
2NF/3NF"二消部三消传"2NF消部分依赖,3NF消传递依赖
封锁协议"一写二短三长"一级管写,二级短读,三级长读
ACID"原一隔永"原子、一致、隔离、持久
关系代数"σ选行π选列,⋈连接÷全部"四种关系运算的含义
分布式透明"分片位置复制"从高到低排序
CAP"CAP三选二"一致性、可用性、分区容忍性最多满足两个
E-R转换"一对一归任一,一对多归多,多对多独立建表"三种联系的转换规则
"全部"问题"没有一门他没选"NOT EXISTS双重否定
WHERE vs HAVING"WHERE分前不能聚,HAVING分后可用聚"WHERE在分组前不能用聚合函数,HAVING在分组后可以

11.4 易错点总结

⚠️ 考试易错点
  1. 条件覆盖 ≠ 判定覆盖:条件覆盖不一定满足判定覆盖(这是测试的,但同理适用于数据库依赖推理)
  2. BCNF的判断:决定因素必须是候选键,不是主键
  3. M:N联系必须独立建表:1:1和1:N可以并入实体,但M:N不行
  4. WHERE不能用聚合函数:COUNT/SUM/AVG等只能在HAVING中使用
  5. 外连接保留不匹配行:LEFT JOIN保留左表所有行,RIGHT JOIN保留右表所有行
  6. 2PL是可串行化的充分条件:不是必要条件,但考试常考这个性质
  7. 2PL不能防止死锁:2PL可能导致死锁
  8. UNDO是撤销,REDO是重做:未提交用UNDO,已提交用REDO
  9. 分片透明最高级:分片透明 > 位置透明 > 复制透明
  10. CAP中P必须满足:分布式系统必须容忍分区,所以实际是C和A之间选一个

📚 相关笔记链接

[[关系代数]] [[数据控制]] [[数据库概述]] [[数据库设计过程]]

📅 生成日期:2026-05-15 | 📝 综合整理自数据库系统目录下4篇笔记并补充完善