⚔️ 软考数据库系统工程师:高频核心考点精细化通关大师指南
模块一:数据库设计与关系代数基础
1. E-R 模型核心规范与结构冲突应对
- E-R 图三大图形基础:实体用矩形表示,联系用菱形表示,属性用椭圆形表示。
- 多对多($m:n$)映射的物理落地:在逻辑结构设计时,一个独立的关联表(如借阅记录表
BorrowRecord)必须通过同时存储两个实体表的主键(如读者号ReaderID和书号BookID)作为自己的外键,以此来实现多对多的关系映射。 - 结构冲突的精确定义与修复:当同一个现实对象在不同的分 E-R 图中被做了不同的抽象时(例如:在 A 图中被当作“实体”对待,但在 B 图中却被退化成了某个实体的“属性”或“联系”),这就发生了结构冲突。
- 应试修复标准:一旦出现此类结构冲突,应统一标准,将作为属性的对象改为实体,并与它原本所在的宿主实体之间建立起新的“联系”。
2. 关系代数底层逻辑:等值连接 vs 自然连接
- 等值连接:从两个关系的笛卡尔积中,选取在指定属性上值相等的元组。它不要求比较的属性名称相同,且连接结果中会保留双方重复的列。
- 自然连接($\bowtie$):是一种特殊的等值连接。它要求两个关系进行比较的必须是同名属性组,并且在结果中会自动去掉重复的列。
- 投影操作($\pi$)的隐藏考点:投影是从**列(垂直)**的角度进行运算。请务必记住:投影运算在提取指定列后,会自动去掉结果中重复的行。
- 笛卡尔积的列名处理:有两个关系模式 $R(A, B, C, D)$ 和 $S(A, C, E, G)$,则 $X = R \times S$ 的关系模式中,如果列名存在重复,需要带上关系名表示来源,即:$X(R.A, B, R.C, D, S.A, S.C, E, G)$。
3. 数据独立性与三级模式
- 数据独立性:指应用程序与数据结构之间相互独立、互不影响。
- 模式 (Schema) 与实例 (Instance):模式是数据库全体数据的逻辑结构和特征的描述,它是相对固定的;而实例是模式在某一时刻的具体数据内容,它是相对变化的。
- 系统对比:文件系统数据冗余高、独立性低;数据库系统数据冗余低、独立性高(注意:这里的冗余指的是业务数据本身,而不是系统日志或备份的冗余)。
模块二:规范化理论深度破局(攻克范式之痛)
1. 核心概念翻译
- 函数依赖 ($X \rightarrow Y$):如果学号
1001只能对应张三,那么输入一个确定的 $X$ 就能唯一决定一个 $Y$(类似于:身份证号 $\rightarrow$ 姓名)。 - 多值依赖 ($X \rightarrow\rightarrow Y$):一个 $X$ 的值不只对应一个 $Y$,而是对应一组确定的 $Y$ 值(一对多组)。
- 平凡依赖 vs 非平凡依赖:
- 平凡多值依赖:如果 $X \rightarrow\rightarrow Y$ 成立,且剩下的属性集 $Z = U - X - Y$ 为空集($\emptyset$)(也就是说,整个表里除了 $X$ 和 $Y$ 之外没有其他多余属性了),或者满足 $Y \subseteq X$,这就是废话依赖,称为平凡多值依赖。
- 非平凡多值依赖:右边产生了不包含在左边及剩余集合中的全新字段(如 $Z$ 不为空),才叫非平凡多值依赖。
2. 范式进阶判断(1NF $\rightarrow$ BCNF 连环通关)
- 1NF(第一范式)核心:原子性
- 定义:数据库表的每一个格子都必须是不可再分的原子数据,不能一个格子塞进两个数据。
- 错题避坑:若出现
R(员工编号, 姓名, 电话{家庭电话, 工作电话}),由于“电话”包含了多重属性、可再分,它就不满足 1NF。如果一个关系模式存在部分函数依赖,它最高也只能达到 1NF。
- 2NF(第二范式)核心:消除了“部分函数依赖”
- 主要治理:联合主键情况下的非主属性偷懒依赖。
- 经典错题:主键是
(学号, 课程号),存在函数依赖课程号 \rightarrow 课程名。你看,课程名只需要知道课程号就能定下来,不需要联合学号。非主属性只靠主键的一部分就能锁定,这就叫部分函数依赖,直接破坏 2NF。
- 3NF(第三范式)核心:消除了“传递函数依赖”
- 主要治理:非主属性绕弯子传递。
- 经典错题:存在依赖链 $A \rightarrow B \rightarrow C$,例如
学号 \rightarrow 学院,同时学院 \rightarrow 学院领导。这导致通过学号能间接推导出学院领导,这种绕了一层的推导叫传递函数依赖,直接破坏 3NF。
- BCNF(修正的第三范式)核心:左边必须全都是码
- 它是 3NF 的改进形式。判定最简单的绝招:检查所有的函数依赖 $X \rightarrow Y$,看左边的 $X$ 是不是每一次都包含候选码。如果没有任何属性完全函数依赖于非码的任何一组属性,才算达到 BCNF。
3. 分解的无损连接性判定
把一个大表 $R$ 拆分成 $R_1$ 和 $R_2$ 后,用什么公式保证它们能完美还原(无损连接)?
⚖️ 黄金判定公式:如果属性交集能决定差集,即满足 $U_1 \cap U_2 \rightarrow U_1 - U_2$ 或者 $U_1 \cap U_2 \rightarrow U_2 - U_1$,则该分解必具有无损连接性。考试题如果考四个选项选错误的,通常会用“且”来偷换公式里的“或者”。
模块三:事务、锁机制与并发控制(下午大题核心)
1. 锁的本质:S锁 vs X锁
- 共享锁(Shared Locks,简称 S 锁 / 读锁):一个事务对数据加了 S 锁后,其他事务可以继续加 S 锁来一起读,但绝对不能加 X 锁去改它。
- 排他锁(Exclusive Locks,简称 X 锁 / 写锁):一个事务对数据加了 X 锁后,它就独占了该数据。其他任何事务不管是想加 S 锁还是加 X 锁,通通都会失败并进入等待状态。
2. 两段锁协议 (2PL) 避坑红线
- 什么是两段锁? 事务执行时分为两个阶段:第一阶段只能加锁(Grow 阶段),一旦开始释放第一个锁,就自动进入第二阶段,此时只能解锁(Shrink 阶段),不能再加任何锁。
- 作用:只要事务都遵守 2PL,它们的并发调度就一定是**可串行化(结果正确)**的。
- 致命误区:遵从两段锁协议的事务调度,安排不当依然会产生死锁。
3. 并发不一致问题与封锁协议
| 并发不一致现象 | 现象定义大白话 | 治理它的封锁协议级别 |
|---|---|---|
| 丢失修改 | T1 和 T2 同时改同一个数据,T2 后提交的结果把 T1 改的刷掉了,导致 T1 白改了。 | 一级封锁协议:修改数据必须加 X 锁直到事务结束。 |
| 脏读 | 读到了别人修改了、但还没提交的数据。结果对方后来执行了 Rollback 撤销,你读到的成了假数据。 | 二级封锁协议:在一级基础上,读数据加 S 锁,但读完立刻释放。 |
| 不可重复读 | T1 在一个事务里前后读取两次同一数据,中途 T2 进去把数据改了并提交,导致 T1 两次读出的值不一样。 | 三级封锁协议:在一级基础上,读数据加 S 锁,必须直到事务结束才释放。 |
| 幻影现象(幻读) | T1 对数据对象进行范围访问,中途 T2 插入或删除了几行,导致 T1 再次读取时发现记录的总行数变了。 | Serializable(串行化隔离级别):可避免脏读、不可重复读、幻读的发生。 |
- 隔离级别对照:①
Serializable级别最高;②Repeatable read可避免脏读、不可重复读;③Read committed可避免脏读;④Read uncommitted最低级别,不允许丢失更新。
4. 三大故障分类与日志恢复
- 事务故障:单个事务在运行中途死掉(原因:运算溢出、死锁、代码逻辑报错、用户强行取消)。
- 恢复手段:**
UNDO(撤销)**或 **ROLLBACK(回滚)**该事务已做的部分操作。
- 恢复手段:**
- 系统故障:因服务器断电、操作系统崩溃等导致系统停止运行,磁盘未坏,但内存(RAM)中的数据全丢了。
- 恢复手段:检查日志。崩溃前已经提交 (
COMMIT) 的事务执行REDO(重做);崩溃时还没做完、没提交的事务执行UNDO(撤销)。
- 恢复手段:检查日志。崩溃前已经提交 (
- 介质故障:硬故障。存储介质物理损坏,磁盘/硬盘坏了,磁盘上数据库文件丢失或损坏。
- 恢复手段:装载最新的数据库后备副本,然后重放日志文件,把数据追回来。
- 基本原理:恢复操作的核心原理完全靠冗余机制(通过日志、备份、镜像等重复保存数据)。
- 备份策略:冷备份(静态备份,关闭数据库时复制);热备份(动态备份,正常运行状态下备份)。完全备份(备份所有);差量备份(仅备份上一次完全备份后变化的数据);增量备份(备份上一次备份后变化的数据)。
模块四:SQL 高级语法与存储对象
1. 完整性约束与高频控制字
- 四大约束:不填自动有值 $\rightarrow$
DEFAULT;自定义取值范围 $\rightarrow$CHECK;唯一且非空 $\rightarrow$PRIMARY KEY;关联别表 $\rightarrow$FOREIGN KEY。 WITH CHECK OPTION(超级高频):用在创建视图 (VIEW) 的末尾。作用是:以后通过这个视图去INSERT或UPDATE数据时,必须遵守视图的筛选条件,绝对不能改出该视图本身的WHERE筛选条件范围之外。- 权限收回的级联:使用
CASCADE关键字可以实现级联收回。例如收回role_A的权限时,级联收回role_A向其他用户授予的权限。 - 常用操作:
FOR ALL用于关系代数/断言中对所有元组成立;PUBLIC表示公共权限,给所有人赋权;WITH GRANT OPTION允许授权传递权限。
2. 存储过程、触发器与自定义函数语法深坑
- 触发器 (Trigger):是一种特殊类型的存储过程,不能带有任何参数,并且不能被应用程序显式调用,它只能由事件隐式触发,但内部可以引用临时表。
- 存储过程语法格式:
CREATE PROCEDURE 过程名 (参数列表) BEGIN 过程体语句; END。 - 自定义函数编写改错题:
- 规范:函数括号参数写完后 $\rightarrow$
RETURNS 数据类型。注意:RETURNS后面只写类型,绝对不能写变量名。 - 错误示范:
RETURNS d_count INTEGER❌(语法直接报错)。 - 正确示范:
RETURNS INTEGER。 - 在函数体内部如果需要定义局部变量,语法格式为:
DECLARE 变量名 类型;。
- 规范:函数括号参数写完后 $\rightarrow$
模块五:分布式数据库、NoSQL 与架构优化
1. 分布式数据库的 4 层透明性
- 分片透明(最高级别):用户完全感觉不到表被切分了,写 SQL 时直接用大表名。
- 位置透明:用户无需关心分片数据到底被存在哪个局部的场地(服务器)上。
- 分配透明 / 复制透明:用户无需关心数据在各场地是否有副本、副本存在哪里。
- 映像透明 / 模型透明(最低级别):用户无需知道各个局部场地用的是什么局部的 DBMS 模型。
- 模式描述:全局概念层应具有三种模式描述信息:全局概念模式、分片模式、分配模式。
- 水平分解:若表中元组数量很大导致效率降低,在不修改程序和表逻辑模式的情况下,可采用水平分解(按行切分元组)。
2. NoSQL 经典大题分类表
NoSQL 保证的是 BASE 特性(基本可用、软状态、最终一致性),而非传统关系型的 ACID。
| NoSQL 数据库大类 | 核心技术特征 | 历年真题出现的典型代表 |
|---|---|---|
| 键值 (Key-Value) 存储 | 结构极为简单,并发读写性能极高。 | Redis、Memcached、Dynamo。 |
| 文档 (Document) 存储 | 适合存储半结构化数据。 | MongoDB。 |
| 列 (Column) 存储 | 适合做海量数据的分布式读写。 | Cassandra。 |
| 图 (Graph) 存储 | 利用图的点、线、面数据结构表达复杂关系。 | Neo4j、FlockDB。 |
3. 数据仓库与索引对症下药
- OLAP 服务器:即联机分析处理服务器,基于多维模型组织数据,是数据仓库三层架构中的中间层(底层是负责存储的数据仓库服务器)。
- 优化策略:尽可能减少多表查询或建立物化视图;用带
IN的条件子句等价替换OR子句;经常提交COMMIT以尽早释放锁;永远不要使用动态拼装 SQL。 - 索引如何对症下药:
- 遇到
BETWEEN ... AND ...范围、区间、大小比较查询 $\rightarrow$ 选 B树索引。 - 遇到
=精准一对一等值查找 $\rightarrow$ 选 散列 (Hash) 索引。 - 遇到“性别”、“状态”这种取值极少、高度重复的列 $\rightarrow$ 选 位图索引。
- 大批量频繁查询,且需要对表中的数据进行物理排序 $\rightarrow$ 设为 聚簇 (Cluster) 索引。
- 遇到
模块六:非数据库基础考点(上午选择题“扫盲排雷”)
1. 计算机硬件与底层原理
- 寄存器:地址寄存器用来存当前 CPU 所访问的内存单元地址;程序计数器 (PC) 用来存放下一条指令所在单元的地址。
- RISC vs CISC:RISC(精简指令集)的通用寄存器数量相当多,内部控制以硬布线控制逻辑为主,不用或少用微码。CISC(复杂指令集)则普遍采用微程序控制器。
- 校验码绝招:CRC(循环冗余校验)必用 模二除法 构造校验位;海明码校验必用 模2异或。水平奇偶校验是对一行数据检验奇偶,垂直检验是每一列来检验。
- DMA 与缓存:DMA 每传送一个数据,内存就要完成一次读或写,内存完成一次读/写所需的时间就是存储周期。Cache缓存作为数据交换的缓冲区,释放了高速度 CPU 的等待。
- 后缀表达式计算:例如后缀式
ab-cd+*,从左往右找运算符,ab-即 $(a-b)$,cd+即 $(c+d)$,最后的*把两部分乘起来,还原为 $(a-b) \times (c+d)$。
2. 操作系统与进程管理
- 引导与内存:电脑开机时,存储在 ROM(非易失,断电不丢数据)中的 BIOS 完成硬件自检,随后将 OS 加载到 RAM(易失性内存)中,此后所有高频读写都在 RAM 中进行。程序中使用的是虚拟地址,硬件中访问的是物理地址。
- 进程调度:短作业优先 (SJF) 算法能让平均周转时间最短。先来先服务按排队顺序;优先级算法看级别;轮转算法轮流切时间片。
- 线程共享资源:同一个进程内的线程,彼此共享地址空间、全局变量和记账信息,但是每个线程自己的线程栈、私有数据是绝对独立的、不可共享。用户级线程由应用程序支持,内核意识不到;内核级线程由内核支持。
- 页面置换:最近未使用 (NUR) 算法淘汰页面时,参考的是页面的引用位(访问位)和修改位。
3. 软件工程与生命周期模型
- 螺旋模型:综合了瀑布和演化模型的优点,它的标志性特征是增加了风险分析,沿着螺线由内向外每旋转一圈得到一个新版本。
- 原型方法:专门对付用户需求不清、经常变化的场景。它可以迅速做出系统框架来辅助界面设计,但绝不能用来指导代码优化。
- 内聚与耦合:记住八字真言“高内聚,低耦合”。
- 耦合(低到高):非直接耦合、数据耦合、标记耦合、控制耦合、外部耦合、公共耦合、内容耦合。
- 内聚(高到低):功能内聚、顺序内聚、通信内聚、过程内聚、瞬时内聚、逻辑内聚、偶然内聚。
- CMM/CMMI 级别:可重复级(追踪成本进度)、定义级(过程标准化文档化)、管理级(定量认识 and 控制度量)、优化级(持续过程改进)。
4. 系统设计、网络基础与安全防线
- 结构化设计与语言:数据流图 (DFD) 中,外部实体指出系统数据的发源地与归宿地,加工描述数据的转换。在程序编译中,执行类型分析和检查是语义分析阶段的工作。运行期间结合称为动态绑定,编译期间结合称为静态绑定。JavaScript 是基于对象的脚本语言,不是面向对象语言。
- UML 图:用例图描述系统功能需求(行为建模核心);对象图展现一组对象关系,属于类实例的静态快照。
- 网络分层与端口:物理层(比特流)、数据链路层(帧,网桥/交换机)、网络层(用户数据报/IP包,路由器)、传输层(段)。Telnet 默认端口 23、FTP 默认端口 21(控制 21,数据 20)。ARP:IP 查 MAC;RARP:MAC 查 IP;DNS:域名查 IP。
- Ping 检测的近水楼台原则:网络不通时,排查顺序必须是:
ping 127.0.0.1$\rightarrow$ ping 本地固定 IP $\rightarrow$ ping 默认网关 $\rightarrow$ ping 远程目标主机。 - 安全技术对号入座:
- RSA:非对称加密,算得慢,只适合加密小段数据(如密钥分发、数字信封)。
- RC5:对称加密,速度极快,适合大批量明文、大文件流加密。
- MD5 / SHA-1:哈希/消息摘要算法,用来保证数据完整性,防止数据被篡改,它们是不可逆的(不能解密)。
- 重放攻击:发送主机接收过的包进行身份欺骗,破坏认证正确性。
- 安全防御级别:漏洞补丁管理属于系统安全,而数据库权限、安全设计则属于应用安全。