数据库原理习题辅导,帮你搞懂那些难点和应用细节
- 问答
- 2026-01-25 13:54:37
- 105
关于数据库原理的习题,很多同学卡住的地方,其实不是概念本身,而是概念怎么用到具体题目里,我结合王珊那本经典教材里的常见习题和考试难点,给你拆开讲讲。

关系代数”和“SQL”互相转换的细节
这是必考题,书上关系代数的符号(、π、⋈)你背下来了,但一写SQL就懵,关键点在于:关系代数里的“选择σ”对应SQL的“WHERE子句”,“投影π”对应“SELECT后面跟着的列”,这个好懂,但最容易出错的是“自然连接⋈”。
自然连接会自动找两个表里同名同类型的列进行等值匹配,并且结果中去掉重复列,你写SQL时,如果直接用NATURAL JOIN关键字,往往不符合题目预期,因为题目里表的设计可能很复杂,更稳妥的方法是老老实实用INNER JOIN ... ON,在ON后面自己明确写出连接条件,比如习题里常给“学生表”和“选课表”,让你查选了某门课的学生姓名,用关系代数写是:π姓名(σ课程名='数据库'(学生 ⋈ 选课 ⋈ 课程)),转换成SQL时,很多同学会漏掉连接条件,写成FROM 学生, 选课, 课程 WHERE 课程名='数据库',这样会形成笛卡尔积,结果爆炸且错误,必须把每两个表之间的关联字段用ON或者WHERE连起来:FROM 学生 JOIN 选课 ON 学生.学号=选课.学号 JOIN 课程 ON 选课.课程号=课程.课程号 WHERE 课程名='数据库',这个细节,王珊书上的例题其实反复出现,但自己做题时一紧张就忘了。

事务的“ACID”特性,到底在考什么?
背下原子性、一致性、隔离性、持久性很容易,但题目里往往给一个银行转账的场景(A账户减100,B账户加100),然后问:如果执行到一半断电,数据库怎么保证?这时候你要分两点答:第一,靠事务的原子性和持久性,具体实现机制是日志(Redo Log和Undo Log),系统会先把要做什么(A账户余额改为900”)和做了什么记录到日志文件,再实际修改磁盘数据,如果断电,重启后数据库会检查日志,如果事务没提交,就用Undo Log回滚;如果提交了但数据没写完,就用Redo Log重做,第二,题目可能接着问“两个事务同时转账怎么办?”这就引出了隔离性,默认的隔离级别(比如读已提交)下,如果不加控制,可能会发生“丢失更新”:A事务和B事务都读到账户余额1000,都减去100,结果最后余额是900而不是800,解决办法是在事务里用SELECT ... FOR UPDATE这样的锁,或者让数据库自动通过更严格的隔离级别(如可串行化)来解决,很多习题册上的并发调度题,让你判断是否可串行化,核心就是看事务交错执行的结果,是不是和某种顺序一个一个执行的结果一样。

范式分解,为什么总感觉分解错了? 函数依赖、部分依赖、传递依赖这些词绕晕了很多人,做范式分解题(比如把一个1NF的表分解成3NF或BCNF)时,记住一个实用步骤:第一,找出所有函数依赖(题目会给);第二,找出候选码(关键);第三,对着范式定义找毛病,比如2NF要消灭“非主属性对码的部分依赖”,举个例子,如果候选码是(学号,课程号),但存在“姓名”只依赖于“学号”,那“姓名”就是部分依赖于码,不满足2NF,分解时,就把这部分依赖单独拆成一个表(学号,姓名),另一个表放(学号,课程号,其他依赖于整个码的属性),这里最容易犯的错是分解后丢失了函数依赖,或者把原来能关联的信息拆没了(失去无损连接性),一个检查方法是:分解后的两个表,至少有一个公共属性,而且这个公共属性最好是其中一个表的码,王珊教材里强调,分解要既“保持函数依赖”又“具有无损连接”,但习题里有时只能二选一,这时候通常优先保证无损连接。
索引为什么有时候没用甚至更慢?里经常给一个SQL查询语句,问“适合在哪些列上建索引?”你不能回答“所有WHERE后面的列都建”,要考虑数据的分布,性别”列只有‘男’‘女’两个值,建索引几乎没用,因为查询时要回表访问大部分数据块,不如全表扫描,另一个细节是复合索引的顺序,如果索引是(A, B, C),那么查询条件里只用到B和C,这个索引就用不上(最左前缀原则),还有,当进行大量更新(INSERT/UPDATE/DELETE)时,索引维护开销很大,可能会变慢,这些应用细节,在单纯讲B+树索引优点的章节里可能不提,但做综合题时一定要考虑。
E-R图转关系模式,属性放哪儿? 画E-R图容易,转成表的时候常出岔子,核心规则:实体转成一个表,属性就是表的列,联系转成表,取决于联系的类型,1:1联系:可以和任意一端实体合并,加进另一端的码和联系自身的属性,1:n联系:必须和“n”那一端实体合并,把“1”那端的码和联系属性加进去,m:n联系:必须单独转成一个表,这个表的主键是两端实体的码的组合,再加上联系自身的属性,很多同学错在把m:n联系合并到了某一端,或者忘了把联系的属性(比如选课的联系“选修”会有“成绩”这个属性)放进转换后的表里,这个点看似基础,但考试设计题里丢分的人很多。
做数据库习题,别光背定义,对着书上的图(比如事务状态图、B+树结构图)和例题,自己画一遍流程,把SQL写出来跑一跑(哪怕在脑子里推演),才能抓住那些“坑”,希望这些针对常见习题难点的拆解,能帮你把书上的理论和做题的实践连起来。
本文由符海莹于2026-01-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://oazh.haoid.cn/wenda/85761.html
