数据库设计专题 · 下午试题二
软件设计师 · 案例分析 必答第 2 题(15 分) | 从 0 基础讲起:知识点 → 考点 → 真题 → 套路 | 覆盖 2020下 / 2021上 / 2021下 / 2022上 / 2023上
🎯 这题到底考什么(先建立大局观)
给你一段需求说明 (谁和谁有关系、要存哪些信息),要你完成数据库设计的四个标准动作:
设问 分值 你要做的事 本质
问题1 补 E-R 图 5~7 分 在图上补出实体之间缺的联系(菱形) ,标 1:1 / 1:n / m:n 读懂关系
问题2 补关系模式 3~4 分 填出关系模式里空着的属性 ,标主键、外键 转换+约束
问题3 键的分析 2~4 分 指出某关系的主键、外键 键的知识
问题4 简答/改造 3~7 分 加新实体新联系、或问"存在什么问题怎么解决" 规范化/变通
一句话:这题 = 阅读理解 + 画几个菱形 + 写几个属性名。套路极强,是下午最稳的送分题。
① 30 秒科普:数据库到底在干嘛
没有数据库时 ,你把客户、订单、商品全塞进一张大 Excel:一行里既有客户信息又有商品信息。结果同一个客户买 100 次东西,他的电话就要重复存 100 遍——改一次电话得改 100 行,还容易漏改(这就是数据冗余 → 更新异常 )。
有了数据库 ,把信息拆成若干张"关系表" :客户一张表、商品一张表、订单一张表,表之间用编号(键)互相引用 。改电话只改客户表那一行,其它表靠编号自动"关联"过去。
所以数据库设计的核心就两件事:(1) 把信息分到正确的表里;(2) 让表之间能靠键关联。 下面所有名词都是为这两件事服务的。
② 知识点全景(小白先看这个)
2.1 三级模式:数据库的"三张皮"
模式 是什么 类比
外模式 (用户模式/子模式)某个用户/应用能看到的那部分数据 你手机银行 App 看到的界面
模式 (概念模式)全体数据的逻辑结构 (有哪几张表、每张表有啥列)——通常说的"数据库设计"就指它银行数据库整体设计蓝图
内模式 (存储模式)数据在磁盘上怎么存(文件、索引、压缩) 机房硬盘怎么摆
两级映射:外模式/模式映射(保证逻辑独立性)、模式/内模式映射(保证物理独立性)。
🎯 真题 2021下 · 上午 51
采用三级模式结构的数据库系统中,如果对一个表创建聚簇索引 ,那么改变的是数据库的( )。
A. 外模式 B. 模式 C. 内模式 D. 用户模式
✅ 答案:C(内模式)
索引描述的是数据在磁盘上怎么存 ,属于内模式(存储模式)。外模式是"用户视图"、模式是"全体逻辑结构/基本表"。
牢记: 基本表/视图关系 → 模式 ;索引、存储文件、簇集 → 内模式 ;用户看到的 → 外模式 。
2.2 数据模型三要素(背)
数据结构 (有哪些对象,是基础)+数据操作 (增删改查,是核心)+完整性约束 (数据要满足的规则)。
2.3 三种数据模型(发展顺序)
模型 特点 地位
概念模型 面向用户、不依赖机器,用 E-R 图 表达 设计的第一步(概念设计)
逻辑模型 关系模型(表)、层次模型(树)、网状模型(图) 关系模型是当今主流(逻辑设计)
物理模型 具体存储实现 物理设计
🧭 设计的四个阶段(口诀:需求→概念→逻辑→物理):
需求分析 (搞清要存啥)→ 概念结构设计 (画 E-R 图,不管用什么数据库)→ 逻辑结构设计 (转成关系模式 + 规范化)→ 物理结构设计 (索引、存储)。
真题题干里的"概念模型设计→图2-1"就是概念设计,"逻辑结构设计→关系模式"就是逻辑设计。
2.4 关系模型的基本术语
术语 含义 别搞混
关系 一张二维表 —
元组 表中的一行 记录
属性 表中的一列 字段
域 属性的取值范围 如"性别∈{男,女}"
候选键 能唯一标识一个元组、且不含多余属性的最小属性组 有多个候选键时
主键 从候选键里选一个 当主键 一个表只有 1 个主键
外键 本表中的某属性,是另一张表的主键 用来建立表间联系
主属性 包含在任一候选键里的属性 反之叫非主属性
③ E-R 图:三个形状 + 三种联系方式
3.1 只记三个形状
实体
矩形(如 客户、商品)
联系
菱形(如 购买、属于)
属性
椭圆(如 客户号、电话)
3.2 三种联系方式(联系两端标什么)
类型 含义 例子(口诀) 怎么落地
1 : 1 一个对一个 一个班只有一个班长,一个班长只属于一个班 任意一边加对方主键
1 : n 一个对多个 一个客户有多个订单,一个订单只属一个客户 n 端 (订单)加 1 端 (客户)主键当外键
m : n 多个对多个 一个学生选多门课,一门课被多个学生选 必须单独建一张"联系表" ,把双方主键都放进去
🔑 判断技巧(超好用): 看联系
两端的"1"字怎么念 ——
两端都是"一个…只对应一个" → 1:1
一端"一个"、另一端"多个" → 1:n ("多个"那边是 n)
两端都是"多个" → m:n
口诀:一多之间 1:n,多多之间 m:n,一对一就 1:1。
📝 例题 判断下列联系的基数类型:
① 一个班级有多名学生,一名学生只属于一个班级 → ?
② 一名教师可教多门课,一门课可由多名教师教 → ?
③ 一个公司只有一名法人,一名法人只担任一个公司法人 → ?
✅ ① 1:n ② m:n ③ 1:1
读法:两端都写"一个…只…"就 1:1;一端"一个"一端"多个"就 1:n;两端都"多个"就 m:n。
🎯 真题 2020下 · 上午 51-52
某高校信息系统设计的分 E-R 图中,人力部门定义的职工实体有属性(职工号、姓名、性别、出生日期);教学部门定义的教师实体有属性(教师号、姓名、职称)。这种情况属于(51),在合并 E-R 图时(52)解决这一冲突。
(51) A. 属性冲突 B. 命名冲突 C. 结构冲突 D. 实体冲突
(52) A. 职工和教师实体保持各自属性不变 B. 职工实体中加入职称属性,删除教师实体 C. 直接将教师实体删除 D. 将教师实体所有属性并入职工实体,删除教师实体
✅ 答案:(51) C (52) B
同一对象(人)在一个分 E-R 图里被当"职工"、另一个里当"教师",属性还不一样 → 结构冲突 。合并时以较大实体为主:把教师特有的"职称"并入职工,删掉教师实体。
三类冲突要背: 属性冲突(类型/取值范围/单位不同)、命名冲突(异名同义、同名异义)、结构冲突 (同对象一会儿是实体一会儿是属性、属性个数类型不同)。
④ E-R → 关系模式:转换规则(本节最重要)
这是问题2/问题3拿分的钥匙。ER 图 → 表,就三条规则:
图上的东西 转换成 说明
每个实体 一张表(关系模式) 实体的属性 = 表的列;实体标识属性 = 主键
1:n 联系 不单独建表 把"1"端的主键,塞进"n"端表里当外键
m:n 联系 单独建一张表 列 = 双方主键(合起来当主键)+ 联系自身的属性
1:1 联系 不单独建表 把任一方主键塞进另一方当外键(或两边合并)
4.1 看一个完整例子(客户-订单-商品)
需求:一个客户有多个订单;一个订单可含多个商品,一个商品可被多个订单买。
关系模式 主键 外键 为什么
客户(客户号 ,姓名,电话) 客户号 — —
订单(订单号 ,客户号 ,日期) 订单号 客户号→客户 1:n,n端(订单)放1端(客户)主键
商品(商品号 ,名称,单价) 商品号 — —
订单明细(订单号,商品号 ,数量) 订单号+商品号 订单号→订单;商品号→商品 m:n 单独建表 ,双主键
⚠️ 小白最常踩的两个坑:
把 m:n 硬塞进一张表 :想在一个字段里存"商品1,商品2,商品3"——违反原子性,错的。必须拆联系表。
1:n 又单独建联系表 :1:n 不需要新表,只需把"1"的主键搬过去当外键。
记忆:见"多对多"就建中介表;见"一对多"就搬外键。
📝 例题 把下面 E-R 转成关系模式:
"学生"和"课程"是 m:n (选课,含"成绩");"班级"和"学生"是 1:n (一个班多名学生)。
✅ 学生(学号 ,姓名,班级号 );课程(课程号 ,课程名);选课(学号,课程号 ,成绩)
班级号是 1:n 搬到 n 端(学生)的外键;选课是 m:n 单独建的表,双主键 + 联系自身属性(成绩)。
🎯 真题 2022下 · 上午 51
E-R 模型向关系模型转换时,两个实体 E1 和 E2 之间的多对多联系 R 应该转换为一个独立的关系模式,且该关系模式的关键字 由( )组成。
A. 联系 R 的属性 B. E1 或 E2 的关键字 C. E1 和 E2 的关键字 D. E1 和 E2 的关键字加上 R 的属性
✅ 答案:C(E1 和 E2 的关键字)
m:n 联系表的主键 = 双方主键的并 (才能唯一确定一条联系记录);R 自己的属性(如"数量")只是普通属性,不进主键。记牢:关键字只由两实体关键字组成 ,别手滑选 D。
📝 例题 某"选课"关系里有属性"成绩",它属于哪一部分?
✅ 属于联系自身的属性 ,跟着中介表(选课表)走,不作为主键。
⑤ 主键 / 外键 / 完整性约束
约束 要求 一句话
实体完整性 主键非空且唯一 每行都得能被主键认出来
参照完整性 外键的值要么为空,要么等于被引用表里已存在的主键值 不能引用一个不存在的对象
用户定义完整性 业务规则,如"年龄 0~150""性别∈{男,女}" 自己定的规矩
答题规范: 标键时写成一串——
· 下划线 表示主键(如 客户(客户号 ,姓名))
· 波浪线 或标注表示外键,并写清"外键→引用哪张表"。
真题里常写:"主键:客户号;外键:所属部门号(引用部门关系)"。
📝 例题 判断下面各违反哪种完整性约束:
① 学生表里插入了两条"学号"完全相同的记录 ② 选课表里"学号"填了 999,但学生表根本没有 999 号学生 ③ 年龄字段填成 −5
✅ ① 实体完整性(主键要唯一) ② 参照完整性(外键引用了不存在的对象) ③ 用户定义完整性(业务规则)
⑥ 规范化(范式)与"存在问题"
为什么要有范式? 因为如果表设计不好(属性乱塞一张表),会出现四大毛病:数据冗余、插入异常、删除异常、修改异常 。范式就是"分表的标准",越高级分得越彻底。
范式 要求(人话) 通俗理解
1NF 每个属性都不可再分 (原子性) 一个格子里别塞多个值
2NF 1NF + 非主属性完全依赖主键 (不存在部分依赖) 别出现"部分属性只跟主键的一部分有关"
3NF 2NF + 非主属性不传递依赖主键 非主属性之间别再互相依赖(如 A→B→C)
BCNF 3NF 的加强版:每个决定因素都包含候选键 主属性之间也不能传递依赖
真题问法:"某关系存在什么问题?如何解决?"
答法几乎固定:
① 问题:存在数据冗余,以及插入异常、删除异常、修改异常。
② 解决:将关系模式进行分解 (规范化),把"多值"的那部分拆出去独立成表,用主键关联。
例(2020下职员表把"家庭成员"混进来):因一个职员有多个家属,家属信息与职员是 m:n/1:n 的弱关系,应拆成 职员表 + 家属表,用职员号关联。
📝 例题 关系 R(学号,姓名,课程号,成绩)里,一个学生选多门课。它最高是第几范式?
✅ 1NF(不是 2NF)
主键是(学号,课程号),但"姓名"只依赖"学号"这一部分 → 部分依赖 ,违反 2NF。解决:拆成 学生(学号,姓名)+ 选课(学号,课程号,成绩)。
🎯 真题 2022下 · 上午 51-53
教师关系模式 T(教师号,姓名,部门号,岗位,联系地址,薪资),函数依赖集 F={教师号→(姓名,部门号,岗位,联系地址),岗位→薪资}。 关系模式 T 的主键为(52),函数依赖集 F(53)。
(52) A. 教师号,T 存在冗余以及插入异常和删除异常 B. 教师号,T 不存在…… C. (教师号,岗位),T 存在…… D. (教师号,岗位),T 不存在……
(53) A. 存在传递依赖,最高 1NF B. 存在传递依赖,最高 2NF C. 不存在传递依赖,最高 3NF D. 不存在传递依赖,最高 4NF
✅ 答案:(52) A (53) B
"教师号"能推出其余全部属性 → 主键是教师号 (单个属性)。但存在 教师号→岗位→薪资 的传递依赖 ,所以最高只能到 2NF (去掉了部分依赖,但没消传递依赖)。
范式判断套路: 先求主键 → 看有没有"部分依赖"(违反2NF) → 再看有没有"传递依赖"(违反3NF)。有传递依赖 = 有冗余 + 插入/删除异常。
🎯 真题 2022上 · 上午 23
数据库中的视图是一个虚拟表。若设计师为 user 表创建一个 user1 视图,那么数据字典中保存的是( )。
A. user1 查询语句 B. user1 视图定义 C. user1 查询结果 D. 都不对
✅ 答案:B(视图定义)
视图是虚表 ,不真正存数据,数据字典里只存"视图是怎么定义出来的"(那条查询语句的定义)。查询结果不保存,用的时候才现算。
⑦ SQL 与关系代数(主要在上午题,下午偶尔)
7.1 五种基本关系代数运算
运算 符号 作用
选择 σ(sigma) 按条件选行 (WHERE)
投影 π(pi) 选列 (SELECT 的列)
并 ∪ 两个表的行合并
差 − 在 A 不在 B 的行
笛卡尔积 × 所有行两两组合
自然连接 ⋈ 按同名列拼接(考试最爱)
7.2 必背的 SQL 骨架
SELECT 列名 -- 投影:要哪些列
FROM 表名 -- 数据来源
WHERE 条件 -- 选择:选哪些行
GROUP BY 分组列 HAVING 分组条件 -- 分组统计
ORDER BY 列 [ASC|DESC] -- 排序
-- 建表(会考主外键)
CREATE TABLE 选课(
学号 CHAR(10) NOT NULL,
课程号 CHAR(6) NOT NULL,
成绩 INT,
PRIMARY KEY(学号, 课程号),
FOREIGN KEY(学号) REFERENCES 学生(学号)
);
-- 授权
GRANT SELECT, UPDATE ON 表名 TO 用户名;
REVOKE SELECT ON 表名 FROM 用户名;
内连接 vs 外连接: 内连接只保留两表都匹配上的行;左外连接 保留左表全部行,右表没匹配的补 NULL。真题问"哪个客户没有订单"就常用外连接或差集。
🎯 真题 2022上 · 上午 24-25
给定关系 R(A,B,C,D) 和关系 S(A,D,E,F),若对这两个关系进行自然连接 R⋈S,结果的属性列有(24)个。
(24) A. 4 B. 5 C. 6 D. 8
✅ 答案:C(6 列)
自然连接列数 = 两边列数之和 − 同名(重复)列数 。R 有 4 列、S 有 4 列,公共属性 A、D 共 2 列 → 4+4−2 = 6 。(结果列为 A,B,C,D,E,F。)
注意: 自然连接会自动去掉重复列;普通等值连接不去重,列数是 8。
🎯 真题 2020下 · 上午 54-55
关系 R、S 做自然连接、左外连接、右外连接、完全外连接后,元组个数会怎样变化?
✅ 要点:内/自然连接只保留匹配上 的元组;左外连接 = 匹配结果 + 左表 未匹配的元组(右表补 NULL);右外连接 = 匹配结果 + 右表 未匹配的元组;完全外连接 = 两边未匹配的都保留。
记忆:谁"外"就保谁 。左外保左表全部,右外保右表全部,完全外两边都保。
🎯 真题 2021上 · 上午 15
员工关系 E(工号、姓名、部门名、电话、住址)、商品关系 C(商品号、商品名、库存数)、销售关系 EC(工号、商品号、销售数、销售日期)。查询"销售部1"在 2020-11-11 销售"HUWEI Mate40"商品的员工工号、姓名、部门名及其销售的商品名、销售数 ,关系代数表达式为 π₁,₂,₃,₇,₈( σ₃='销售部1'(E) ⋈ σ₂='HUAWEI Mate40'(C) ⋈ π₁,₂,₄,₅(σ₄='2020-11-11'(EC)) )。
✅ 思路:三个表用"工号""商品号"串起来,最后 π 取需要的列。
三步走:
① σ 选行 :E 里挑部门名='销售部1',C 里挑商品名='HUAWEI Mate40',EC 里挑日期='2020-11-11';
② ⋈ 连接 :E ⋈ EC(按工号)、EC ⋈ C(按商品号);
③ π 取列 :只留工号、姓名、部门名、商品名、销售数。
口诀先σ后⋈再π ;π 的下标是"连接后结果集的列序号",要数清楚。
🎯 真题 2021下 · 上午 56
数据库的安全机制中,通过提供( )供第三方开发人员调用进行数据更新,从而保证数据库的关系模式不被第三方所获取。
A. 触发器 B. 存储过程 C. 视图 D. 索引
✅ 答案:B(存储过程)
让第三方"只调过程、看不到表结构"→ 用存储过程 封装数据更新操作。(视图是"隐藏部分行列"的虚表,触发器是自动执行的,索引是加速查询的。)
⑧ 通用四步法(拿到题就这么拆)
1
圈名词 → 找实体。 需要建表"长期保存信息"的对象就是实体:客户、车辆、员工、供应商……(人/物/组织/单据)。能独立存在、有自己的标识 → 就是实体。
2
看每句"需求"→ 找联系。 "一个 X 有多个 Y" → 1:n;"多个 X 对多个 Y" → m:n;"X 和 Y 一一对应" → 1:1。别漏"能当动词的关系"(购买/属于/包含/负责/供货)。
3
补关系模式:实体→表,属性列全;1:n 把 1 的主键搬到 n;m:n 建中介表。 注意标下划线(主键)、外键引用。
4
查异常问"问题": 若问"存在什么问题",答"冗余+插入/删除/修改异常",解决=分解规范化。
拆需求的关键句型(照抄就对):
题干原句 翻译成
"每个 X 有多名 Y,每名 Y 只属于一个 X" X : Y = 1:n ,把 X 主键放进 Y 表当外键
"一个 X 可以有多个 Y,一个 Y 也可以有多个 X" X : Y = m:n ,建中介表
"X 号唯一标识 X 的每一个元组" → X 的主键 是 X 号
"一个 X 只有一名 Y,一名 Y 只负责一个 X" X : Y = 1:1
⑨ 真题精讲 5 套
下面每套都按考场原貌 给出:题干原文(含问题)+ 图 2-1 原图(不完整 E-R 图)+ 官方答案及推导 。
请先看图自己想"缺哪些联系/属性",再展开答案对照。
【2020 下半年 · M 集团职员管理】
【说明】 M 集团拥有多个分公司,为便于对职员进行有效管理,决定构建信息平台。
【需求分析结果】
(1)
分公司 关系模式:分公司编号、名称、经理号、联系地址、电话。分公司编号唯一标记每个元组;每个分公司各有一名经理负责管理;每个分公司设立多个业务部(研发部、财务部、采购部、交易部等)。
(2)
业务部 关系模式:业务部编号、名称、地址、电话、分公司编号。业务部编号唯一标记每个元组;每个业务部各有一名主管负责管理;每个业务部有多名职员,每个职员只能来源于一个业务部。
(3)
职员 关系模式:职员号、姓名、所属业务部编号、岗位、电话、家庭成员姓名、成员关系。岗位包括:经理、主管、研发员、业务员等。
【逻辑结构设计】 (不完整)
分公司(分公司编号,名称, (a) ,联系地址)
业务部(业务部编号,名称, (b) ,电话)
职员(职员号,姓名,岗位, (c) ,电话,家庭成员姓名,成员关系)
问题1 (4分)补充 4 个联系,完善图 2-1,联系类型为 1:1、1:n、m:n。
问题2 (3分)将关系模式中的空 (a)~(c) 补全。
问题3 (4分)分析分公司关系模式、业务部关系模式的主键和外键。
问题4 (4分)假设每个职员有多名家属成员,职员关系模式存在什么问题?如何解决?
▲ 图 2-1 实体联系图(真题原图,不完整 ——联系 1/2/3/4 就是你要补的)
展开答案与推导
问题1:补 4 个联系(类型)
联系 连接对象 类型 依据
联系1 管理 分公司—经理(职员) 1:1 每个分公司各有一名经理
联系2 设有 分公司—业务部 1:n 一个分公司多个业务部
联系3 负责 业务部—主管(职员) 1:1 每个业务部一名主管
联系4 隶属 业务部—职员 1:n 每个业务部多名职员,职员只属一个业务部
问题2:补空
(a) 经理号,电话 (b) 地址,分公司编号,主管号 (c) 所属业务部编号
问题3:主键/外键
分公司:主键 分公司编号;外键 经理号(引用职员)。 业务部:主键 业务部编号;外键 分公司编号、主管号(引用职员)。
问题4:职员表的问题与解决
问题:一个职员有多名家属,"家庭成员姓名、成员关系"塞在职员表里会造成数据冗余及插入/删除/修改异常 。
解决:分解为——职员1(职员号,姓名,岗位,所属业务部编号,电话)+ 职员2(职员号,家庭成员姓名,成员关系)。
▲ 答案标注图(红字为补充的 4 个联系,蓝线为连接关系)
🔍 为什么 (a) 里有"电话"? 题干说明分公司要记"联系地址和电话",但关系模式里只给了"联系地址",漏了电话 → 补上。
(a) 里的"经理号" 来自 1:1 联系"管理":把经理(职员)的主键搬进分公司表当外键。
【2021 下半年 · 汽车维修管理系统】
【说明】 某汽车维修公司为便于管理车辆维修情况,拟开发一套汽车维修管理系统。
【需求分析结果】
(1)
客户 信息:客户号、客户名、客户性质、折扣率、联系人、联系电话。客户性质有个人或单位。客户号唯一标识客户关系中的每一个元组。
(2)
车辆 信息:车牌号、车型、颜色、车辆类别。一个客户至少有一辆车,一辆车只属于一个客户。
(3)
员工 信息:员工号、员工名、岗位、电话、家庭住址。员工号唯一标识每个元组。岗位有业务员、维修工、主管。业务员根据车辆的故障情况填写维修单。
(4)
部门 信息:部门号、名称、主管、电话。部门号唯一确定每个元组。每个部门只有一名主管,但每个部门有多名员工,每名员工只属于一个部门。
(5)
维修单 信息:维修单号、车牌号、维修内容、工时。维修单号唯一标识每个元组。一个维修工可以接多张维修单,但一张维修单只对应一个维修工。
【逻辑结构设计】 (不完整)
客户(客户号,客户名, (a) ,折扣率,联系人,联系电话)
车辆(车牌号, (b) ,车型,颜色,车辆类别)
员工(员工号,员工名,岗位, (c) ,电话,家庭住址)
部门(部门号,名称,主管,电话)
维修单(维修单号, (d) ,维修内容,工时)
问题1 (6分)补充 3 个联系,完善图 2-1。
问题2 (4分)将关系模式中的空 (a)~(d) 补全。
问题3 (2分)给出车辆关系和维修单关系的主键和外键。
问题4 (3分)如果一张维修单涉及多项维修内容、需多个维修工处理,哪个联系类型会发生何种变化?如何解决?
▲ 图 2-1 实体联系图(真题原图,不完整 )
展开答案与推导
问题1:补 3 个联系(6 分)
联系 连接对象 类型 依据
联系1 拥有 客户—车辆 1:n 一个客户多辆车,一辆车属一个客户
联系2 隶属 部门—员工 1:n 一个部门多名员工,员工属一个部门
联系3 承接 维修工(员工)—维修单 1:n 一个维修工多张单,一张单一个维修工
问题2:补空
(a) 客户性质(题干"客户信息包括…客户性质…"漏了) (b) 客户号(1:n,把客户主键放进车辆)
(c) 所属部门号(1:n,把部门主键放进员工) (d) 员工号(1:n,把维修工主键放进维修单)
问题3:车辆、维修单的主键/外键
车辆:主键 车牌号;外键 客户号。 维修单:主键 维修单号;外键 员工号(维修工)。
问题4:一张单含多项内容、需多个维修工 → 联系怎么变?
原来的"维修工—维修单"是 1:n ;一旦"一个维修工可处理多张单,一张单也可由多个维修工处理",就变成 m:n 。
解决:为"维修"这个 m:n 联系单独建一张联系表 ,如 维修明细(维修单号,员工号,…),把双方主键都作为主键/外键。
▲ 答案标注图(底部蓝字为官方的"联系类型变化+解决办法")
🔍 思路: 先按题干把每个"一个…多个…只属于/只对应"翻译成 1:n;到问题4题干把条件改成"多对多",只需把对应联系的基数由 1:n 改 m:n,并说明建中介表——这就是"联系类型变化"题的固定套路。
【2021 上半年 · 社区蔬菜团购网站】
【说明】 某社区蔬菜团购网站,为规范商品收发流程、便于查询客户订单情况,需开发一个信息系统。
【需求分析结果】
(1) 记录
蔬菜供应商 信息:供应商编号、地址和一个电话。
(2) 记录
社区团购点 信息:团购点编号、地址和一个电话。
(3) 记录
客户 信息:客户姓名和一个电话。客户可以在不同的社区团购点下订单,不直接与蔬菜供应商发生联系。
(4) 记录
客户订单 信息:订单编号、团购点编号、客户电话、订单内容和日期。
【逻辑结构设计】 (不完整)
蔬菜供货商(供货商编号,地址,电话)
社区团购点(团购点编号,地址,电话)
供货(供货商编号, (a) )
客户(姓名,客户电话)
订单(订单编号,团购点编号,订单内容,日期, (b) )
问题1 (6分)根据问题描述,补充图 2-1 的实体联系图。
问题2 (4分)补充逻辑结构设计结果中的 (a)、(b) 两处空缺及完整性约束关系。
问题3 (5分)若还兼有代收快递业务,增加新的"快递"实体,并给出客户实体和快递实体之间的"收取"联系,对图 2-1 进行补充。"快递"关系模式包括快递编号、客户电话和日期。
▲ 图 2-1 实体联系图(真题原图,不完整 ——"订单"这个菱形还没连上客户和团购点)
展开答案与推导
问题1:补 E-R 图
在图上补出:客户—(下单)—订单(1:n) 、团购点—(接收)—订单(1:n) 等联系(按所给不完整图补齐缺失的联系及基数)。
问题2:补 (a)(b) 及完整性约束
(a) 团购点编号(供货联系里要有团购点?按题:供货商与团购点之间关系,补"团购点编号")
(b) 客户电话(订单里要关联客户,客户主键是电话)
约束:订单.团购点编号 参照 社区团购点(团购点编号);订单.客户电话 参照 客户(客户电话);供货.供货商编号 参照 蔬菜供货商(供货商编号)。
问题3:增加"快递"实体
新增实体 快递(快递编号,客户电话,日期) ;新增联系 收取 :客户—(收取)—快递,类型 1:n (一个客户可收多个快递,一个快递属于一个客户)。客户电话作为快递的外键。
▲ 答案标注图(红字为补充的联系与实体)
🔍 提示: 本题客户主键是"客户电话"(题里没给客户号),所以订单、快递都用"客户电话"当外键——主键选谁要看题干给了什么唯一标识 。
【2022 上半年 · 疫苗接种管理系统】
【说明】 为提高疫苗接种效率、为抗击疫情提供数据支撑,需开发一个信息系统。
【需求分析结果】
(1) 记录
疫苗供应商 信息:供应商名称、地址和一个电话。
(2) 记录
接种医院 信息:医院名称、地址和一个电话。
(3) 记录
接种者 个人信息:姓名、身份证号和一个电话。
(4) 记录接种者
疫苗接种 信息:接种医院信息、被接种者信息、疫苗供应商名称和接种日期。为提高免疫力,接种者可能需要进行多次疫苗接种(
每天最多接种一次,每次都可以在全市任意一家医院进行接种 )。
【逻辑结构设计】 (不完整)
供应商(供应商名称、地址、电话)
医院(医院名称、地址、电话)
供货(供应商名称, (a) ,供货内容)
被接种者(姓名、身份证号、电话)
接种(接种者身份证号, (b) ,医院名称、供应商名称)
问题1 (4分)根据问题描述,补充图 2-1 的实体联系图(不增加新的实体)。
问题2 (4分)补充 (a)、(b) 两处空缺,并标注主键和外键完整性约束。
问题3 (7分)若医院还兼有核酸检测业务(检测时可能需多次检测,每天最多一次,每次可在全市任意一家医院进行)。请在图 2-1 中增加"被检测者"实体及属性、医院与被检测者之间的"检测"联系及必要属性,并给出新增关系模式。被检测者实体包括姓名、身份证号、地址、电话;检测联系包括检测日期和检测结果。
▲ 图 2-1 E-R 图(真题原图,"接种"菱形尚未与实体连全)
展开答案与推导
问题1:补 E-R 图(不加新实体,4分)
补出"接种 "联系的连接关系:它是多元联系 ,连接 被接种者、医院、供应商 三个实体(因为"接种"关系模式里同时含 接种者身份证号、接种日期、医院名称、供应商名称);"供货"连接 供应商与医院(m:n,带"供货内容"属性)。
问题2:补 (a)(b) 及主外键
(a) 医院名称 (b) 接种日期
供货 :主键(供应商名称,医院名称);外键 供应商名称→供应商、医院名称→医院。
接种 :主键(接种者身份证号,接种时间/接种日期);外键 接种者身份证号→被接种者、医院名称→医院、供应商名称→供应商。
问题3:新增检测业务(7分)
新增关系模式:
被检测者(身份证号 ,姓名,地址,电话)
检测(被检测者身份证号,医院名称,检测日期 ,检测结果)
其中"检测"联系属性:检测日期、检测结果。
🔍 关键点: 本套题里"接种/检测"都是"人被某医院服务"的多元/多对多 关系——一个人可在多家医院多次接种,一家医院接待多人,所以要把它单独建成关系(把多方主键 + 业务属性合成)。同一套题的加需求问法(问题3)与 2023上"加门店"如出一辙:加实体 + 加联系 + 补一条关系模式。
【2023 上半年 · 汽车零件采购系统】
【说明】 某新能源汽车公司为提升效率,需开发一个汽车零件采购系统。
【概念结构设计】
(1) 记录
供应商 信息:供应商的名称、地址和一个电话。
(2) 记录
零件 信息:零件的编码、名称和价格。
(3) 记录
车型 信息:车型的编号、名称和规格。
(4) 记录
零件采购 信息:某个车型的某种零件可以从多家供应商采购,某种零件也可以被多个车型采用,某家供应商也可以供应多种零件,还包括采购数量和采购日期。
【逻辑结构设计】 (不完整)
供应商(名称,地址,电话)
零件(编码,名称,价格)
车型(编号,名称,规格)
采购(车型编号,供应商名称, (a) , (b) ,采购日期)
问题1 (5分)根据描述,补充图 2-1 的实体联系图(不增加新的实体)。
问题2 (3分)补充 (a)、(b) 两处空缺,并标注主键和外键完整性约束。
问题3 (7分)新增需求:记录车型在全国门店的销售情况(门店信息包括门店编号、地址、电话,销售包括销售数量和销售日期)。
(1) 在图 2-1 中体现门店信息及其车型销售情况、标明新增的实体和联系及其主要属性;
(2) 给出新增加的关系模式,并标注主键和外键完整性约束。
▲ 图 2-1 实体联系图(真题原图,"采购"菱形尚未与三个实体相连)
展开答案与推导
问题1:补 E-R 图(不加新实体,5分)
三个实体 供应商、零件、车型 之间由"采购"这个三元联系 连接:车型—(采购)—零件—(采购)—供应商 ,采购联系的基数为 m:n:p (多对多对多)。
问题2:补 (a)(b)
(a) 零件编码 (b) 采购数量(采购日期题干已给出,缺的是零件和数量)
主键 = (车型编号,供应商名称,零件编码);外键:车型编号→车型、供应商名称→供应商、零件编码→零件。
问题3:新增门店销售需求(7分)
(1) 图 2-1 中新增实体 门店(编号,地址,电话) 和联系 销售 ,连接 车型—门店,基数 m:n (一个车型可在多个门店销售,一个门店销售多个车型),联系属性含销售数量、销售日期。
(2) 新增关系模式:
门店(编号 ,地址,电话)
销售(车型编号,门店编号 ,销售数量,销售日期) 主键=车型编号+门店编号;外键 车型编号→车型、门店编号→门店。
🔍 三重多对多怎么破? 只要一句"多个 X 对多个 Y 对多个 Z",就建一张"采购"表,把三方主键全放进去当联合主键——和 m:n 建中介表是同一招,只是升级成三方。联系自身的属性(采购数量/日期)也放进联系表。
⑩ 速查表 & 自测 & 口诀
10.1 一句话对照表
你看到 你写下
要"长期保存信息的对象" 实体 (→ 一张表)
"一个 A 多个 B,一个 B 只属一个 A" 1:n ,A 的主键进 B 表当外键
"多个 A 多个 B" m:n ,单独建 A-B 中介表
"A、B 一一对应" 1:1
"X 号唯一标识每个元组" X 的主键 = X 号
"存在什么问题" 冗余 + 插入/删除/修改异常 → 分解规范化
要加新业务/新实体 加实体框 + 加联系菱形 + 补一条关系模式(标主外键)
10.2 三分钟自测(先自己答再点开)
Q1:一个学生选多门课,一门课被多个学生选,E-R 图里这条"选课"联系是什么类型?落地要怎么建表?
看答案
m:n 单独建中介表 选课(学号,课程号 ,成绩),学号+课程号合起来当主键,各自又是外键。
Q2:"每个部门有一名经理,每名经理只管理一个部门"是什么类型?主键外键怎么放?
看答案
1:1 任选一边把对方主键搬过去当外键即可,如 部门表加"经理号"当外键。
Q3:一张表里出现"职员号、姓名、家属姓名、家属关系",有什么问题?怎么办?
看答案
数据冗余 + 插入/删除/修改异常 因为一个职员有多个家属。拆成 职员表(职员号,姓名,…)和 家属表(职员号,家属姓名,家属关系),用职员号关联。
🧠 送分口诀:
· 找实体 :圈"要存信息的名词"(人/物/单据)。
· 判联系 :一多 1:n,多多 m:n,一一 1:1。
· 转成表 :实体成表,1:n 搬外键,m:n 建中介。
· 标约束 :主键下划线、外键写"引用谁"。
· 问异常 :冗余 + 三类异常 → 分解。
· 加需求 :加框加菱形,补关系模式。
❌ 最易丢分的 6 个坑:
m:n 联系忘了单独建表(直接在实体里塞重复值)。
1:n 画蛇添足又建了联系表。
补关系模式时漏了题干提到的属性(如 2020下漏"电话"、2021下漏"客户性质")。
主键选错:题干说"A 号唯一标识"就必须用它当主键,别自作主张。
外键只写字段名、没写"引用哪张表"。
"存在问题"题只答"冗余"不答"插入/删除/修改异常",或忘了说"分解规范化"。