news 2026/9/18 19:26:07

数据库原理及应用期末复习:关系模型、SQL、范式与事务并发全攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据库原理及应用期末复习:关系模型、SQL、范式与事务并发全攻略

说实话,数据库原理及应用这门课,我当年也是啃了三遍才真正理顺。第一遍上课听了个热闹,第二遍考前突击背定义背到怀疑人生,第三遍老老实实把知识点和习题串起来刷,才猛然发现这门课的套路其实非常固定。后来帮学弟学妹辅导期末,翻来覆去讲的也就是那些东西:关系模型、SQL、范式、事务并发控制。只要把这几座大山啃下来,考试基本不会差。

这篇整理是我结合历年真题、教材课后题和实际讲题经验做的一份“最全”版本,针对的是《数据库原理及应用》课程的常见版本教材,无论你用王珊、萨师煊的经典版,还是其他院校自编教材,核心考点都是互通的。内容上我会把知识点和习题放在一起,边讲边练,每道题都给到做题思路和坑点提示,适合期末备考、考研复试,还有想快速拾起数据库基础的人。

1. 关系模型与完整性约束:这一块不啃透,后面学什么都不对味

1.1 关系模型里的名词,一张表就能理清楚

关系模型是数据库理论的地基,但很多同学栽在开局阶段,原因是名词太像了。关系、元组、属性、分量、域、候选码、主码、外码……看到就头大。

我用一张学生表来串:

专业术语通俗解释表里的对应
关系一张二维表整个学生表
元组表中的一行某个学生的所有信息
属性表中的一列学号、姓名、年龄
分量某一行某一列的具体值“2024001”
属性取值的合法集合年龄的域是0到120
候选码能唯一确定一个元组的属性组合学号可以,身份证号也可以
主码从候选码里挑一个当主要标识学号
外码某一属性在别的表里是主码班级编号在学生表里是外码,在班级表里是主码

关键点在于:关系必须是规范化的,也就是每一个分量都必须是不可再分的原子值。如果某个属性里存了“篮球、足球”这种列表,就不满足关系的定义,后面学范式的时候会重复遇到。

主码、候选码、外码这三个概念是选择题和填空题的重灾区。记住两条规则:候选码是“能唯一标识且去掉任何属性后就不能唯一标识”的属性组合,这叫最小性;主码从候选码中任选一个就好,没有特殊要求。

外码比较有意思。外码的值要么为空,要么等于所参照表中某个元组的主码值。这里就引出了参照完整性。为什么允许为空?因为一个学生可以暂时没有被分配班级,这时班级编号是NULL,是合理的。

1.2 三类完整性约束怎么记,才不容易混

实体完整性、参照完整性、用户定义完整性,这三兄弟几乎必考。死记硬背容易混,我用场景记忆法:

  • 实体完整性:针对主码。主码的值不能为空,也不能重复。因为实体必须可区分,一行记录如果主码是空,就没法代表任何一个实实在在的学生。
  • 参照完整性:针对外码。外码要么是NULL,要么等于被参照表的主码。不能让一个学生指向一个根本不存在的班级。
  • 用户定义完整性:针对具体语义约束。比如年龄必须大于0、成绩必须在0到100之间、性别只能是男或女。

易错题经常这样出:“一个关系中,主码可以由多个属性组成,这种主码叫复合码,问复合码中部分属性能否取空值?”答案是不能,实体完整性要求主码的每一个属性都不能取空值,不是整体不为空,而是构成主码的所有列都非空。因为任意一列为空,就无法唯一标识元组。

1.3 关系代数:选择、投影、连接与除法的应试要点

关系代数是考察形式化能力的重点,也是很多学生的噩梦。其实它就是把对表的操作抽象成几个符号。

  • 选择(σ):选出满足条件的行。σ 条件(表名),筛选的是行,横向裁剪。
  • 投影(π):选出某些列。π 列名列表(表名),筛选的是列,纵向裁剪。
  • 连接(⋈):把两张表按某种条件拼起来。最常用的是等值连接,也就是找两列相等的行进行合并。
  • 除(÷):比较抽象,但是常考,先放着,后面例题说。

写关系代数表达式时,最容易错的是选择条件的写法。条件里的列名前不用加表名,但如果两张表都有同名列,比如学生表有学号,选课表也有学号,那么在条件中要写成“学生.学号=选课.学号”或者给表起别名。

投影后如果有重复行,要自动去重,这是关系代数的特性,不需要你额外写DISTINCT,但要知道这件事,选择题爱考。

1.4 关系代数习题:从文字描述到表达式

习题1:有关系S(学号,姓名,性别,年龄)和SC(学号,课程号,成绩)。查询“年龄大于20的女学生的学号和姓名”。

解析:第一步是选择,条件是“性别=‘女’ 且 年龄>20”。第二步是投影,只要学号和姓名。所以表达式是:

π 学号, 姓名(σ 性别=‘女’ AND 年龄>20 (S))

先写选择还是先写投影,结果一样吗?理论上有优化规则,选择下推通常更高效,但在笔试中结果等价即可。注意投影里的“学号”取自S表,没有歧义。

习题2:查询“选修了课程号为‘C1’或‘C2’的学生学号”。

很多同学写 π 学号(σ 课程号=‘C1’ OR 课程号=‘C2’ (SC)),正确。但这里有个坑,如果改成“同时选修了C1和C2”,那同一元组里不可能同时出现两个课程号,所以要用除或交:

π 学号(σ 课程号=‘C1’ (SC)) ∩ π 学号(σ 课程号=‘C2’ (SC))

这就是为什么关系代数不能全用SQL思维想,SQL子查询很方便,但关系代数更底层。考试时一旦遇到“同时”“全部”,优先想到除法和交集。

习题3(除法):已知学生表S、选课表SC、课程表C,查询“选修了全部课程的学生姓名”。

思路分三步:先找出所有课程号(π 课程号(C)),再找出每个学号对应的课程号组合(π 学号,课程号(SC)),用除法得到学号集合,最后连接学生表取出姓名。表达式是:

π 学号,课程号(SC) ÷ π 课程号(C)

除法就对应“包含所有”的语义,一张表除另一张表,商就是那些“包含了除数里全部值”的被除数元组。这一步是很多名校考研题的分水岭。

2. SQL语言:上机的杀手锏,也是笔试的送分点

2.1 SQL语句的分类,别只盯着SELECT

SQL语言的学习要分成四块:数据定义语言(DDL)、数据操纵语言(DML)、数据查询语言(DQL)、数据控制语言(DCL)。考试里定义题喜欢问“四大类分别包含哪些语句”。

  • DDL:CREATE、DROP、ALTER
  • DML:INSERT、UPDATE、DELETE
  • DQL:SELECT
  • DCL:GRANT、REVOKE

注意很多教材会把SELECT单独拎出来叫DQL,答题时这么写更严谨。如果题目问“哪个属于数据控制语言”,答案就是授权和收权。

创建表的语法要会用,特别是约束条件的定义。比如:

CREATE TABLE Student ( Sno CHAR(10) PRIMARY KEY, Sname VARCHAR(20) NOT NULL, Sage INT CHECK (Sage > 0), Sdept VARCHAR(20) DEFAULT '计算机系' );

这里的PRIMARY KEY是实体完整性,NOT NULL和CHECK是用户定义完整性,后面加外键约束时用REFERENCES,对应参照完整性。笔试常考“如何用SQL实现参照完整性”,答案就是外键子句。

删除和修改表的操作也要熟练。DROP TABLE会自动删除表结构和数据,而且通常会级联破坏引用关系;ALTER TABLE用来增删列或修改约束,比如“增加年龄列”就是ALTER TABLE Student ADD Sage INT;

2.2 联结与子查询:笔试爱考的两大流派

联结分内连接、外连接(左外、右外、全外)。内连接只保留满足连接条件的行,左外连接还会把左表中没匹配上的行也保留,缺失的右表列填NULL。

选择题最爱考:查询“没有选任何课程的学生名单”。如果用连接做,自然连接后,选课表里没有对应记录的学生的课程号列会是NULL,这时筛选WHERE 课程号 IS NULL即可。但更直观的是子查询:

SELECT Sname FROM Student WHERE Sno NOT IN ( SELECT Sno FROM SC );

这里有个经典坑:如果子查询结果包含NULL,NOT IN会返回空结果。比如SC表中Sno列存在NULL(虽然理论上Sno是主键不会为NULL,但一些题会设置这种场景),用了NOT IN就很可能查出空表。更稳妥的写法是NOT EXISTS:

SELECT Sname FROM Student WHERE NOT EXISTS ( SELECT 1 FROM SC WHERE SC.Sno = Student.Sno );

EXISTS的语义是“是否存在”,不关心返回什么列,所以子查询里写SELECT 1是标准写法。考试时如果两种写法都给分,不确定子查询中是否有NULL就先选EXISTS,这是个救命技巧。

2.3 分组聚合的易错点

聚合函数(COUNT、SUM、AVG、MAX、MIN)经常和GROUP BY一起出现。这里必须记住一条铁律:SELECT后的普通列必须出现在GROUP BY中,或者被聚合函数包裹。否则结果没有意义。

例题:查询每门课程的平均成绩,按课程号分组:

SELECT Cno, AVG(Grade) FROM SC GROUP BY Cno;

如果题目再加条件:“只统计选课人数超过10人的课程”,就要用到HAVING:

SELECT Cno, AVG(Grade) FROM SC GROUP BY Cno HAVING COUNT(*) > 10;

WHERE和HAVING的区分是高频易错点。WHERE是在分组前对原始行过滤,HAVING是在分组后对分组结果过滤。可以这么记:“先WHERE,再GROUP BY,后HAVING”。如果条件用到了聚合函数,比如COUNT(*)>10,绝对不能放WHERE里,因为WHERE执行时聚合函数还没算出来。

2.4 SQL练习题:经典学生-课程库

建表结构:学生表S(Sno,Sname,Ssex,Sage,Sdept),课程表C(Cno,Cname,Ccredit),选课表SC(Sno,Cno,Grade)。

练习1:查询计算机系男生年龄小于20的学生姓名和年龄。

SELECT Sname, Sage FROM S WHERE Sdept = '计算机系' AND Ssex = '男' AND Sage < 20;

练习2:查询每门课程的最高分,并按课程号升序排列。

SELECT Cno, MAX(Grade) FROM SC GROUP BY Cno ORDER BY Cno ASC;

练习3:查询至少选修了两门课程的学生学号。

SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) >= 2;

练习4:查询选了“数据库原理”这门课且成绩在90分以上的学生名单。这里要把三张表连接起来,最直观的方式是自然连接加WHERE:

SELECT DISTINCT S.Sname FROM S, SC, C WHERE S.Sno = SC.Sno AND SC.Cno = C.Cno AND C.Cname = '数据库原理' AND SC.Grade >= 90;

注意DISTINCT,因为一个学生在同一门课可能有多次选课记录(如果有补考的话),加上DISTINCT避免重复行。实际项目里也建议养成这个习惯。

笔试中如果出现“检索”字眼,一般用SELECT;出现“修改”就是UPDATE。UPDATE语句必须有WHERE,否则全表更新。这一条我反复强调,因为一旦少写WHERE,后果不堪设想。考试也喜欢问“如果UPDATE语句没有WHERE会怎样”,答案就是对所有元组执行修改。

3. 数据库设计:ER图转关系模式,范式的判别要靠函数依赖

3.1 ER图里经常踩的三个坑

ER模型是设计阶段的重要产出,考试喜欢让你画ER图,或者反过来根据文字描述补关系模式。画图时最容易踩三个坑。

第一个坑是把原本是属性的东西当成实体。比如学生的班级,如果班级只有一个名称属性且不需要单独管理,就该作为学生实体的属性;但是如果要保存班级人数、班主任、所属学院等额外信息,班级就应该单独设计成实体。

第二个坑是联系转换时丢失外键。实体A和实体B是1:n联系,假设一个班级有多个学生,那么在“学生”关系模式中要加入“班级编号”作为外键,指向班级表的主键。很多同学只画出两个实体表,忘了在n端加外键,这就丢掉了联系的表达。

第三个坑是m:n联系的转换。学生和课程之间是m:n联系,通常连接成选课关系表,这个表中至少要包含两个外键,即学生号和课程号,这两个外键的联合通常构成主键,还可以加上成绩属性。这个表也叫联系表。

3.2 范式通关:从1NF到BCNF

范式判断是《数据库原理及应用》的核心难点,也是大题常客。我按判定顺序给一个对照表:

范式判定条件通俗理解
1NF所有属性都是不可分的原子值没有“列表型”的列
2NF满足1NF,且每个非主属性完全函数依赖于候选键非主键列不能说“只依赖主键的一部分”
3NF满足2NF,且没有非主属性对候选键的传递函数依赖非主键列不能通过另一个非主键列间接依赖主键
BCNF每个决定性因素都包含候选键所有函数依赖的左边都是候选键

做题时的步骤:画出函数依赖集,找出候选键,然后逐条检查是否满足。比如关系模式R(学号, 课程号, 成绩, 教师, 教师职称),函数依赖集F={学号,课程号→成绩, 课程号→教师, 教师→教师职称}。

候选键是(学号,课程号),这是通过闭包算出来的。判断是否满足2NF:因为“成绩”完全依赖(学号,课程号),没问题;但“教师”只依赖课程号,是部分函数依赖,所以R不满足2NF。如果还想规范到2NF,就要把表分解成R1(学号,课程号,成绩)和R2(课程号,教师,教师职称)。

注意3NF还要求“非主属性对码没有传递函数依赖”,R2里课程号是主码,教师是非主属性,教师职称依赖教师,教师又依赖课程号,所以职称是传递依赖,R2仍不满足3NF,需要再拆成R21(课程号,教师)和R22(教师,教师职称)。

3.3 函数依赖的闭包与候选键求法

求候选键是范式题的第一步,方法比较机械。

给定关系模式R(U,F),例如U={A,B,C,D},F={A→B, B→C, D→B}。

先找到只在函数依赖左边出现的属性、只在右边出现的属性、两边都出现和都不出现的属性。只在右边出现的属性不可能在候选键里,因为它是被决定的;只在左边出现的属性一定在候选键里,因为它决定了别人但没有属性决定它;两边的属性要组合验证;两岸都出现的也要加入候选键。

具体来说,L类属性(只出现在左部):A、D。LR类(两边都出现):B(在A→B的右边,B→C的左边)。R类(只出现在右边):C。先计算L类属性集合{AD}的闭包。闭包算法:

  • 初始X = {A,D}。
  • 扫描F,如果某个函数依赖左部在X中,就把右部加入。A→B,A在X中,加入B,X={A,B,D}。B→C,B在X中,加入C,X={A,B,C,D}。此时X已经是全集U,所以{AD}的闭包是全部属性,{AD}就是一个候选键。

如果L类闭包不是全集,就把LR属性逐个加进去尝试。这是基本功,建议拿5道题练熟。

3.4 数据库设计综合题演练

题:某学校要管理学生选课,涉及系(系编号,系名,办公地点)、学生(学号,姓名,出生日期,系编号)、课程(课程号,课程名,学分)、教师(教师号,姓名,职称,系编号),一名学生可选多门课程,每门课程可由多个学生选,选课后有成绩;一名教师只能属于一个系,一个系有多名教师;一门课程由一名教师授课,一名教师可授多门课程。

第一步:画ER图,这题对象清晰,实体是系、学生、课程、教师,联系是学生选课(m:n,有成绩属性)、教师属于系(n:1)、教师授课(1:n,一个教师教多门课)。

第二步:转关系模式。系(系编号,系名,办公地点),主码系编号。学生(学号,姓名,出生日期,系编号),主码学号,外码系编号。教师(教师号,姓名,职称,系编号),主码教师号,外码系编号。课程(课程号,课程名,学分,教师号),主码课程号,外码教师号。选课(学号,课程号,成绩),主码(学号,课程号),外码学号、外码课程号。

第三步:判断范式。以上关系模式基本都能达到BCNF。比如选课表,函数依赖只有(学号,课程号)→成绩,左边是全部候选键,所以是BCNF。课程表里如果存在课程号→教师号这种依赖,而候选键是课程号,依赖左边是候选键,也满足BCNF。

综合题往往是“转关系模式”和“判断范式”连在一起考,关系模式转得对,范式才判得对,所以前面ER图的联系细节一定要分析完整。

4. 事务、并发控制与恢复:理论与实践最容易脱节的一章

4.1 ACID后面是一堆机制

事务的四个特性:原子性、一致性、隔离性、持久性。

  • 原子性:事务要么全做,要么全不做,通过日志的撤销操作实现。
  • 一致性:事务执行前后数据库都处于一致状态,由原子性、隔离性共同保证,更依赖应用层逻辑。
  • 隔离性:并发事务之间不能互相干扰,由并发控制实现。
  • 持久性:事务一旦提交,结果就不会丢失,通过重做操作实现。

考试特别喜欢问“数据库管理系统如何保证事务的持久性”,答案不是“保存到硬盘”这么简单,而是通过日志,在事务提交前把修改写到日志文件,介质故障时就能通过日志REDO。

4.2 丢失更新、不可重复读、读脏数据:用一个故事串起来

并发操作会带来三类数据不一致问题,我常用银行转账的例子讲。

假设两个事务T1和T2同时对A账户余额1000元做操作。T1把A加100(变为1100),T2把A减50(变为950)。如果T1先写A,T2后写A,最后A=950。但理论上,T1先执行完整个事务后T2再执行,结果应该是1050。问题在于,T2读到的A是1000(旧值),然后计算1000-50=950,覆盖了T1写的1100,这就是丢失更新。本质是两个事务都基于旧值做写操作,后写覆盖先写。

不可重复读是指T1在两次读取同一数据之间被T2修改,导致T1第一次读到1000,第二次读到1050,前后不一致。

读脏数据是指T1修改了数据,还没提交,T2读了这个未提交的数据,之后T1回滚,T2读到的就是无效的“脏”数据。

这三类问题统称并发一致性问题。其中丢失更新是最严重的,因为它会导致最终结果错误;不可重复读和脏数据至少数据来自已提交或未提交的状态,问题性质不同。考试会问“哪个问题是由一个事务读到另一个未提交事务产生的”,答案就是读脏数据。

4.3 封锁协议怎么记?先搞懂“锁的兼容矩阵”

解决并发问题最经典方法是封锁。锁的分类就两种:排他锁(X锁,写锁)和共享锁(S锁,读锁)。规则是:

  • X锁:一个事务加了X锁后,其他事务不能再对这个数据加任何锁。
  • S锁:一个事务加了S锁后,其他事务还可以加S锁,但不能加X锁。

兼容矩阵可以简记为:“表格中S和S兼容,其余都不兼容”。很多教材会画2x2矩阵,记住对角线上只有S/S是相容的,其他都是冲突。

三级封锁协议,这是必背内容:

  • 一级封锁协议:事务在修改数据前加X锁,直到事务结束才释放。能防止丢失更新,但不能防止不可重复读和读脏数据。
  • 二级封锁协议:在一级基础上,事务在读取数据前加S锁,读完即可释放。能防止丢失更新和读脏数据,但不能防止不可重复读。
  • 三级封锁协议:在一级基础上,事务在读取数据前加S锁,直到事务结束才释放。三种问题都能防止。

记忆线索是“一级管写,二级管读但不持久锁,三级读锁也持久”。题目如果问“某协议允许事务在读取数据后立即释放S锁,问它属于哪级协议”,答案是二级封锁协议。

死锁是另一个考点。数据库中死锁的处理方法包括预防和检测,常见预防死锁的方法有一次性封锁法(每个事务一次将所有需要的数据加锁)、顺序封锁法。考试让你判断“会不会死锁”时,画个等待图即可,出现循环等待就说明死锁。

4.4 冲突可串行化判断方法:优先图

给定一个并发调度,判断是否冲突可串行化的标准做法是画优先图。先找冲突操作对,冲突是指两个不同事务对同一数据的读写或写写操作,且至少一个是写操作。比如T1读A和T2写A是一对冲突,T1写A和T2写A也是一对冲突。

构造优先图:如果两个冲突操作中T1先执行而T2后执行,就画一条从T1到T2的有向边。遍历所有冲突对,如果图中没有环,则这个调度是冲突可串行化的;有环就不是。

口诀是:冲突操作有先后,先者指向后者,有环才不可串行化。

值得注意的是,不可串行化但不会出错的情况也存在,但考试默认用优先图判断。做题时一定要把所有不同的数据项分开看,别漏掉写写冲突。

4.5 故障恢复:REDO和UNDO用例

数据库故障分事务故障、系统故障和介质故障。事务故障用UNDO,系统故障用UNDO+REDO,介质故障用REDO。

日志文件的核心内容是记录每个事务对数据项的修改前后值。恢复时,对未提交的事务(没有COMMIT日志记录)执行UNDO:将数据恢复到旧值;对已提交但结果没写回磁盘的事务执行REDO:把修改重新做一遍。

记住一个判定:日志里出现了事务的COMMIT记录,就正常REDO;没出现COMMIT,就UNDO。这个规则在填空题和大题里非常实用。

4.6 并发控制习题与解析

题:调度序列如下,判断是否冲突可串行化:T1读A,T2写A,T1写A,T2提交,T1提交。

先找冲突操作:A数据上的操作包括T1读A、T2写A、T1写A。T2写A与T1读A冲突,T2写A在T1读A之后,因为序列中是T1读A,T2写A,所以顺序是T1读A先于T2写A,优先图有边T1→T2。T2写A与T1写A冲突,序列中T1写A在T2写A之后,也就是T2写A先于T1写A,所以边T2→T1。图中出现环T1→T2→T1,所以不可冲突串行化。

这类题只要按步骤画图就不容易错。注意有些教材把提交也纳入排序,但最终看的是冲突操作的先后关系,只要没有环就可以通过交换非冲突操作得到一个串行调度。

5. 复习策略与考前避坑:把“看过”变成“会做”

5.1 三级模式两级映像,几乎是每年必考

数据库系统的三级模式结构:外模式、模式、内模式。对应的两级映像:外模式/模式映像、模式/内模式映像。

  • 模式就是概念模式,是所有用户的公共数据视图,基本表和视图在此层。
  • 外模式是用户视图的子集,也叫用户模式。
  • 内模式是物理存储模式,描述数据在磁盘上怎么组织。

两个映像的作用:

  • 外模式/模式映像保证了数据的逻辑独立性:模式改变时,只需修改外模式/模式映像,用户程序无需改变。
  • 模式/内模式映像保证了数据的物理独立性:存储结构改变时,只需修改模式/内模式映像,模式不变。

选择题常考“数据库系统的数据独立性是指什么”“改变存储结构应用程序不变,靠的是哪一级映像”,共性答案是模式/内模式映像。这个考点几乎是送分,但总有人算错。

5.2 几个高频易混淆点

数据库的复习里,有几个地方容易反复错,我列一张易混淆对照清单:

易混点区别
WHERE vs HAVINGWHERE在分组前过滤,HAVING在分组后过滤,HAVING可以使用聚合函数
PRIMARY KEY vs UNIQUE主键唯一且非空,UNIQUE列可以有多个,且可以为NULL(取决于数据库产品)
内连接 vs 外连接内连接只保留匹配行,外连接保留一边或两边的全部
DROP vs DELETEDROP是删除表结构,DELETE是删除数据行
关系代数选择 vs 投影选择是选行,投影是选列
未提交事务 vs 已提交事务日志里没有COMMIT的要做UNDO,有COMMIT的要做REDO

建议把这些做成小卡片,每天过一遍。我辅导过很多学生,发现他们丢分往往不是因为某道题难,而是因为专业术语混淆导致条件判断错。

5.3 冲刺阶段刷题节奏

如果是期末考前一周,我不建议再按教材顺序从头看,那会越看越焦虑。更有效的路径是先刷一遍历年真题,把错题对应的知识点圈出来,然后回到笔记重点看这些题背后的原理。

时间分配上,我的建议是:

  • 第1天:关系模型+关系代数,做15道题,重点是除法、复合条件选择。
  • 第2天:SQL,建表、查询、更新各来几道,尤其练嵌套查询和分组聚合。
  • 第3天:ER图转关系模式+函数依赖、范式判断,至少做3个综合题。
  • 第4天:事务、并发、日志恢复,画优先图画到手熟。
  • 第5天:整套真题限时模拟,严格按考试时长交卷,然后逐题复盘。

刷题时一定要动手写,不要用眼睛看答案。我见过太多学生觉得“我看懂了”,但一上考场,候选键就是求不出来。手写一遍和不写的感觉完全不同。

5.4 大题答题模板

最后给一个非常实用的通用答题结构,适用于范式判断、数据库设计、并发调度等大题。

第一层面:写出用到的基本定义或已知条件。比如“候选键是唯一标识元组的最小属性组合,根据闭包计算……”。这能让阅卷老师看到你对基础概念是清楚的。

第二层面:展示计算或推导过程。求候选键时,把L类属性、闭包扩展步骤一步步写出来;判断并发调度时,把优先图的边一条条列出来,即使最后结论有偏差,中间过程也能拿分。

第三层面:给出明确结论。比如“该关系模式满足3NF但不满足BCNF,因为……”。尽量把原因写具体,不要只写“不满足”。

这套模板来自于我期末阅卷时的观察:很多人不是不会,而是写在试卷上的东西逻辑跳跃,明明会做却拿不到分。大题是按步给分的,把每一步写清楚,分数自然就拿到了。

以上这些知识点和习题,都是从历年期末和我带过的学生反复踩坑中筛出来的。数据库原理及应用这门课其实并不难,难的是把零散概念串起来形成体系。按这个思路复习,至少在考场上不会看到题目发懵。我到现在都记得当年死磕求候选键的那段时间,每天睡觉前脑子里都是属性闭包,但等我真的搞懂封闭了,再看范式和事务就都有了一种“不过如此”的感觉。希望这份整理也能帮你打通那层窗户纸。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 19:25:20

校园二手书交易系统:SpringBoot+Vue状态一致性设计

简介&#xff1a;本资源是一份完整的本科毕业设计论文文档&#xff0c;面向计算机专业学生及Web开发初学者&#xff0c;聚焦校园二手书交易系统的信息化实践与技术落地。论文基于SpringBoot框架与MySQL数据库构建&#xff0c;系统覆盖用户端书籍浏览/交易、管理员端用户管理/分…

作者头像 李华
网站建设 2026/9/18 19:25:19

Lean 4 环境搭建指南:3 步在 VSCode 里跑起交互定理证明

Lean 4 环境搭建指南&#xff1a;3 步在 VSCode 里跑起交互定理证明 【免费下载链接】lean4 Lean 4 programming language and theorem prover 项目地址: https://gitcode.com/GitHub_Trending/le/lean4 Lean 4 是一门函数式编程语言&#xff0c;同时也是一个定理证明器…

作者头像 李华
网站建设 2026/9/18 19:24:09

物理专业英语词汇:构建术语认知框架的底层工程

简介&#xff1a;本资源是一份面向物理专业本科生、研究生及科研初学者的英语术语速查手册&#xff0c;系统梳理物理学核心分支中的关键英文词汇及其标准中文释义&#xff0c;助力学术阅读、文献研读与国际交流。内容覆盖运动学、力学、电磁学、热学、光学、原子物理学等六大模…

作者头像 李华
网站建设 2026/9/18 19:22:08

Oracle日期时间处理全攻略:类型、函数与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 19:20:51

让 TaoToken 给 Claude Code 供 Key,生成 FICC 功能架构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华