简介:本资源是一份面向数据库初学者与高校计算机专业学生的教学型PPT课件,聚焦实体-联系(ER)模型核心概念与ER图绘制方法,解决数据库概念设计阶段的理解与建模难点。课件系统讲解实体、属性、码、域、实体型、实体集、联系(含1:1、1:n、m:n三类映射基数)及单个/多个实体型间联系等关键知识点,并结合班级-学生、课程-教师、供应商-项目-零件等典型实例展开分析;配套E-R图符号规范(矩形表实体、椭圆表属性、菱形表联系)与图形化表达逻辑,强化从现实世界到信息模型的抽象能力。资源为单文件PPT格式,共1个622KB演示文稿,内容结构清晰、图文并茂,适合作为课堂讲授、自学复习或课程设计前置学习材料。目前已有412人下载学习,可直接用于教学参考或数据库设计入门实践。
1. 这份 ER 图 PPT 不是“看完了就扔”的课件:它是你画出第一个能落地的数据库概念模型的脚手架
刚带新人做教务系统需求分析时,我让一个有两年开发经验的同事用 ER 图描述“学生选课+教师授课+课程安排”三者关系。他翻了三遍教材、查了五次百度,最后交上来一张图:所有实体挤在中间,联系线像毛线团,1:n 和 m:n 标得模棱两可,连“课程-教师”该是一对多还是多对多都反复改了四次。问题不在他不会画——而是缺一份能直接照着拆解、填空、验证的实体-联系模型实操模板。这份《数据库系统概论——实体-联系模型、ER图.ppt》就是那个模板。它不是泛泛讲“什么是实体”,而是把“班级-班长1:1”“课程-学生m:n”“职工-领导1:n”这些经典场景,用矩形(实体)、椭圆(属性)、菱形(联系)+ 明确基数标注(1, n, m)全部固化成可复用的图形范式。它解决的是真实设计现场中最卡脖子的问题:当用户说“一个老师能教多门课,一门课也能被多个老师教”,你怎么一秒判断这是 m:n 联系?怎么把它准确落到 ER 图上?又怎么预判后续转关系模式时必须拆出“授课”关联表?适合正在啃《数据库系统概论》教材的学生、需要快速产出设计文档的初级DBA、以及被业务方反复追问“数据之间到底怎么连的”的后端工程师——它不教你高深理论,只给你一套能立刻动手、画完就能被开发和测试认可的 ER 图交付物。
2. 从现实世界到 E-R 图:三步拆解法与四个核心符号的硬编码规则
2.1 实体识别:不是找“名词”,而是抓“可独立存在且需唯一标识的事物”
很多初学者一上来就列“学生、课程、成绩、学期、学院”,结果画图时发现“成绩”无法独立存在——它必须依附于“学生”和“课程”。这就是没吃透实体定义中“客观存在并可相互区别”的关键约束。正确做法是问三个问题:
- 能否脱离其他事物单独存在?“成绩”不能,它必须绑定具体学生和具体课程;“学生”可以,即使没选课,学籍信息依然有效。
- 是否需要唯一标识?“学生”必须有学号,“课程”必须有课号,“班级”必须有班级号——这些就是码(Key)。而“成绩”本身没有独立码,它的主键必然是(学号, 课号)组合。
- 同类事物是否构成集合?所有学生组成“学生实体集”,所有课程组成“课程实体集”。如果某个“事物”在整个业务中只出现一次(如“本校建校年份”),它更可能是属性而非实体。
提示:PPT 第 7 页明确给出实体定义:“客观存在并可相互区别的事物”。注意“可相互区别”意味着必须有区分依据——这个依据就是码。没有码的“事物”,大概率是属性或联系。
2.2 属性刻画:为什么“班主任”是班级的属性,而“任课教师”必须是联系?
属性是实体的特征,但并非所有描述性字段都该塞进实体框里。PPT 第 8 页强调:“一个实体可以由若干个属性来刻画”,但没说哪些该放、哪些不该放。实战中,我用一条铁律过滤:如果该字段的值,会因实体与其他实体的关联关系而动态变化,它就必须剥离为联系,而非属性。
以“班级”为例:
- “班级号”“班主任”“年级”是稳定属性——班主任通常固定一届,不随课程变动;
- 但“任课教师”不是——同一班级,语文课教师、数学课教师、英语课教师各不相同,且同一教师可能教多个班级。若强行把“任课教师”设为班级属性,会导致一个班级实体对应多个教师值,违反关系模型第一范式(1NF)。
正确解法是引入“授课”联系(菱形),连接“班级”和“教师”两个实体,并标注基数(如 1:n:一个班级有多名任课教师,一名教师可教多个班级)。PPT 第 25 页的“课程-教师-参考书”三元联系图,正是这一原则的延伸——当涉及三个及以上实体的动态关联时,属性已完全失效,必须升格为联系。
2.3 联系建模:从“一对多”到“多对多”,基数标注不是选择题而是推导题
PPT 第 14–19 页用“班级-学生”“课程-学生”等实例演示了 1:1、1:n、m:n 三类联系,但新手常犯的错误是死记硬背“学生和课程是 m:n”,却不知如何推导。真实场景中,基数必须通过业务规则反向计算。以“供应商-项目-零件”为例(PPT 第 28 页):
- 规则1:“一个供应商可以供给多个项目多种零件” → 对“供应商”实体,其关联的(项目, 零件)组合数量无上限;
- 规则2:“每个项目可以使用多个供应商供应的零件” → 对“项目”实体,其关联的(供应商, 零件)组合数量无上限;
- 规则3:“每种零件可由不同供应商供给” → 对“零件”实体,其关联的(供应商, 项目)组合数量无上限。
三者叠加,必然推出“供应商-项目-零件”是 m:n:p 的多元联系(PPT 中简化为两两 m:n,但实际需三元菱形)。此时,若强行拆成三个二元联系(供应商-项目、项目-零件、供应商-零件),会丢失“某供应商向某项目供应某零件”这一完整语义,导致数据冗余或查询歧义。PPT 第 28 页的三元联系图,本质是防止这种语义坍塌的强制约束。
2.4 E-R 图符号规范:矩形/椭圆/菱形不是美术作业,是数据库设计的语法
PPT 第 30–31 页给出了标准符号,但未强调其不可妥协的工程意义。这三类图形是 ER 模型的“语法”,违反即导致后续转换失败:
- 矩形(实体):必须标注实体名(如“学生”),且隐含“该实体将映射为一张物理表”。若漏标,开发人员无法知道要建哪张表;
- 椭圆(属性):必须用无向边直连对应实体,且主码属性需加下划线(PPT 未显式标注,但行业惯例如此)。例如“学生”实体下的“学号”椭圆必须加下划线,否则无法识别主键,导致外键引用失效;
- 菱形(联系):必须标注联系名(如“选修”),且每条连接线旁必须标注基数(1, n, m)。PPT 第 22 页“班级-学生1:n”图中,线旁的“1”和“n”不是装饰,而是告诉开发者:“学生”表必须包含“班级号”外键,且该字段允许重复(n 端),而“班级”表的“班级号”必须唯一(1 端)。
注意:PPT 中所有联系线旁的基数标注(如“1:n”)均采用“近实体端:远实体端”格式。例如“班级”矩形连向“学生”矩形的线上标“1”,“学生”端标“n”,意为“一个班级对应多个学生”。此约定必须严格遵守,否则团队协作时会产生根本性误解。
3. 把 ER 图变成可执行的数据库设计:从图形到 SQL 的四步转换陷阱
3.1 实体→表:为什么“职工领导”这种自关联实体必须拆成两张表?
PPT 第 24 页展示了“职工”实体内部的 1:n 领导联系,用一条线从“职工”矩形连回自身,线上标“1”和“n”。新手常误以为这只需在“职工”表中加一个“上级工号”字段。但这是典型陷阱:若“上级工号”允许为空(新员工无领导),则“职工”表中会出现大量 NULL;若强制非空,则无法录入最高层领导(如校长)。
正确转换是将自关联联系升格为独立关联表:
-- 步骤1:创建职工主表(不含领导信息) CREATE TABLE employee ( emp_id CHAR(10) PRIMARY KEY, name VARCHAR(50) NOT NULL, position VARCHAR(30) ); -- 步骤2:创建领导关系表(显式表达1:n) CREATE TABLE leadership ( leader_id CHAR(10) NOT NULL, -- 领导的工号(1端) staff_id CHAR(10) NOT NULL, -- 下属的工号(n端) PRIMARY KEY (leader_id, staff_id), FOREIGN KEY (leader_id) REFERENCES employee(emp_id), FOREIGN KEY (staff_id) REFERENCES employee(emp_id) );逻辑说明:leadership表的主键是(leader_id, staff_id)组合,确保一个下属只能有一个直接领导(满足 1:n 的“1”端约束),而一个领导可有多个下属(满足“n”端约束)。FOREIGN KEY双向引用employee表,保证所有领导和下属都真实存在。
参数说明:leader_id和staff_id字段类型必须与employee.emp_id完全一致(此处为CHAR(10)),否则外键约束失效;PRIMARY KEY必须包含两者,避免同一领导重复添加同一下属。
3.2 二元联系→表:m:n 联系为何必须生成第三张表,且主键必为双外键?
PPT 第 20 页“课程-学生m:n”是经典案例,但很多人只知结论,不知推导。假设不建“选修”表,而将“学生ID”塞进“课程”表(作为逗号分隔字符串),或反之,会立即触发三大灾难:
- 违反1NF:字段存储多值,无法用标准SQL精准查询(如“查选修了C001课程的所有学生”需LIKE模糊匹配,性能归零);
- 更新异常:删除某学生时,需遍历所有课程记录,找到并剔除其ID,极易遗漏;
- 插入异常:新开一门课,但尚无学生选修,该课程记录无法插入(因学生ID不能为空)。
因此,m:n 联系必须生成关联表,且其主键设计有严格规则:
-- 正确:关联表主键 = 两端实体主键的组合 CREATE TABLE enrollment ( student_id CHAR(10) NOT NULL, course_id CHAR(8) NOT NULL, grade DECIMAL(3,1), -- 附加属性(如成绩) PRIMARY KEY (student_id, course_id), -- 强制 (学生,课程) 唯一 FOREIGN KEY (student_id) REFERENCES student(stu_id), FOREIGN KEY (course_id) REFERENCES course(cou_id) );逻辑说明:PRIMARY KEY (student_id, course_id)确保同一学生不能重复选同一门课(业务合理性);双外键保证所有选课记录都指向真实存在的学生和课程。若业务要求“学生可重修同一门课”,则需增加时间戳字段(如enroll_time DATETIME),并将主键扩展为(student_id, course_id, enroll_time)。
3.3 多元联系→表:为什么“供应商-项目-零件”不能拆成三个二元表?
PPT 第 28 页的三元联系常被简化处理,但这是重大隐患。假设将“供应商-项目-零件”拆为:
supplier_project (sup_id, pro_id)project_part (pro_id, par_id)supplier_part (sup_id, par_id)
那么,数据库中可能出现:
supplier_project记录:(S001, P001)project_part记录:(P001, R001)supplier_part记录:(S001, R001)
表面看三者关联,但无法证明 S001 确实向 P001 供应了 R001!因为这三个记录可能源于不同业务事件(如S001曾向P002供R001,P001曾用R002,S001曾向P001供R003)。缺失的语义是“本次供应行为”。
正确解法是创建三元关联表:
CREATE TABLE supply ( sup_id CHAR(10) NOT NULL, pro_id CHAR(10) NOT NULL, par_id CHAR(10) NOT NULL, quantity INT NOT NULL DEFAULT 0, PRIMARY KEY (sup_id, pro_id, par_id), -- 三者共同唯一 FOREIGN KEY (sup_id) REFERENCES supplier(sup_id), FOREIGN KEY (pro_id) REFERENCES project(pro_id), FOREIGN KEY (par_id) REFERENCES part(par_id) );逻辑说明:PRIMARY KEY (sup_id, pro_id, par_id)强制“供应商-项目-零件”三元组全局唯一,彻底锁定供应行为;quantity是该联系的附加属性(PPT 中未体现,但实际业务必有),只能挂在此表下。
3.4 属性归属判定:如何一眼识别“地址”该属于“学生”还是“家庭”实体?
PPT 未讨论复杂属性归属,但这是设计高频雷区。例如“学生地址”,看似是学生属性,但若业务要求“统计某小区所有学生”“追踪学生家庭迁移历史”,则“地址”必然关联到“家庭”实体(新实体),而“学生”仅通过“家庭ID”关联。判断依据是:该属性是否具有独立生命周期和业务操作?
- 若“地址”仅用于显示,且永不变更、不参与统计,则可作为学生属性;
- 若“地址”会随家庭搬迁而更新,且需记录历史版本(如“2023年住址”“2024年住址”),则必须升格为“家庭”实体,学生与家庭建立 1:1 或 1:n 联系(一个学生属于一个家庭,一个家庭可有多个学生)。
PPT 第 8 页“属性是实体所具有的某一特性”是静态描述,而工程中需动态评估其业务权重。我的血泪经验是:只要该字段出现在任何一张报表的筛选条件或分组维度中,它就必须拥有独立实体身份。例如“学生来源地”若用于招生分析报表,则“来源地”应拆为“地区”实体,学生表仅存region_id外键。
4. 避坑:ER 图设计中五个让你加班到凌晨的典型翻车现场
4.1 现象:ER 图中“学生”和“学籍”两个矩形并存,连线混乱
原因:混淆实体与状态。学籍不是独立实体,而是“学生”实体在特定时间段的状态(如“在读”“休学”“毕业”)。将其设为实体,会导致后续转换时生成冗余表,且状态变更需跨表更新,违背单一职责。
解决:将“学籍状态”设为“学生”实体的属性(如status ENUM('enrolled','suspended','graduated')),或若需记录状态变迁历史,则建“学籍状态日志”关联表,而非平行实体。
4.2 现象:联系线上只写“1:n”,未标注“1”端和“n”端具体位置
原因:PPT 第 22 页虽示例了“班级-学生1:n”,但未强调基数必须标注在线段靠近实体的一侧。若仅在线中间写“1:n”,开发人员无法判断是“一个班级对应多个学生”还是“一个学生对应多个班级”。
解决:严格遵循“基数紧贴实体”原则。画图时,在班级矩形连接线旁标“1”,在学生矩形连接线旁标“n”。工具如 draw.io 或 Lucidchart 均支持在线段两端添加文本标签。
4.3 现象:将“订单金额”设为“订单”实体的属性,但业务要求按“商品单价×数量”实时计算
原因:把派生属性(Derived Attribute)当基本属性。PPT 第 8 页定义属性为“实体所具有的某一特性”,但未区分基本属性(直接采集)与派生属性(计算得出)。存储派生属性会导致数据不一致(如修改单价后,历史订单金额未同步更新)。
解决:删除“订单金额”属性,在数据库中通过视图或应用层计算。若需优化查询,可建物化视图或在订单表中增加amount_calculated字段,但必须由触发器或应用逻辑保证其与unit_price * quantity同步。
4.4 现象:用“学生-课程-成绩”三元联系,但成绩有“平时分”“期末分”“总评”多个子项
原因:未将复合属性(Composite Attribute)展开。PPT 第 8 页提到属性可有多个,但未说明若属性本身结构复杂(如成绩含多个分数),需拆解为子属性或独立实体。
解决:将“成绩”升格为实体,包含score_id,student_id,course_id,type ENUM('regular','final','total'),value DECIMAL等字段。原三元联系降级为“学生-课程”二元联系,成绩实体通过外键关联二者。
4.5 现象:ER 图中“用户”实体同时连接“登录日志”和“操作日志”两个菱形,但二者业务含义重叠
原因:未抽象共性。登录和操作都是“用户行为”,本质是同一类联系的不同实例。PPT 第 26 页强调“联系反映事物之间的联系”,但未指出相似联系应合并抽象。
解决:创建统一“用户行为”联系,附加behavior_type ENUM('login','logout','create','update','delete')属性。既减少图形复杂度,又便于后续按行为类型统计分析,避免日志表结构分裂。
5. 从 ER 图到可验证的设计文档:用三张表完成一次闭环验证
5.1 验证清单表:把 PPT 中的每一处图形元素转化为可检查的条目
ER 图的价值不在美观,而在可验证。我坚持用下表驱动设计评审,确保 PPT 中的每个符号都落地为数据库中的具体对象。此表直接源自 PPT 第 30–31 页的符号规范,但增加了工程化检查项:
| PPT 中的图形元素 | 数据库中对应对象 | 必检项(检查什么) | 检查方法 |
|---|---|---|---|
| 矩形“学生” | 表student | ① 表名与实体名一致;② 主键字段(如stu_id)存在且类型匹配;③ 所有属性(姓名、年龄等)均为表中非空字段 | DESCRIBE student;查字段名、类型、NULL约束 |
| 椭圆“学号” | student.stu_id字段 | ① 字段名与属性名一致;② 加下划线(即设为PRIMARY KEY);③ 类型长度足够(如CHAR(10)支持所有学号) | SHOW CREATE TABLE student;查主键定义 |
| 菱形“选修” | 表enrollment | ① 表名与联系名一致;② 主键为(stu_id, cou_id)组合;③ 双外键分别引用student和course表 | SELECT CONSTRAINT_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='enrollment'; |
| 线上“1”端标注 | enrollment.cou_id字段 | ① 该字段在enrollment表中为NOT NULL;② 其值在course表中必须存在(外键约束) | SELECT COUNT(*) FROM enrollment e LEFT JOIN course c ON e.cou_id=c.cou_id WHERE c.cou_id IS NULL;应返回0 |
| 线上“n”端标注 | enrollment.stu_id字段 | ① 该字段在enrollment表中允许重复(无唯一约束);② 其值在student表中必须存在 | SELECT stu_id, COUNT(*) FROM enrollment GROUP BY stu_id HAVING COUNT(*) > 1;检查是否允许多选 |
这张表不是摆设。每次设计评审,我逐行对照 PPT 图形和数据库 DDL,用 SQL 语句当场验证。曾发现某同事将“课程-教师”1:n 联系的“n”端(教师ID)设为UNIQUE,导致一名教师只能教一门课——这直接违背业务规则,而 PPT 第 26 页的“课程-教师1:m”图清晰标明了“m”端。
5.2 边界测试用例:用三条 SQL 覆盖 ER 图的核心约束
图形是静态的,而数据库是动态运行的。必须用真实 SQL 测试边界场景,验证 ER 图的约束是否被严格执行。以下是我从 PPT 经典案例提炼的三个必测用例,覆盖 1:1、1:n、m:n 全部联系类型:
用例1:验证班级-班长1:1联系(PPT 第 16 页)
-- 尝试插入第二个班长到同一班级(应失败) INSERT INTO class_monitor (class_id, monitor_id) VALUES ('C001', 'T002'); -- 预期:因 class_id 有 UNIQUE 约束,报错 "Duplicate entry 'C001' for key 'class_id'"逻辑说明:class_monitor表主键应为class_id(1端),确保一个班级只能有一个班长;monitor_id为外键,确保班长存在。此测试验证“1:1”的“1”端约束。
用例2:验证班级-学生1:n联系(PPT 第 18 页)
-- 插入同一班级的第101名学生(应成功) INSERT INTO student (stu_id, name, class_id) VALUES ('S101', '张三', 'C001'); -- 预期:成功,因 class_id 字段无唯一约束,允许多个学生共享同一班级号逻辑说明:student.class_id是普通外键字段,无UNIQUE约束,故可重复。此测试验证“1:n”的“n”端允许多值。
用例3:验证课程-学生m:n联系(PPT 第 20 页)
-- 尝试插入同一学生重复选同一门课(应失败) INSERT INTO enrollment (student_id, course_id) VALUES ('S001', 'C001'); INSERT INTO enrollment (student_id, course_id) VALUES ('S001', 'C001'); -- 第二次插入 -- 预期:因主键 (student_id, course_id) 冲突,报错 "Duplicate entry 'S001-C001' for key 'PRIMARY'"逻辑说明:enrollment表主键强制 (学生,课程) 唯一,防止重复选课。此测试验证 m:n 关联表的核心约束。
提示:这三个用例必须在数据库初始化后立即执行,且结果必须与 PPT 中的基数标注完全一致。任何偏差都意味着 ER 图理解错误或 DDL 实现有误。
5.3 从 ER 图到需求确认:用一张 A4 纸搞定用户签字的终极技巧
技术人最怕的不是写错 SQL,而是用户签完字后说“我们其实想要的是……”。PPT 第 4 页强调“概念模型是数据库设计人员和用户之间进行交流的语言”,但没说怎么让语言真正被听懂。我的办法是:把 ER 图的核心部分(实体、关键属性、主要联系)手绘在一张 A4 纸上,用最简短的中文标注,不写任何技术术语,只写用户能脱口而出的词。
例如,针对教务系统,我画:
- 左边矩形写“学生”,里面列“学号、姓名、年龄”;
- 右边矩形写“课程”,里面列“课号、课名、学分”;
- 中间菱形写“选课”,线上标“一个学生可以选多门课”“一门课可以被多个学生选”;
- 底部加一句:“您确认以上三点就是咱们要管的数据吗?请签字。”
用户签字那一刻,不是签技术方案,而是签业务共识。这张纸比 PPT 里的 31 页更有力,因为它把“实体-联系模型”翻译成了用户的母语。从那以后我每次做需求确认,都强制走一遍这个手绘签字流程——它成本几乎为零,却能避免后期 80% 的返工。希望帮到你。
本文还有配套的精品资源,点击获取