☰
数据库与软件工程笔试核心考点拆解:从SQL到事务与测试策略
2026/9/28 6:28:55 网站建设 项目流程

1. 日本大学院笔试中数据库与软件工程的出题风格分析

先聊点实际的。我在给准备日本大学院入试的学生做辅导时,发现一个特别普遍的现象:很多人把精力全放在专业课的广度上,背了一大堆概念,结果栽在笔试的“常见题型”上。尤其是像“数据库(データベース問題訓練) と 软件工程(ソフトウェア)”这种组合科目,看上去是两门课,实际上出题人经常把两者揉在一道大题里考。比如给你一个业务场景,让你先画ER图,然后写SQL查询,最后再让你谈谈怎么设计测试用例——这一套下来,数据库和软件工程的知识点全带出来了。

1.1 出题人到底想考什么

从历年真题看,日本大学院的笔试(筆記試験)不是单纯考“你记住了什么”,而是考“你能不能把知识用起来”。数据库部分,高频考点集中在关系模型、SQL实操、事务管理、索引优化、并发控制这几个模块。软件工程部分,则集中在需求分析、设计原则(SOLID)、UML建模、测试策略、软件过程模型(瀑布、敏捷、螺旋)这些内容。

有意思的是,不少学校会把这两个科目的知识通过同一个案例来串联。比如题目给出一个图书馆管理系统,要求你:第一问,画出概念模型ER图;第二问,写出根据ER图转换的关系模式;第三问,针对某个查询写出SQL,并分析索引如何优化;第四问,回答在并发借书场景下如何避免超借;第五问,如果让你负责该项目,你会选择哪种生命周期模型,为什么,并且设计几个核心测试场景。这种题目,表面是五个小问,本质上是考察你对整个软件生产链路的理解。如果你只把数据库和软件工程当成孤立的科目复习,就会很吃亏。

1.2 科目之间的衔接点:数据与流程的不可分割性

为什么出题人偏爱这种混合题?因为在真实的软件开发中,数据结构和业务流程本来就是一体的。数据库存储的是业务状态,软件工程管理的是业务状态的变化过程。比如在订单系统中,数据库里的“订单状态”字段,在流程上对应着“待支付、已支付、已发货、已完成”这种状态机。笔试考你SQL和事务,其实就是在考你怎么保证状态变化的正确性;考你软件工程的需求分析和用例设计,其实是在考你能不能把这种状态变化梳理清楚。

所以,在复习时一定要有意识地把两套知识往一块儿“焊接”。比如学数据库的事务隔离级别时,主动问自己:如果我在软件工程中设计一个支付模块,应该选哪种隔离级别?如果选读已提交,会不会出现不可重复读?如果为了性能选了读未提交,又会影响哪些业务一致性?这种跨科目联想,才是应对组合笔试的根本方法。

2. 数据库核心考点拆解:从SQL基础到并发控制

数据库部分,别一上来就死抠复杂调优。大学院笔试更看重基础的扎实程度和原理理解的深度。下面我把最常考的几块逐一拆开,顺便给出一些我辅导时反复强调的易错点。

2.1 关系代数与SQL:不仅要会写,还要懂等价变换

第一类必考题是关系代数和SQL的互转。比如给一个查询需求,让你用关系代数表达式写,再让你用SQL写。这时候,很多学生容易漏掉“去重”的细节。关系代数里的投影操作默认去重,但SQL的SELECT默认不去重(除非加DISTINCT)。考试时如果题目没强调“结果不要重复”,两个答案可能就不等价。我的建议是:在写SQL时,先明确业务语义,如果是一对多连接产生的重复行,必须考虑是否需要DISTINCT。

另外,SQL的考察点通常还包括聚合函数和GROUP BY。这个内容看似简单,但坑特别多。比如:“查询每个部门人数大于3的部门名和人数。”错误写法是直接在WHERE子句里写人数大于3,正确写法是先用GROUP BY聚合,再用HAVING过滤。我一般会让学生记一句话:WHERE是先过滤后分组,HAVING是先分组后过滤。这个逻辑搞混,笔试基本丢一半分。

实操作业:建议自己设计三张表(学生、课程、选课),然后自己出题:查所有选了“数据库”课的学生名单;查每门课的平均分并降序排列;查总分最高的学生。每道题都用两种方式写一遍(子查询和JOIN),对比执行结果。这个动作练熟了,SQL基础就算过关了。

2.2 索引优化:笔试里的“隐形杀手”

索引这块,笔试很少让你直接背B+树结构,但经常给一个慢查询,问你如何优化。这里有个核心原则:索引不是万能的,乱加索引反而会拖慢写入和更新。所以回答优化题时,要分步骤:

  1. 先看SQL的WHERE条件,判断哪些列参与了等值比较、范围比较、排序。索引最左前缀原则是默认前提。
  2. 考虑覆盖索引,即查询的列都包含在索引中,避免回表。
  3. 说说为什么不能索引函数列,比如WHERE DATE(time)=‘2025-01-01’这种,会导致索引失效。
  4. 如果查询涉及JOIN,连接列的字段类型和排序规则必须一致,否则索引也白搭。

举个例子,典型的笔试题:SELECT * FROM orders WHERE user_id = 123 AND created_at > '2024-01-01' ORDER BY created_at DESC LIMIT 10。优化思路是建立复合索引(user_id, created_at),因为user_id是等值条件,created_at可以用于排序和范围过滤。如果你只建了created_at单列索引,user_id的过滤就要回表,效率低很多。回答时要把这个推导过程写出来,比单纯写“加索引”三个字强得多。

2.3 事务与并发控制:隔离级别的真正含义

事务题每年都有,而且越来越往“实际业务冲突”靠。比如:“转账场景下,有两个事务同时操作,一个读余额,一个写余额,会出现什么问题?如何解决?”这种题,实质是在考事务的ACID特性和隔离级别。

我的建议是画一张隔离级别对比表,把脏读、不可重复读、幻读的对应关系梳理清楚,这是笔试常见小题。

隔离级别脏读不可重复读幻读
读未提交可能可能可能
读已提交不可能可能可能
可重复读不可能不可能可能(MySQL默认级别下部分解决)
串行化不可能不可能不可能

笔试答题时,不光要写出隔离级别名称,还建议解释一下为什么可重复读在InnoDB下能解决部分幻读(靠间隙锁,Gap Lock)。注意,不同数据库的实现有差异,但大学院笔试通常以MySQL或标准SQL为背景,回答时可以加一句“在标准SQL中,可重复读仍可能出现幻读,但MySQL的InnoDB通过next-key locking解决了这个问题”。这句话一写,阅卷人就知道你懂原理,而不是死记硬背。

还有一个高频题:乐观锁和悲观锁的区别。我总结的答题模式是:悲观锁先加锁再操作,直接禁止并发访问,适合写冲突多的场景;乐观锁通过版本号或时间戳在更新时检查冲突,适合读多写少的场景。在软件工程里,对应的就是控制并发修改的策略选择,比如在电商库存扣减时,用UPDATE ... WHERE stock >= 1这样的条件更新,其实也是一种乐观锁思路。

3. 软件工程核心考点拆解:从需求到测试

软件工程的笔试内容相对“文气”,但只要掌握了骨架,拿分并不难。核心模块包括:过程模型、需求工程、设计原则、UML图、测试策略。下面挑重点讲。

3.1 软件过程模型:选型比背诵更重要

很多学校喜欢出一道题:“请比较瀑布模型和敏捷开发,并说明在什么场景下选择哪种。”这种题看起来开放,其实有标准答题路径。

先说瀑布模型:阶段清晰(需求、设计、编码、测试、维护),文档完备,适合需求明确、变动少的项目,比如某些军工或大型基础设施系统。缺点是跟不上需求变化,风险后移。

再说敏捷开发:强调迭代增量、拥抱变化、频繁交付可工作软件。适合需求不断演进的互联网产品,比如电商平台、移动应用。但敏捷对团队协作能力和用户参与度要求高,如果团队成员经验不足,容易陷入“无文档开发”的混乱。

答题技巧:不要站队说谁好谁坏,而是给出“根据项目特点选择”的结论,然后列出你的决断依据:需求是否稳定?项目规模多大?团队是跨职能还是职能分离?客户能否高频参与?这样一段话写下来,分数不会低。

另外,UP(统一过程)和螺旋模型也会偶尔出现。螺旋模型重点关注风险分析,适合大型复杂项目。UP则强调用例驱动和架构为中心。这些模型中,至少要把瀑布、敏捷、螺旋三个的适用场景和核心活动背熟。

3.2 需求工程:从用户模糊想法到规格说明

软件工程题目里的“需求分析”,很多时候会给你一段模糊的用户描述,让你写出功能需求和非功能需求。这里常见的丢分点是分不清两类需求。功能需求描述的是系统“做什么”,比如“支持用户登录”;非功能需求描述的是系统“做得怎么样”,比如“登录响应时间小于2秒”“系统可用性达到99.9%”。

写需求规格时,我推荐用“用户故事”格式:作为〈角色〉,我想要〈功能〉,以便〈价值〉。比如“作为顾客,我想要在线查询订单状态,以便我随时了解配送进度”。这种格式在日本大学的SE课程里也很常用,答题时写出格式和要素,能显示你的专业感。

还有一个高频考点:需求验证。也就是怎么确认你理解的需求正确。方法包括:需求评审、原型演示、验收测试用例编制。我在答题时会强调“需求追踪矩阵”这个工具,也就是把每个功能需求映射到对应的设计文档、代码模块、测试用例,保证没有遗漏。这点在笔试里写出来,会被认为有实际项目意识。

3.3 设计原则与UML建模:画图题的标准解法

软件工程笔试题里,画UML用例图、类图、顺序图的题目很常见。画图本身不难,难的是画对关系。比如类图里的聚合和组合,很多学生搞不清。

聚合是整体和部分可分离,比如“班级”和“学生”,班级没了,学生还在;组合是整体和部分不可分离,比如“订单”和“订单项”,订单删除,订单项就没意义了。在考试时,如果题目没有明确说明生命周期,最好用聚合,不要随意用组合,因为组合的语义更强,容易画错。

再用类图回答设计题时,可以直接套SOLID原则。比如“开闭原则”对应的设计是“抽象接口+依赖注入”;“单一职责”对应的设计是“一个类只有一个变化原因”。笔试里的经典题:“给你一个支付接口,现在增加一种支付方式,如何设计?”最优答案是定义PaymentStrategy接口,通过工厂方法返回具体策略,而不是用一堆if-else。这样既有设计模式,又有原则支撑,答案非常漂亮。

顺序图要注意的是消息顺序和生命周期线。画的时候先列用例场景,比如“用户下单、支付、扣库存”,每个步骤对应一条消息,消息名要写清楚操作和方法名,比如submitOrder(),deductStock()。别画得过于繁琐,把核心交互过程表示清楚即可。

3.4 测试策略:从单元测试到验收测试

测试相关的笔试题,经常是给你一个功能描述,让你设计测试用例。比如“设计一个用户名合法性校验功能,规则为6-20位字母或数字,且必须以字母开头”,然后要求写测试用例。

我在辅导时反复强调,写测试用例必须覆盖三类:正常输入、边界输入、非法输入。以这个问题为例:

  • 正常输入:abc123,输出合法。
  • 边界输入:a(长度最下边界,不合法),abcde12345(长度恰好20位,合法),abcdefgh(6位纯字母,合法)。
  • 非法输入:1abc(数字开头,不合法),abc!@(含符号,不合法),abcdefghijklmnopqrstuvwxyz(超过20位,不合法)。 如果笔试还问你“使用什么测试方法”,记得提等价类划分和边界值分析。这两个是最常用的黑盒测试技术,属于必背知识点。

另外,单元测试(JUnit/pytest)和白盒测试的区别也有必要掌握:白盒测试关注代码路径覆盖(语句覆盖、分支覆盖、条件覆盖),黑盒测试关注功能和需求匹配。笔试选择题经常出现“哪种覆盖标准最严格”,顺序是:语句覆盖 < 判定覆盖 < 条件覆盖 < 路径覆盖。把这个顺序记牢,选择题就能秒选。

4. 真题实战演练:数据库与软件工程的综合案例分析

前面拆完了知识点,现在来一道仿真的综合题,带着你一步步分析、落笔。这道题是我基于常见真题改编的,考察点覆盖范围很广,建议你先自己试着写一遍,再对照我的思路。

4.1 题目描述:图书借阅系统

某大学图书馆拟开发一套图书借阅系统,主要功能包括:图书信息管理、读者注册、借书、还书、预约图书。已知最初系统需要支持至少100名读者同时在线查询,且要求读者借书时不能超过最大借阅数量(每人5本)。请回答以下问题:

  1. 请画出该系统的用例图,并标注主要参与者和用例关系。
  2. 设计实体关系ER图,并转换为一组关系模式,主键用下划线标识。
  3. 写出SQL查询:查找“被预约次数最多的前3本图书”的书名和预约次数。
  4. 两个读者同时借阅最后一本库存图书,如何保证只有一个读者能借到?请用事务或锁机制说明。
  5. 若采用敏捷开发模式,你会如何规划第一个迭代的功能范围?如何设计验收测试场景?

4.2 我的参考答案与思路拆解

作图部分先不展开画,但思路要清楚。用例图至少包含参与者:读者、图书管理员、系统。用例包括:注册登录、查询图书、借书、还书、预约图书、管理图书信息。注意,借书过程可能还涉及超期提醒、额度校验等,但不必过于细节。

ER图部分,核心实体有:读者(读者ID、姓名、手机号、借阅额度)、图书(ISBN、书名、作者、总库存、可借数量)、借阅记录(借阅ID、读者ID、ISBN、借出时间、应还时间、实际还书时间)、预约记录(预约ID、读者ID、ISBN、预约时间、状态)。关系模式就按这三个实体外加两个关系写。注意借阅记录和预约记录是一对多关系,读者和图书是多对多关系,通过借阅记录作为关联表。

SQL查询,写标准SQL:

SELECT b.book_name, COUNT(r.reserve_id) AS reservation_count FROM books b JOIN reservations r ON b.isbn = r.isbn GROUP BY b.book_name, b.isbn ORDER BY reservation_count DESC LIMIT 3;

这里有三个易错点:第一,COUNT的对象应该是预约记录ID,别写成主表行数;第二,如果并列第三名,LIMIT 3可能漏掉并列的,可以用DISTINCT或窗口函数来处理;第三,试卷可能要求“所有图书没有预约的也要显示”,这时用LEFT JOIN。我在答题时会把这两种版本都写出来,并注明差异,展示思考深度。

并发控制题,核心答案是:用“乐观锁”或者“悲观锁”都可以,关键是返回值要判断。最稳妥的写法是:在一个事务里,用SELECT ... FOR UPDATE锁住该图书库存记录,然后检查可借数量是否大于0,再执行UPDATE books SET available = available - 1 WHERE isbn = ...,最后提交。另一个思路是直接用条件更新:

UPDATE books SET available = available - 1 WHERE isbn = '...' AND available > 0;

检查影响行数,如果为0说明被别人抢先了。这种写法不需要显式事务,但要注意在并发极高时,因锁等待可能产生超时。我在回答时还会补充,如果系统允许一定的超卖,可以用消息队列异步扣减,但那通常是互联网电商的做法,图书馆系统一般不这样,要就题论题。

最后的敏捷规划题,没有绝对标准答案,但要体现逻辑。我会先定义第一个迭代要交付的最小可用产品(MVP):读者注册、图书查询、借书还书。预约和超期提醒放到第二个迭代。然后为MVP写3-5个核心验收场景,比如“读者成功借阅一本书后,可借数量减少1,且该书库存减1”“读者借满5本后,再借书会被拒绝并提示额度不足”。这种有核心业务闭环、没有外延依赖的切片,才适合作为第一个迭代交付。

4.3 综合题的失分点总结

这类综合题,我见过太多学生写“半吊子”答案。常见失分点有三处:

第一,关系模式没有标主键。题目明确要求用下划线标识,你不做,直接扣分。你可能会想“这又不是论文”,但笔试就是按点给分,细节决定成败。

第二,SQL的聚合函数用错。比如求“前三名”时,用ORDER BY但忘了分组,或者把HAVING当WHERE乱用。建议考试时,先想清楚过程:分组、筛选、排序、限制。按这个顺序写,不容易乱。

第三,并发题回答得太笼统。有人只写“加锁”,不写锁的类型、锁的粒度、事务的隔离级别。阅卷人想看到你“加的是行锁还是表锁?读锁还是写锁?锁在哪个语句生效?”把这些讲清楚,答案才算完整。

5. 备考时间规划与高频错误规避

光知道考什么不够,还要知道怎么练。这一部分,我结合自己带学生的经验,聊聊备考节奏和在数据库、软件工程交叉复习时踩过的大坑。

5.1 三个月备考计划表(锚定笔试前的时间线)

假设你距离笔试还有3个月,我建议按阶段推进:

  • 第1个月:通读教材,建立知识图谱。数据库部分,重点过《数据库系统概论》的ER模型、关系代数、SQL、事务章节;软件工程部分,重点过生命周期、需求分析、设计模式、UML。每学完一节,刷10道对应的基础选择题。
  • 第2个月:专项突破,刷过去问。找到目标大学院过去5年的笔试真题,每两天做一套真题。不要求完整背诵答案,但要把每道题的考点标注出来,整理成“考点-题型-参考答案”三列笔记。
  • 第3个月:模拟冲刺。每周挑一个完整上午做一套全真模拟,严格计时,训练答题速度和书写规范。重点针对综合题进行口头复述式练习,就是看到题目后,先不要动笔,用语言表述你的解题步骤,再对照标准答案,找出逻辑漏洞。

这个计划的关键在于“定时回顾”。我习惯用表格记录自己的正确率和薄弱知识点,每周复盘一次。比如SQL子查询总错,就单独列一个“子查询补弱清单”,连续三天每天默写三类子查询(标量、列值、表子查询)。软件工程同理,画类图不规范,就画三张同样结构的类图,直到线条、关系标识符都标准。

5.2 高频错误top5:数据库篇

第一个错误是数据库连接池的理解偏差。笔试选择题经常出现“为什么使用数据库连接池”,正确答案是“复用连接,降低创建和销毁连接的开销”。但很多学生选成“缓存SQL结果”,这就是概念混淆。连接池管理的是物理连接,并不负责查询结果缓存,这个要分清。

第二个错误是主键和外键的辨析。出题人有时会问:“对于学生选课表(学号,课程号,成绩),主键是什么?”正确答案是复合主键(学号,课程号),而不是把学号当成主键。注意,外键不一定非是另一个表的主键,但必须引用该表的主键或唯一键。这种基础知识失分就太冤枉了。

第三个错误是可重复读与幻读的区分。前面表格已经给了,这里不再重复。面试笔试里常见的一道题是:“在可重复读隔离级别下,执行两条相同的查询,第一次查到100条,第二次查到120条,可能吗?”答案是在标准SQL下可能,是幻读。但在InnoDB下,由于间隙锁,可能防止闪烁。回答这道题时,一定要点出数据库实现差异。

第四个错误是索引失效的陷阱。比如在WHERE中对列做了运算,如WHERE salary * 2 > 6000,索引会失效。正确的改进是写成WHERE salary > 3000。这个点几乎每套真题都会出现。

第五个错误是死锁与活锁的概念混淆。死锁是两个事务互相等待对方释放资源,活锁是某个事务永远等待同一资源。回答“如何检测死锁”时,要提到等待图或超时机制,别把两者混为一谈。

5.3 高频错误top5:软件工程篇

第一个错误是把UML类图的依赖关系画成关联。依赖关系是瞬时的,比如方法参数类型;关联是长期的,比如类属性。有些学生看到两个类有调用关系,就画直线或者箭头,没有区分是“依赖”还是“关联”,这就会扣分。

第二个错误是“面向对象设计原则”与“设计模式”的对应。软件工程笔试会让你举例“哪种模式符合开闭原则”。这时不要写“工厂模式”,虽然工厂模式也符合,但要更具体,比如“策略模式允许在运行时切换算法,符合开闭原则”。如果只写“用工厂模式”,则太过泛泛。

第三个错误是需求优先级排序。题目常常说“有两个功能,一个核心、一个次要,你会如何排优先级”,有的人直接回答“核心优先”,没有给判断标准。实际上要用MoSCoW法则:Must have、Should have、Could have、Won't have,然后解释为什么这个功能是Must-have,比如涉及系统拦截器或主业务闭环。按优先级定迭代顺序,才是考官想看到的回答。

第四个错误是测试用例设计遗漏边界值。比如输入“年龄为0、负数、100岁、200岁”,边界是0和200,但很多人只写“0和200”,没有写“-1和201”这样的越界值。记住,边界值分析要覆盖上下边界以及边界两侧各一点。

第五个错误是软件过程模型的选择不结合项目特点。比如题目描述了一个“需求非常明确但周期很长的传统系统”,有人直接写“用敏捷开发”,却没有说明为什么。敏捷不等于万能,需求明确、无客户近距离协作的项目,选敏捷反而是劣势。答题时一定要给出“因为这个项目需求稳定,所以瀑布更合适”这样的理由。

6. 实操笔记:我是如何整理这份练习题的

最后,分享一点我个人的方法论。每次备考,我都会把“知识点图谱”和“错题集”结合在一本笔记里。这个习惯是从大学院的先辈那里学来的,后来自己带学生时也验证了效率。

6.1 构建知识卡片的个人技巧

知识卡片不要做成抄书,而是做成“问题-触发词-答案”结构。比如数据库部分,一张卡片可以写:

  • 触发词:事务隔离级别
  • 问题:脏读、不可重复读、幻读分别在什么隔离级别下可能发生?
  • 答案:读未提交可能脏读;读已提交可能不可重复读;可重复读可能幻读(标准SQL),但InnoDB可防止。

软件工程部分:

  • 触发词:UML关系
  • 问题:聚合和组合的区别?
  • 答案:聚合表示整体与部分的弱关系,组合表示强归属关系。组合中部分不能单独存在。

卡片背面还可以写一个真题题号,方便回扣试卷。

我习惯用活页纸记录,按章节分类,每张卡片只写一个核心点。在考前冲刺时,我只需要翻看卡片,就能快速把知识框架在脑海里过一遍。这个方法特别适合多头绪、多学科交叉的笔试准备。

6.2 动手写真题的讲究

很多学生只看答案,不动笔。笔试的最终要求是“能在限定时间写出正确且结构清晰的答案”。所以,我每次让学生刷真题时,都要求按考试规范做:

第一,每题先用草稿纸理清答题框架。比如综合题,先列出分点,再补充细节。宁可字迹工整但少写几句话,也不要潦草写一页却没有分点。

第二,SQL题必须实际运行。哪怕只是UDF,也建议你在自己的电脑装个MySQL或SQLite,把真题里的SQL跑一遍。有些看似正确的写法,一运行就报错,比如聚合函数和GROUP BY的顺序问题。运行时,注意数据库中存的NULL值,聚合函数会忽略NULL,但如果你用COUNT(*),NULL行也算。这个细节笔试选择题经常出。

第三,限时训练。每套往年真题我建议在2小时内完成。数据库和软件工程的综合题,往往需要35-40分钟,所以前面基础题要快准狠,不能犹豫。如果一道选择题犹豫超过2分钟,先跳过,把综合题写完再回头。

6.3 从练习到真正掌握的“输出闭环”

学习的最高境界是讲给别人听。我每复习一个章节,都会假装面前坐着一位同学,把这一章的核心概念、常见例题、易错点讲一遍。讲不下去的地方,就是你没吃透的地方,立刻回去翻书,然后第二天再讲一次。

这个方法在数据密集型科目中尤其有效,因为数据库的知识点结构性强,很适合口头表述。比如你向别人解释“为什么B+树适合做数据库索引”,如果你能把“树的高度低、叶子节点是链表、适合范围查询”这几个点流畅说出来,说明你真的懂了,而不是只会背定义。

最后,多关注目标院校的过去问风格。有学校喜欢考大量选择题,尤其是概念辨析;有学校喜欢考1-2道大综合题。前者需要刷题量,后者需要思维深度。你要根据学校特点,合理分配复习精力。我自己当初备考时,就是把过去问刷了两遍,第一遍熟悉题型,第二遍总结出题规律和解题模板,到了考场心里就有底了。

这期内容就聊到这里。如果你也在准备数据库与软件工程的交叉科目,希望我拆解的这些考点和实操思路能帮你少走弯路。下期我再自己坐下来,认真做几套模拟题,然后继续分享踩坑记录。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询