📐 先想象一个真实场景:
老板说:"我们要做一个学生选课系统,学生能选课、老师能给成绩。"
你作为开发者,第一步该干什么?直接打开 MySQL 写 CREATE TABLE 吗?
👉 千万别!那样一定会做出第 12 章里那种"包罗万象的烂表"。
正确的做法是:先在纸上画图 —— 把"学生、课程、选课"这些概念画清楚,明确它们之间的关系,再动手建表。这就是本章要学的。
一、数据库设计的整体流程了解
1.1 数据库设计的 6 个阶段
设计一个数据库 不是直接建表,而是要按步骤来。一共 6 个阶段:
数据库设计的 6 个阶段,本章讲红色框的两个
本章解决 "从需求 → 数据库表" 这一步:
① 13.1 概念结构设计:把需求画成 E-R 图(不涉及具体数据库)
② 13.2 逻辑结构设计:把 E-R 图转成 关系模式(即将变成 MySQL 表)
二、E-R 图:把现实画成图核心重点
2.1 什么是 E-R 图?
E-R 图(Entity-Relationship Diagram,实体-联系图)是一种用图形描述现实世界的工具,是数据库设计中 最重要的图。
E-R 图就像 装修前的"户型图":
装修前先画图 → 客厅在哪、卧室多大、电线怎么走 → 一切都规划好了再动工。
建数据库前先画 E-R 图 → 有哪些实体、它们之间是什么关系 → 都想清楚再建表。
2.2 E-R 图的三大元素必考
整个 E-R 图就由三种符号构成。一定要记住每种代表什么、长什么样:
实体(矩形)
现实中能区分的"事物"
如:学生、课程、老师
属性(椭圆)
实体的"性质/特征"
如:学号、姓名、年龄
联系(菱形)
实体之间的"关系/动作"
如:选修、属于、领导
"矩形装实体,椭圆装属性,菱形装联系"
三个图形对应三个元素,千万别画错。考试要画图时这是基本功。
三个元素之间的连接规则
① 实体(矩形) 和它的 属性(椭圆) 用 无向直线 连接(没有箭头)。
② 实体(矩形) 通过 联系(菱形) 连接到另一个实体。
③ 联系(菱形) 也可以有自己的 属性(椭圆)。
2.3 怎么区分"实体"和"属性"?必考
这是个 难点:什么时候把"系别"当属性?什么时候当实体?
① 属性没有更细的描述,实体有更细的描述。
如果"系别"还要描述系主任、办公室、学生人数 → 应该是 实体;
如果"系别"只是个名字,不需要其他信息 → 可以是 属性。
② 属性不能与其他实体有联系,联系只能发生在实体之间。
如果某个东西要和其他实体建立联系 → 必须是实体。
① 简单情况:学生表里只需要"系别名称"这一个字段 → 系别是 属性。
② 复杂情况:还要存"系主任、办公地点、学生人数" → 系别要 独立成实体,因为它有自己的描述。
三、三种联系类型核心重点
3.1 实体之间的三种联系必考
两个实体之间的关系,有三种类型:
1 : 1 一对一
A 中的 1 个对应 B 中的 1 个,反过来也一样。
例:学校 ↔ 校长
1 : n 一对多
A 中的 1 个对应 B 中的多个,但 B 中的 1 个只对应 A 中的 1 个。
例:班级 → 学生(一个班多个学生)
m : n 多对多
A 中的 1 个对应 B 中的多个,B 中的 1 个也对应 A 中的多个。
例:学生 ↔ 课程(一个学生选多门课,一门课多个学生选)
三种联系的图形表示
问自己两个问题:
① "A 中的 1 个,对应 B 中几个?" 1 个 → 写 1,多个 → 写 m 或 n
② "B 中的 1 个,对应 A 中几个?" 1 个 → 写 1,多个 → 写 n 或 m
两个答案组合就是答案。比如:1 对应 多 → 1:n;多 对应 多 → m:n。
四、画一个完整的 E-R 图:学生选课必考实操
4.1 经典案例:学生选课系统
设计一个学生选课系统,包含以下需求:
① 一个 学生 有学号、姓名、年龄、所在系;
② 一个 课程 有课程号、课程名、学分;
③ 一个学生可以选多门课,一门课可以被多个学生选;
④ 学生选了某门课会有一个 成绩。
分析步骤
第一步:找实体 —— 描述里提到的"事物"就是实体。
本例中:学生、课程(两个实体)
第二步:找属性 —— 每个实体的"特征"。
学生的属性:学号、姓名、年龄、所在系
课程的属性:课程号、课程名、学分
第三步:找联系 —— 实体之间的"动作"。
学生 选修 课程,是 m:n 关系(多个学生选多门课);
"选修"这个联系本身有属性 成绩(每次选修产生一个成绩)。
完整的学生选课 E-R 图
① 主码(主键)属性要加下划线,比如学号、课程号下面要画一条线。
② m:n 联系常常自己有属性(比如选修产生成绩)。
③ 1:n 联系一般没有自己的属性(特殊情况例外)。
④ 属性多的时候:椭圆可以散开摆放,连线清晰即可,不要挤在一起。
五、逻辑结构设计:把图变成表核心重点
5.1 什么是逻辑结构设计?
逻辑结构设计就是 把 E-R 图(概念模型)转换成关系模式(即将变成 MySQL 里的表)。
概念结构设计 = 装修公司的 "户型图"(不涉及具体材料)
逻辑结构设计 = "施工图"(明确每堵墙用什么砖、每根线用什么型号)
从前者到后者,要按照"转换规则"一步步翻译。
六、E-R 图 → 关系模式:转换规则必考核心
6.1 总体原则必考
① 实体 → 关系模式(每个实体变成一张表)
② 属性 → 关系的属性(实体的字段就是表的字段)
③ 主码(实体的键)→ 关系的主键
简单实体的转换示例
把"学生"实体转换成关系模式:
学生
属性:学号、姓名、年龄、所在系
主码:学号
下划线表示主键。这部分简单,问题在 "联系"怎么转。
6.2 联系的转换:三种情况必考
这里是必考点。三种联系(1:1、1:n、m:n)的转换规则不一样。
| 联系类型 | 转换规则 | 结果(生成几张表) |
|---|---|---|
| 1 : 1 一对一 |
把一方实体的主键放到另一方实体的关系模式中(作为外键); 或者两个实体的主键都可以是新表的候选键。 |
不需要新增表(合并到一方) |
| 1 : n 一对多 |
把"1"端的主键放到"n"端的关系模式中(作为外键)。 不用单独建表。 |
不需要新增表 |
| m : n 多对多 ⭐ |
必须 单独建一张新表! 新表 = 两个实体的主键 + 联系自己的属性。 主键 = 两个实体的主键组合。 |
需要新增表 |
"1:1 合并、1:n 加外键、m:n 必须建新表"
这一句话能解决考试中 95% 的转换题。
6.3 三种转换的具体例子必考
① 1:1 联系的转换
"系" 与 "系主任" 是 1:1 联系。
系(系编号, 系名)
系主任(工号, 姓名)
1:1 联系:领导
系主任(工号, 姓名)
把"系主任工号"作为外键放到"系"表里。
② 1:n 联系的转换
"系" 与 "学生" 是 1:n 联系(一个系有多个学生)。
系(系编号, 系名)
学生(学号, 姓名)
1:n 联系:属于
学生(学号, 姓名, 系编号)
关键:把"1"端的主键(系编号)放到"n"端(学生)作为外键。
③ m:n 联系的转换 ⭐
"学生" 与 "课程" 是 m:n 联系(学生选修课程)。这是最容易考的!
学生(学号, 姓名)
课程(课程号, 课程名)
m:n 联系:选修(属性:成绩)
课程(课程号, 课程名)
选修(学号, 课程号, 成绩)
① 必须新建一张"选修"表,不能省!
② 新表的属性 = 两个实体的主键 + 联系自己的属性(这里是成绩)
③ 新表的主键 = 两个实体主键的组合(学号 + 课程号)
七、完整案例:把学生选课 E-R 图转换成关系模式必考
7.1 完整转换演示
回到第四节画的"学生选课" E-R 图。它包含:
- 2 个实体:学生、课程
- 1 个 m:n 联系:选修(带属性"成绩")
转换步骤
主键是 (学号, 课程号) 组合,"成绩"是联系自带的属性。
这 3 张表对应 MySQL 里就是 3 个 CREATE TABLE。
① 学生表:主键学号是单属性,自动满足 2NF;没有传递依赖,满足 3NF ✓
② 课程表:同理,满足 3NF ✓
③ 选修表:主键 (学号, 课程号),唯一非主属性"成绩"必须两个键都给才能确定,是完全依赖,满足 2NF;没有传递依赖,满足 3NF ✓
所以 E-R 图正确转换的关系模式,天然就满足 3NF!
7.2 注意事项必考易错点
① 不要漏掉实体。把所有实体都转换成关系模式。
② 不要漏掉联系。特别是 m:n 联系必须单独成表。
③ 转换后要标出主码(写答案时要加下划线)。
④ 1:n 联系不用新增表,只把 1 端主键加到 n 端做外键。
⑤ 联系的属性要加到哪里?
- m:n 联系 → 加到新建的表里
- 1:n 联系 → 加到 n 端的关系模式里
这一步转换出来的关系模式,可以再用第 12 章的 规范化理论 做检查和分解,确保都是 3NF。
如果 E-R 图画得好,转换出来的关系模式一般直接就是 3NF,不需要再分解。
八、本章小结
📋 三句话总结整章
- 概念结构设计 = 画 E-R 图(实体矩形、属性椭圆、联系菱形)
- 逻辑结构设计 = 把 E-R 图按规则转换成 关系模式。
- 转换规则核心:1:1 合并 / 1:n 加外键 / m:n 单独建表。
本章必考点回顾
⭐ 期末考点(按出现频率排)
- 给一个需求描述,画 E-R 图(必考大题!)
- 把 E-R 图转换成关系模式(必考大题!)
- 三种联系类型的辨析(1:1、1:n、m:n 的判断)
- 转换规则的应用(特别是 m:n 必须新建表)
- E-R 图三大元素的图形(哪个是矩形、椭圆、菱形)
课堂综合测验
在 E-R 图中,以下哪种图形表示联系?
✅ 正确:C · 菱形
记忆:"矩形装实体,椭圆装属性,菱形装联系"。
某公司有"员工"和"部门"两个实体。一个员工只能在一个部门工作,一个部门有多个员工。这两个实体之间是什么联系?
✅ 正确:B · 1:n
判断方法:
① 一个部门 → 多个员工 → 写 n
② 一个员工 → 一个部门 → 写 1
所以是 1:n(部门是 1 端,员工是 n 端)
把 m:n 联系转换为关系模式时,应该如何处理?
✅ 正确:C
口诀:"1:1 合并、1:n 加外键、m:n 必须建新表"
m:n 联系如果不新建表,无法正确表达"多对多"关系。新表的主键是两端主键的组合,外加联系自身的属性(如选修中的成绩)。
某 E-R 图:学生(学号, 姓名)↔ 课程(课程号, 课程名)通过"选修"(成绩)联系,是 m:n 关系。下面哪组关系模式 转换正确?
✅ 正确:B
分析:
A 错:把课程号塞到学生表里,违反 m:n 转换规则。
C 错:合并成一张表会有大量冗余(就是第 12 章的"烂表")。
D 错:把学号塞到课程表里,无法表达多对多。
B 对:m:n 必须单独建"选修"表,主键 (学号, 课程号),加上联系属性"成绩"。
🚀 下节课:习题课
下节课通过 大量练习 巩固今天的知识:
- 🎨 画 E-R 图(给一个需求描述,画出完整的 E-R 图)
- 📋 转换关系模式(把 E-R 图变成一组关系模式)
- 🔍 判断联系类型(识别 1:1、1:n、m:n)
- 📝 综合大题:从需求 → E-R 图 → 关系模式(必考综合题)
本章是 纯设计 + 推导,没有上机部分。下节课请带上 纸笔和橡皮。