E-R图专题
核心规则
- 看到 1:1 (如 员工-电脑):
- 图上两边都是 1。
- 转关系模式时,随便选一边,把另一边的主键塞进去。
- 看到 1:n (如 办公室-员工):
- 图上一头是 1,一头是 n。
- 转关系模式时,永远把 “1”那边的主键(办公室号),塞到 “n”那边的表(员工表)里。
- 看到 m:n (如 订单-商品):
- 图上两头都是字母 (m, n)。
- 转关系模式时,菱形必须变成一张独立的表。
- 如果有挂在菱形上的椭圆(如“购买数量”),这个属性就直接进这张新表。
练习题 1:经典组合 (1:n 与 m:n)
场景:医院管理系统
- 医生 (Doctor):编号 (Dno)、姓名 (Name)、职称 (Title)
- 科室 (Dept):科室号 (DeptNo)、名称 (Dname)、位置 (Loc)
- 病人 (Patient):病历号 (Pno)、姓名 (Pname)、性别 (Sex)
- 业务规则:
- 一个科室有多名医生,一名医生只能属于一个科室。
- 医生和病人之间是治疗关系:一名医生可以治疗多名病人,一名病人也可以找多名医生看病。
- 治疗时需要记录“诊断日期”和“病情描述”。
请完成:
- 描述 E-R 图结构(谁连谁,是几对几)。
- 重点:写出转换后的关系模式(指出主键、外键)。
【练习题 1 答案】
1. E-R 结构:
- 科室 (1) —— <属于> —— (n) 医生
- 医生 (m) —— <治疗> —— (n) 病人 (属性:诊断日期、病情描述)
2. 关系模式:
- 科室 (DeptNo, Dname, Loc)
- 病人 (Pno, Pname, Sex)
- 医生 (Dno, Name, Title, DeptNo)
- 解析 (1:n):医生是“多”的一端,所以把科室的主键
DeptNo拿过来做外键。不能建一个“科室医生表”。
- 解析 (1:n):医生是“多”的一端,所以把科室的主键
- 治疗 (Dno, Pno, 诊断日期, 病情描述)
- 解析 (m:n):多对多必须建新表。主键是双方主键的组合。
练习题 2:难点 (1:1 的处理)
场景:公司资产管理
- 员工 (Emp):工号 (Eno)、姓名 (Ename)、手机 (Tel)
- 电脑 (PC):资产编号 (PCno)、品牌 (Brand)、型号 (Model)
- 办公室 (Office):房间号 (RoomNo)、面积 (Area)
- 业务规则:
- 分配电脑:为了安全,公司规定一台电脑只能分配给一名员工使用,一名员工也只能领用一台电脑。(1:1)
- 所属部门:一个办公室里可以坐多名员工,一名员工只能在一个办公室工作。(1:n)
请完成:
- 写出转换后的关系模式。
- 思考题:在处理“员工”和“电脑”的 1:1 关系时,外键应该放在哪张表比较合适?为什么?
【练习题 2 答案】
首先画三个矩形,分别写上名字,并引出椭圆写上属性:
[员工] —— 连出椭圆:(工号)、(姓名)、(手机)
[电脑] —— 连出椭圆:(资产编号)、(品牌)、(型号)
[办公室] —— 连出椭圆:(房间号)、(面积)
联系 A:分配/使用 (1:1)
- 在 [员工] 和 [电脑] 之间画一个菱形,里面写 <使用>。
- 用线把它们连起来。
- 标注基数:在员工端的线上写 1,在电脑端的线上写 1。
- 解读:一名员工对应一台电脑。
联系 B:所属/工作 (1:n)
- 在 [员工] 和 [办公室] 之间画一个菱形,里面写 <工作在>。
- 用线把它们连起来。
- 标注基数:
- 在 [员工] 这一侧的线上写 n(因为办公室里有多名员工)。
- 在 [办公室] 这一侧的线上写 1(因为一名员工只能在一个办公室)。
1. 关系模式:
- 办公室 (RoomNo, Area)
- 电脑 (PCno, Brand, Model)
- 员工 (Eno, Ename, Tel, RoomNo, PCno)
- 解析 (1:n):员工是办公室的“多”端,放入
RoomNo。 - 解析 (1:1):这里我选择把
PCno放在员工表里。
- 解析 (1:n):员工是办公室的“多”端,放入
2. 思考题解析 (1:1 怎么放):
- 方案 A (推荐):把电脑号放在员工表里。逻辑是“这个员工配了哪台电脑”。
- 方案 B:把工号放在电脑表里。逻辑是“这台电脑归谁用”。
- 判定标准:在 1:1 中,通常将外键放在**“完全参与”**(Total Participation)的一方。
- 如果业务规定:“每个员工必须配电脑,但电脑可以闲置”,那外键放在员工表(因为员工不能空着这一栏)。
- 如果没特殊规定,任意一方都可以,或者两边合二为一(如果关系非常紧密)。但在本题中,独立的员工表和电脑表更清晰,合并任意一方即可。
练习题 3:综合
场景:网上商城订单系统
- 用户 (User):用户ID (Uid)、昵称 (Nick)、余额 (Balance)
- 会员卡 (Card):卡号 (Cno)、等级 (Level)、到期日 (Expire)
- 商品 (Item):商品号 (Ino)、名称 (Iname)、单价 (Price)
- 订单 (Order):订单号 (Ono)、总价 (Total)、时间 (Time)
- 业务规则:
- 持有:一个用户只能办一张会员卡,一张会员卡也只属于一个用户。(1:1)
- 下单:一个用户可以下多个订单,一个订单只属于一个用户。(1:n)
- 包含:一个订单里包含多种商品,一种商品也可以出现在多个订单里。(m:n) 注意: 包含关系还需要记录“购买数量”。
请完成:
- 写出转换后的所有关系模式(应该有几个表?)。
【练习题 3 答案】
应该有 5 个表(其中 m:n 产生 1 个,1:1 和 1:n 均不产生新表)。
- 用户 (Uid, Nick, Balance)
- 会员卡 (Cno, Level, Expire, Uid)
- 解析 (1:1):把用户ID放在会员卡里。因为通常是“先有人,后办卡”,卡是依附于人的。
- 商品 (Ino, Iname, Price)
- 订单 (Ono, Total, Time, Uid)
- 解析 (1:n):订单是“多”的一端(一个用户很多订单),所以订单表里存
Uid。
- 解析 (1:n):订单是“多”的一端(一个用户很多订单),所以订单表里存
- 订单详情/包含 (Ono, Ino, 购买数量)
- 解析 (m:n):订单和商品是多对多。这张表就是我们在电商后台常见的
Order_Detail表,必须独立存在。
- 解析 (m:n):订单和商品是多对多。这张表就是我们在电商后台常见的
画四个矩形,引出各自的属性椭圆:
[用户]:(ID, 昵称…)
[会员卡]:(卡号, 等级…)
[订单]:(订单号, 总价…)
[商品]:(商品号, 单价…)
联系 A:持有 (1:1)
- 连接 [用户] 和 [会员卡],中间菱形写 <持有>。
- 两边连线分别标记 1 和 1。
联系 B:下单 (1:n)
- 连接 [用户] 和 [订单],中间菱形写 <下单>。
- [用户] 侧写 1,[订单] 侧写 n(一个用户下多个单)。
**联系 C:包含 (m:n) **
- 连接 [订单] 和 [商品],中间菱形写 <包含>。
- [订单] 侧写 m,[商品] 侧写 n(或相反,总之两边都是字母,表示多对多)。
- 关键点:题目中有一个属性叫 “购买数量”。这个属性不能挂在[订单]上(因为订单里有不同商品,数量不一样),也不能挂在[商品]上(因为库存和购买量是两码事)。
- 画法:从 <包含> 这个菱形上引出一根线,连一个椭圆,里面写 (购买数量)。