先分清五类题,各自的验收方式不同
概念题要能区分边界,SQL题要验证结果集合,范式题要写函数依赖和候选码,事务题要沿操作顺序判断冲突,存储与恢复题则要说明日志、缓冲和磁盘之间的先后关系。把这些题全部当成定义题背,题干稍微换个数据表就会失效。
合格题库应让你看到推导过程,而不仅是最后结论。尤其是SQL和关系理论,答案能运行不代表语义一定正确,还要检查重复、NULL、空集合和全称条件。
| 题型 | 必须写出的过程 | 完成标志 |
|---|---|---|
| SQL查询 | 数据集合、连接条件、分组或子查询语义 | 能用小样本验证结果 |
| 范式与依赖 | 候选码、部分依赖、传递依赖 | 能说明违反哪一级范式 |
| 事务与并发 | 操作顺序、冲突边或锁状态 | 能指出异常如何产生 |
| 索引与执行 | 选择性、访问路径和回表边界 | 不把所有查询都判成适合索引 |
| 日志与恢复 | Undo、Redo、提交和刷盘顺序 | 能解释崩溃后为什么可恢复 |
拿一道关系除法题,就能看出SQL解析深不深
“查询选修了全部必修课的学生”是很好的试题。解析若只给双重NOT EXISTS语句,却不解释“不存在一门没有选的必修课”,考生只能背代码。再追问必修课集合为空时会怎样,更能看出是否真正理解全称命题。
同样,范式题不能只宣布“达到3NF”,而要先找候选码,再检查非主属性是否部分依赖或传递依赖。老师讲这类题时,宁可多写两行推导,也不会让学生凭感觉跳到答案。
双重NOT EXISTS为什么表示“全部”
外层针对某个学生进行判断。
第一层寻找一门必修课,第二层检查该学生是否没有对应选课记录。
如果找不到任何“漏选的必修课”,才说明该学生选全了。
这不是记SQL形状,而是把全称条件改写为不存在反例。
练习顺序从数据模型走到并发与恢复
第一轮先把ER模型、关系代数、SQL和规范化串起来;第二轮再进入索引、事务、并发控制和恢复。这样能看清数据库从逻辑设计到运行保障的完整链路。随机跨模块刷题虽然有新鲜感,却不利于建立前后关系。
进入冲刺后,要把SQL、范式和事务题混合限时。真正的薄弱点常在切换:刚做完查询优化,下一题突然要求判断锁协议,能否迅速切回正确模型,才接近考试状态。
- 先用ER到关系模式题检查建模基础。
- 再做SQL与关系代数,给查询准备小样本数据。
- 接着做候选码、范式和分解,强制写推导。
- 进入索引、事务、锁和调度,画出访问或等待关系。
- 最后把WAL、检查点和故障恢复放在一起复盘。
数据库错题要能被数据反证
SQL题做错后,最有效的办法往往不是重看解释,而是造三到五行数据。准备一个正常样本、一个重复样本和一个边界样本,让查询结果自己暴露问题。事务题则画时间轴,记录每一步读写、加锁和提交。
这种复盘速度可能比直接记答案慢,但它能抵抗题目换表名、换数据和换问法。数据库题库真正的价值,是提供足够清楚的模型和步骤,让你能独立验证,而不是要求你相信答案。
| 错题类型 | 推荐验证动作 | 常见误区 |
|---|---|---|
| SQL结果不对 | 构造小样本手工跑结果 | 只看语法能否执行 |
| 范式判断错 | 重找候选码和依赖路径 | 跳过候选码直接猜范式 |
| 并发异常混淆 | 画事务交错时间轴 | 只背隔离级别表格 |
| 恢复题错 | 标出日志、数据页和提交先后 | 把检查点当成完整备份 |
相关题目解析
下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。
- SQL 怎么查询选修了全部必修课的学生?SQL / 关系除法
- 严格两段锁为什么要把写锁一直持有到事务提交?严格两段锁 / 2PL
- 为什么脏数据页落盘前,相关日志必须先持久化?WAL / 写前日志
- R(A,B,C) 分解为 R1(C,B) 和 R2(A,C),为什么无损却不保持依赖?BCNF / 无损连接
- 事务前驱图出现环,为什么不是冲突可串行化调度?前驱图 / 冲突可串行化
常见问题
数据库系统工程师题库应该重点看哪些模块?
至少覆盖数据模型与关系代数、SQL、规范化、索引、事务并发、存储与恢复。选择时重点检查推导是否完整,而不只是题量。
SQL题只看答案能学会吗?
通常不够。应使用少量样本数据验证连接、分组、重复、NULL和空集合边界,并能用自然语言解释查询条件。
数据库范式题怎么减少误判?
固定先找候选码,再标主属性和非主属性,之后判断部分依赖与传递依赖。不要看到函数依赖数量多就凭感觉猜范式。