尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

数据库课程设计实战:教务管理系统从E-R图到MySQL事务

数据库课程设计实战:教务管理系统从E-R图到MySQL事务 简介这份数据库课程设计报告以教务管理系统为实战案例完整呈现从需求分析、功能模块划分到数据库设计的全过程适合数据库课程设计、毕业设计及自学SQL建模的读者参考。报告明确系统包含学生学籍、教学、教师、教材四大管理模块并给出全局E-R图、关系模式及各表数据字典学生、教师、教材、课程、选课等关键表的字段与约束均有细致说明可直接借鉴用于类似管理系统设计。资源为1个PDF文件约1.28MB内容即完整课程设计报告。目前已有233人学习下载适合需要快速理解数据库设计文档写法或参考教务系统表结构的读者。1. 数据库课程设计报告教务管理系统到底在考什么“数据库课程设计报告——教务管理系统.pdf”这份标题背后是计算机专业最常见也最容易被低估的一个方向教务管理系统。最反直觉的地方在于它的代码量比成绩查询系统大不了多少但答辩时老师问得最深的恰恰是关系模式、范式和并发选课那几张表很多人的报告里画着 E-R 图DDL 却对不上一进教室就翻车。这篇笔记按我自己的交付流程来写从 E-R 图与 3NF 的关系模式到 MySQL 物理建表和索引再到 JDBC 事务与连接池参数最后落到 PDF 报告的章节编排和答辩前的检查清单。想把手上的课设做成“能自圆其说、敢被追问”的完整交付物照着这条线走比堆代码省力得多。2. 把教务管理拆成 E-R 图5 张表和选课关系的由来2.1 业务边界先立住哪些功能必须做哪些果断不做做数据库课程设计最忌讳的一件事是把“教务管理系统”理解成去网上找一个在线教育平台。先把边界画清楚这个系统只需要两类主要用户加一个管理员端管理的就是学生档案、教师档案、课程、开课、选课退课和成绩录入查询这六件事。至于公告发布、教室预约、教学计划自动排课在课设阶段一律不做因为每多一张表就多一份外键和维护负担评分点不会因为表多而增加。最小业务流其实很清晰管理员维护学生、教师和课程的基础数据教师对教学班里的学生录入成绩、修改成绩学生查看可选的课程、选课退课、查看自己的成绩和课表。这个闭环正好覆盖了数据库“增删改查”四类操作也是老师最看重的几个打分点。你不需要在需求分析里写“系统支持消息推送、在线支付”那不是教务管理是给自己挖坑。边界确立之后再去画用例图就非常快。每个角色手里握着的功能不超过四个每个功能都能在后面的关系模式里找到对应表而不是让需求分析变成一张漂亮的空壳。2.2 概念设计E-R 图里的实体、属性与联系概念设计阶段要回答的问题是这个系统里到底有哪些实体、它们之间是什么关系。我按最常用的课设口径拆出四个强实体学生学号、姓名、性别、班级、专业、入学年份、联系电话教师工号、姓名、职称、学院、联系电话课程课程号、课程名、学分、课程类型、总学时教学班开课班号、学期、开课容量、已选人数实体间的联系是这套图的核心。课程和教学班之间是一对多一门课可以在不同学期由不同老师开出多个班教师和教学班是一对多一个老师可以带多个班。学生和教学班之间才是真正的多对多而且这个联系上挂着两个属性成绩和选课时间。按照 E-R 图到关系模式的转换规则带属性的多对多联系必须转成一张独立的关系模式这就是后面的选课表。这里最容易漏掉的是“教学班”这个实体。如果让选课直接挂 course_id同一门课不同老师、不同学期开出的班就全部混在一起成绩录入根本没有办法定位到具体班次。很多翻车的课程设计报告问题就出在这一层E-R 图里只有学生、课程、教师三张表选课记录里既没有学期也没有老师答辩时老师一追问就答不上来。属性设计上也要克制。电话号码用 VARCHAR(20) 而不是 INT因为号码不需要做算术运算而且以 0 开头的号码会被 INT 吞掉。学分这类数值用 DECIMAL(3,1) 而不是 FLOAT浮点数的比较误差在成绩统计时会给你找麻烦。这些细节在第三章的字段选型表里会再展开。2.3 关系模式与范式为什么选课联系必须转成表概念设计完成后进入逻辑设计。我通常会把关系模式清单整理成一张表这张表也是报告“逻辑结构设计”章节的骨架关系主键外键说明studentstudent_id无学生基本档案teacherteacher_id无教师基本档案coursecourse_id无课程基本档案teaching_classtc_idcourse_id, teacher_id某学期某老师的开课班enrollmentenroll_idstudent_id, tc_id选课记录含成绩teaching_class 是连接课程、教师与学生三方的枢纽。它的外键指向 course 和 teacher选课表的外键指向 student 和 teaching_class这样“哪个学生在哪个学期选了哪位老师的课”才能被完整表达出来。成绩属性挂在 enrollment 上而不是 teaching_class 上因为成绩属于“这个学生在这个班的这次选课”语义不能错。范式分析是课程设计报告里必然要被问到的一块但很多同学只会背定义。说点实际的1NF 要求字段原子化上面五张表都满足2NF 要求非主属性完全依赖主键学生表需要单独看一眼。student_id 决定 class_noclass_no 又决定 major 和所属学院于是出现了传递依赖。标准解法是拆出 class 表student 表只保留 class_no。但在课设里我一般会把专业和学院直接冗余进 student 表并且在报告里写明这是有意的取舍选课系统对“学院改名”这类操作的频率极低为这一个小概率事件多连两张表得不偿失。答辩老师看到你写“非规范化设计”比你假装没看见要加分得多。选课表满足 3NF因为 grade 完全依赖于 (student_id, tc_id) 这个候选键。主键最终用自增的 enroll_id 而不是复合主键原因放在第三章物理设计里讲逻辑上需要保证同一个学生对同一个教学班只能有一条选课记录所以必须加一个 UNIQUE(student_id, tc_id) 约束。课程设计做到 3NF 就够不用去炫 BCNF选课系统的决定因素本身就是候选键强行分析 BCNF 反而容易把自己绕进去。3. MySQL 物理设计DDL、字段类型与索引怎么落地3.1 建库建表字符集、存储引擎和 5 张核心表的 DDL物理设计的第一步是建库。MySQL 8 默认就是 InnoDB 加 utf8mb4但课设环境很可能是 5.7或者老师统一指定了服务所以我习惯在建库语句里把字符集和排序规则显式写出来杜绝环境差异带来的乱码问题。CREATE DATABASE IF NOT EXISTS edu_admin_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;字符集选 utf8mb4 而不是 utf8因为 MySQL 里的 utf8 实质是 utf8mb3最多存三字节遇到冷僻字或表情符号会直接报错。教务系统里学生姓名完全可能带生僻字这个坑值得提前堵住。接下来是学生、教师、课程三张基础表的 DDLCREATE TABLE student ( student_id VARCHAR(20) NOT NULL COMMENT 学号, name VARCHAR(50) NOT NULL COMMENT 姓名, gender CHAR(1) DEFAULT NULL COMMENT M/F, class_no VARCHAR(20) DEFAULT NULL COMMENT 行政班, major VARCHAR(50) DEFAULT NULL COMMENT 专业, enroll_year YEAR DEFAULT NULL COMMENT 入学年份, phone VARCHAR(20) DEFAULT NULL COMMENT 联系电话, PRIMARY KEY (student_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE teacher ( teacher_id VARCHAR(20) NOT NULL COMMENT 工号, name VARCHAR(50) NOT NULL COMMENT 姓名, title VARCHAR(30) DEFAULT NULL COMMENT 职称, college VARCHAR(50) DEFAULT NULL COMMENT 所属学院, phone VARCHAR(20) DEFAULT NULL COMMENT 联系电话, PRIMARY KEY (teacher_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE course ( course_id VARCHAR(20) NOT NULL COMMENT 课程号, course_name VARCHAR(50) NOT NULL COMMENT 课程名, credit DECIMAL(3,1) NOT NULL COMMENT 学分, course_type VARCHAR(20) DEFAULT NULL COMMENT 必修/选修, total_hours INT UNSIGNED DEFAULT NULL COMMENT 总学时, PRIMARY KEY (course_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;gender 字段我用 CHAR(1) 而不是 ENUM(‘M’,‘F’)。ENUM 看着省心但以后要加第三个取值时得整表 ALTER迁移和同步工具也不友好CHAR(1) 再加一条 CHECK 约束已经足够表达性别取值域。学号、工号、课程号都用业务编码当主键因为它们本身就是学校统一编号选 VARCHAR(20) 兼容字母数字混排别用 INT。教学班和选课表是这套系统的核心它们决定了你后面能不能做并发选课演示CREATE TABLE teaching_class ( tc_id INT AUTO_INCREMENT PRIMARY KEY, course_id VARCHAR(20) NOT NULL, teacher_id VARCHAR(20) NOT NULL, semester VARCHAR(20) NOT NULL COMMENT 如2024-2025-1, capacity INT UNSIGNED NOT NULL DEFAULT 50, selected_count INT UNSIGNED NOT NULL DEFAULT 0, UNIQUE KEY uk_tc (course_id, teacher_id, semester), CONSTRAINT fk_tc_course FOREIGN KEY (course_id) REFERENCES course(course_id), CONSTRAINT fk_tc_teacher FOREIGN KEY (teacher_id) REFERENCES teacher(teacher_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE enrollment ( enroll_id INT AUTO_INCREMENT PRIMARY KEY, student_id VARCHAR(20) NOT NULL, tc_id INT NOT NULL, grade DECIMAL(5,1) DEFAULT NULL COMMENT 未录入时为NULL, enroll_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_enroll (student_id, tc_id), CONSTRAINT fk_enroll_student FOREIGN KEY (student_id) REFERENCES student(student_id), CONSTRAINT fk_enroll_tc FOREIGN KEY (tc_id) REFERENCES teaching_class(tc_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这个 DDL 里藏着三个重要的选择。第一存储引擎必须写 InnoDB外键、行级锁、事务都是后面并发选课演示的物理基础MyISAM 不支持外键选课系统用 MyISAM 是课设里的硬伤。第二semester 用 VARCHAR(20) 直接存“2024-2025-1”不要拆成年份和学期两个字段再写函数算简单直接查询条件也直观。第三grade 允许 NULL语义是“未录入成绩”0 分是有效成绩这两个在 SQL 统计里完全不同AVG() 会自动跳过 NULL 但会把 0 算进去。3.2 字段类型与主键选型照着参数表选就不会错字段类型这块与其靠记忆不如直接按表选字段类型选择理由学号/工号/课程号VARCHAR(20)业务编码可能带字母不能选 INT入学年份YEAR只关心年份格式不用解析容量/已选人数INT UNSIGNED人数不可能是负数学分DECIMAL(3,1)避免浮点比较误差成绩DECIMAL(5,1)最高 100.0带一位小数不用 FLOAT学期VARCHAR(20)存“2024-2025-1”按字符串查选课时间DATETIME精确到秒配默认值 CURRENT_TIMESTAMP性别CHAR(1)用 CHECK 约束取值避开 ENUM 扩展性坑成绩用 DECIMAL(5,1) 的意思是总位数 5小数一位整数部分最多四位存 100.0 游刃有余。如果听信网上老教程选了 FLOAT往表里存 59.9实际值可能是 59.899999期末排名统计时会出现“两个同学分数一样但排序不同”的诡异结果。主键选型是我在答辩时被问过最多的问题。原则只有一条有稳定业务身份的表用业务主键纯关联表用代理主键。student、teacher、course 的学号、工号、课程号是学校统一编码天然可读直接做主键teaching_class 和 enrollment 本身没有业务编号用自增 INT 当主键再加 UNIQUE 约束保住业务语义。这个组合既让 SQL 简洁又不会丢掉“一个学生不能重复选同一教学班”的规则。3.3 索引与唯一约束防止重复选课的第一道防线索引不该只停留在教科书里要落到实际查询上。我给这套系统加了三处索引ALTER TABLE enrollment ADD UNIQUE KEY uk_enroll (student_id, tc_id); CREATE INDEX idx_student_class ON student(class_no); CREATE INDEX idx_tc_semester ON teaching_class(semester);UNIQUE KEY uk_enroll 不是锦上添花它是防重复选课的最底层兜底。业务代码里的“先查再插”在并发下可能漏判数据库唯一约束是最后一道闸门重复执行 INSERT 时 MySQL 直接报 Duplicate entry你用程序捕获这个异常转成“你已选过这门课”的提示就行。没有这条约束程序并发再完美也挡不住数据从根上坏掉。索引列的顺序要匹配查询习惯。按“(student_id, tc_id)”建唯一约束查“某学生的课表”时能直接走这个索引但查“某教学班的学生名单”时student_id 在前的索引帮不上忙所以我会再建一个普通索引 idx_enroll_tc(tc_id)。外键列 InnoDB 会自动建索引不需要手动重复添加。class_no 和 semester 是高频过滤条件建单列索引足够不要为了报告好看给每个字段都加索引每一层索引在写入时都是额外开销。4. 从设计到能跑的界面JDBC 连接、连接池与选课事务4.1 技术栈怎么选JDBC/Servlet 还是 Spring BootMyBatis每个做课设的人都会纠结这个问题。我的判断标准不是“哪个框架时髦”而是“老师问数据库问题时你答不答得上”。方案适合的情况注意事项JDBC Servlet/JSP MySQL课时紧、答辩只问设计SQL 写在 DAO 层每个方法对应一条增删改查Spring Boot MyBatis有框架课程要求必须能讲清 Mapper XML 里的 SQL 和事务注解Python Flask SQLite只想快速出界面不推荐SQLite 不方便演示外键、事务和行锁我在带课设时见过不少用 Spring Boot 的同学Controller 写了一堆但被问到“你这个 update 语句有没有 WHERE 条件”时答不上来。教务管理系统的评分核心是数据库设计文档和 SQL 质量框架越重老师越容易把问题引到框架的版本和配置上。如果你的课程没有强制要求框架JDBC Servlet 是最稳的方案如果老师指定 Spring Boot那就把精力重点放在 Mapper 里的 SQL 和事务传播行为上而不是页面特效。4.2 DbUtil 与连接池参数本地小项目别把连接数调成生产值连接数据库的工具类几乎是每份课设代码都会出现的第一段代码。我一般会写成这样public class DbUtil { private static final String URL jdbc:mysql://localhost:3306/edu_admin_db ?useUnicodetruecharacterEncodingUTF-8 useSSLfalseserverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { throw new RuntimeException(MySQL 驱动加载失败, e); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }这里四个参数缺一不可。MySQL 8 的驱动类名是 com.mysql.cj.jdbc.Driver老教程里的 com.mysql.jdbc.Driver 在 8.x 已经过时characterEncodingUTF-8 必须和建库的 utf8mb4 配套少了它中文乱码一定找你serverTimezone 不写MySQL 8 直接报连接时区错误useSSLfalse 是本地开发免去证书警告部署到生产环境才需要改回来。连接池参数课设里很容易抄过头。本地机器一般只有 4G 或 8G 内存我通常给 Druid 设这组值参数值说明initialSize5启动时预建连接数minIdle5最小空闲连接数maxActive20最大活跃连接数maxWait60000获取连接超时毫秒数validationQuerySELECT 1连接有效性检查maxActive 开到 20 已经够三个人同时演示。有人把互联网生产配置抄过来maxActive 设 200一个小型课设项目瞬间把本机 MySQL 的连接数占满半天后报 “too many connections”重启数据库都得排队。连接池不是越大越好它是给高并发准备的不是给课设准备的。4.3 选课事务与行锁把“先查后写”改成“条件更新”选课是教务管理系统里最值得深挖的业务因为它天然涉及事务和并发。下面这段代码是我在课设里最常用的模板public boolean enroll(String studentId, int tcId) { Connection conn null; try { conn DbUtil.getConnection(); conn.setAutoCommit(false); // 开启事务 // 条件更新一次完成“容量判断 占用一个名额” String lockSql UPDATE teaching_class SET selected_count selected_count 1 WHERE tc_id ? AND selected_count capacity; PreparedStatement ps1 conn.prepareStatement(lockSql); ps1.setInt(1, tcId); int occupied ps1.executeUpdate(); if (occupied 0) { // 没更新到行说明已满员 conn.rollback(); return false; } // 插入选课记录成绩先置 NULL等教师录入 String insertSql INSERT INTO enrollment(student_id, tc_id, grade, enroll_time) VALUES(?, ?, NULL, NOW()); PreparedStatement ps2 conn.prepareStatement(insertSql); ps2.setString(1, studentId); ps2.setInt(2, tcId); ps2.executeUpdate(); conn.commit(); // 两件事一起生效 return true; } catch (Exception e) { if (conn ! null) { try { conn.rollback(); } catch (Exception ignore) { } } return false; } finally { if (conn ! null) { try { conn.close(); } catch (Exception ignore) { } } } }这段代码的逻辑关键在第一条 UPDATE。它把“查容量”和“占名额”合成一条语句UPDATE 命中行时会获得行锁两个学生同时选同一个教学班时第二个执行到这里会等第一个提交然后 selected_count 已经加一条件不成立返回 0。如果先 SELECT 容量再 UPDATE两条语句之间存在间隙MySQL 默认隔离级别 REPEATABLE READ 下的普通 SELECT 是快照读两个并发连接都能读到“还剩一个名额”于是多卖出去一席。第二步 INSERT 和第一步 UPDATE 必须在同一个事务里。如果插入失败而 UPDATE 已经执行selected_count 多出来的一必须跟着回滚否则会出现“容量被占但选课记录没有”的半截数据。conn.rollback() 在这里就是后悔药把整个事务恢复到开始之前。另一种等价写法是先执行SELECT * FROM teaching_class WHERE tc_id ? FOR UPDATE拿到行锁后再在代码里判断容量。这种写法也能防超卖但多一次数据库往返而且容易忘记加 FOR UPDATE。直接条件 UPDATE 更短更稳答辩时把这两条路线的差异讲出来本身就是加分项。成绩录入同样要注意事务和 WHERE 条件的完整性。UPDATE enrollment SET grade ? WHERE enroll_id ?不要只用 student_id 和 tc_id 两个条件拼否则一个学生两学期重修同一门课时会把两行成绩一起改掉。5. 课程设计避坑指南5 个我见过最多人翻车的点5.1 中文乱码从建库到 JDBC 连接串字符集必须全链路一致现象插入学生姓名后数据库工具里看到的是???或者前端页面查出来全是乱码。原因字符集不一致。我见过最多的情况是建库用了 utf8mb4、表却继承默认的 latin1或者库和表都正常但 JDBC 连接串里少了 characterEncodingUTF-8。只改一处永远修不好因为乱码是链路问题不是单点问题。解决三处一起改。建库语句写 DEFAULT CHARACTER SET utf8mb4每张表的 DDL 末尾写 CHARSETutf8mb4JDBC URL 加 characterEncodingUTF-8。排查时分别执行 SHOW CREATE TABLE student 和 SELECT character_set_database 看哪一层不对改完重新连接再测试别在页面里反复刷新浪费时间。5.2 外键约束把删除操作拦下来先子后父别依赖级联现象想删掉一个错建的教学班DELETE 直接报 Cannot delete or update a parent row想清理测试学生也被选课表的外键挡住。原因enrollment 引用了 teaching_class 和 student父表还有子行存在时InnoDB 不允许直接删父行。这是外键约束在保护数据完整性不是数据库出 bug。解决先删子表再删父表且把两步放进同一个事务。比如删除教学班DELETE FROM enrollment WHERE tc_id ?; DELETE FROM teaching_class WHERE tc_id ?; 不要为了省事在 DDL 里写 ON DELETE CASCADE一旦误删级联会把整个班所有学生的选课记录一并清掉这种操作没有后悔药。答辩老师问“为什么不用级联”你可以说“级联删除绕过业务审计这里选择在代码里显式控制删除顺序”。5.3 并发选课挤出超员UPDATE 条件判断比先查再写可靠现象容量 50 的教学班名单里出现 51 个人或者验收时开两个页面同时抢最后一席两边都提示选课成功。原因业务代码写的是先 SELECT capacity再比较再 UPDATE。MySQL 默认隔离级别 REPEATABLE READ 下普通 SELECT 是快照读读不到另一个连接尚未提交的新值。两个连接同时读到“还剩 1 个名额”各自执行 UPDATE超员就发生了。解决采用第四章的条件 UPDATE 写法容量判断和名额占用合为一条语句靠数据库行锁保证原子性。演示时开两个 MySQL 命令行窗口手动模拟并发第一个事务更新不提交第二个事务的 UPDATE 会卡住直到第一个提交后才返回 0这就能向老师直观展示行锁是怎么起作用的。只做单用户功能测试永远暴露不了这个问题。5.4 E-R 图与 DDL 对不上答辩现场最尴尬的 30 秒现象报告第 7 页 E-R 图里学生表有“籍贯”字段老师照着图去数据库里执行 SELECT 籍贯直接报 Unknown column。整个教室安静五秒气氛瞬间凝固。原因图是设计初期画的后面改表结构时只改了代码和 SQL没回去改文档图和落库脱节。这是课程设计报告最容易出现的问题因为图的更新没有一股外力逼着你做。解决把“图驱动开发”改成“表驱动文档”。每次结构变更后先 ALTER TABLE再执行 SHOW CREATE TABLE 导出最新 DDL用数据库工具重新生成 E-R 图最后覆盖到报告里。导出 PDF 前按图逐一对一遍字段。我自己的做法是最后把一份带日期的 SQL 脚本和三份 PDF报告、PPT、演示截图放同一个目录命名带日期不叫“最终版”因为最终版永远会是下一个版本。5.5 Word 转 PDF 代码断页乱码报告交付的最后一公里现象从 IDE 复制代码进 Word导出 PDF 后缩进全变成空格中文注释变成方块代码跨页断行断得没法看。原因代码块在 Word 里用了默认正文字体跨页时制表符丢失中文字符没有嵌入字体换机器打开直接缺字。这类问题绝大多数不是转换工具不行而是源文档排版就埋了雷。解决代码粘贴进 Word 前先转纯文本去掉语法高亮统一用 Consolas 或 Courier New 等宽字体段落设置里取消“允许跨页断行”让每段代码保持在一页内。导出 PDF 前在 Word 的“文件-选项-保存”里勾选嵌入字体导出后至少抽查代码页和表格页各三页别等打印出来才发现注释全没了。pdf 转换这件事排版正确比工具选得贵不贵重要得多。6. 把设计讲成故事报告章节、答辩追问与三小时检查清单6.1 课程设计报告的章节骨架一份数据库课程设计报告不用花哨章节顺序本身就是数据库设计流程的复刻。我按下面这个骨架写每一章都有明确产出不写空话章节该放什么建议篇幅封面与任务书题目、成员、指导教师、任务要求1 页需求分析用户角色、业务用例、系统边界2 页概念结构设计E-R 图、实体与属性说明3-4 页逻辑结构设计关系模式清单、范式分析、设计取舍4-5 页物理结构设计存储引擎、字符集、索引、事务方案2-3 页系统实现模块截图、关键代码不整页贴源码4-6 页系统测试测试用例表操作、输入、预期、结果2 页参考文献与附录规范引用、建表脚本1-2 页我最想强调“设计取舍”这一节它是区分“会做课设”和“会做设计”的分水岭。学生表故意保留 major 冗余、不用级联删除、成绩用 DECIMAL 不用 FLOAT这些决策在逻辑设计里写明白老师会觉得你是有意识地做工程权衡而不是只会抄模板。6.2 答辩前检查清单与我自己的一套提问法答辩前三个小时什么都别改按清单过一遍环境检查项通过标准数据库服务已启动连接名和报告里写的一致别出现报告写 MySQL、本机是 MariaDB五条常用查询能跑通按学号查课表、按开课班查名单、统计平均分、查未录入成绩学生、删除一条选课并发选课演示脚本已备好两个命令行窗口能现场展示行锁效果报告图与数据库一致每张 E-R 图和关系模式表都能和实际表字段对上PDF 已抽查代码页中文字符正常、缩进完整我自己的习惯是答辩前一天晚上把报告当成一个什么都不知道的老师从头读一遍每看到一个实体就问自己三个问题为什么主键选它、它有哪些外键、删掉它会发生什么。想不出来的地方当场去数据库里敲一遍 SQL 验证。这一遍下来比多写十页需求分析都管用。希望帮到你。本文还有配套的精品资源点击获取
返回列表