E-R 图专题


E-R图专题

核心规则

  1. 看到 1:1 (如 员工-电脑)
    • 图上两边都是 1。
    • 转关系模式时,随便选一边,把另一边的主键塞进去。
  2. 看到 1:n (如 办公室-员工)
    • 图上一头是 1,一头是 n。
    • 转关系模式时,永远把 “1”那边的主键(办公室号),塞到 “n”那边的表(员工表)里。
  3. 看到 m:n (如 订单-商品)
    • 图上两头都是字母 (m, n)。
    • 转关系模式时,菱形必须变成一张独立的表
    • 如果有挂在菱形上的椭圆(如“购买数量”),这个属性就直接进这张新表。

练习题 1:经典组合 (1:n 与 m:n)

场景:医院管理系统

  • 医生 (Doctor):编号 (Dno)、姓名 (Name)、职称 (Title)
  • 科室 (Dept):科室号 (DeptNo)、名称 (Dname)、位置 (Loc)
  • 病人 (Patient):病历号 (Pno)、姓名 (Pname)、性别 (Sex)
  • 业务规则
    1. 一个科室有多名医生,一名医生只能属于一个科室。
    2. 医生和病人之间是治疗关系:一名医生可以治疗多名病人,一名病人也可以找多名医生看病。
    3. 治疗时需要记录“诊断日期”和“病情描述”。

请完成:

  1. 描述 E-R 图结构(谁连谁,是几对几)。
  2. 重点:写出转换后的关系模式(指出主键、外键)。

【练习题 1 答案】

1. E-R 结构:

  • 科室 (1) —— <属于> —— (n) 医生
  • 医生 (m) —— <治疗> —— (n) 病人 (属性:诊断日期、病情描述)

2. 关系模式:

  • 科室 (DeptNo, Dname, Loc)
  • 病人 (Pno, Pname, Sex)
  • 医生 (Dno, Name, Title, DeptNo)
    • 解析 (1:n):医生是“多”的一端,所以把科室的主键 DeptNo 拿过来做外键。不能建一个“科室医生表”。
  • 治疗 (Dno, Pno, 诊断日期, 病情描述)
    • 解析 (m:n):多对多必须建新表。主键是双方主键的组合。

练习题 2:难点 (1:1 的处理)

场景:公司资产管理

  • 员工 (Emp):工号 (Eno)、姓名 (Ename)、手机 (Tel)
  • 电脑 (PC):资产编号 (PCno)、品牌 (Brand)、型号 (Model)
  • 办公室 (Office):房间号 (RoomNo)、面积 (Area)
  • 业务规则
    1. 分配电脑:为了安全,公司规定一台电脑只能分配给一名员工使用,一名员工也只能领用一台电脑。(1:1)
    2. 所属部门:一个办公室里可以坐多名员工,一名员工只能在一个办公室工作。(1:n)

请完成:

  1. 写出转换后的关系模式。
  2. 思考题:在处理“员工”和“电脑”的 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 放在员工表里。

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)
    2. 下单:一个用户可以下多个订单,一个订单只属于一个用户。(1:n)
    3. 包含:一个订单里包含多种商品,一种商品也可以出现在多个订单里。(m:n) 注意: 包含关系还需要记录“购买数量”。

请完成:

  1. 写出转换后的所有关系模式(应该有几个表?)。

【练习题 3 答案】

应该有 5 个表(其中 m:n 产生 1 个,1:1 和 1:n 均不产生新表)。

  1. 用户 (Uid, Nick, Balance)
  2. 会员卡 (Cno, Level, Expire, Uid)
    • 解析 (1:1):把用户ID放在会员卡里。因为通常是“先有人,后办卡”,卡是依附于人的。
  3. 商品 (Ino, Iname, Price)
  4. 订单 (Ono, Total, Time, Uid)
    • 解析 (1:n):订单是“多”的一端(一个用户很多订单),所以订单表里存 Uid
  5. 订单详情/包含 (Ono, Ino, 购买数量)
    • 解析 (m:n):订单和商品是多对多。这张表就是我们在电商后台常见的 Order_Detail 表,必须独立存在。

画四个矩形,引出各自的属性椭圆:

  • [用户]:(ID, 昵称…)

  • [会员卡]:(卡号, 等级…)

  • [订单]:(订单号, 总价…)

  • [商品]:(商品号, 单价…)

  • 联系 A:持有 (1:1)

    • 连接 [用户][会员卡],中间菱形写 <持有>
    • 两边连线分别标记 11
  • 联系 B:下单 (1:n)

    • 连接 [用户][订单],中间菱形写 <下单>
    • [用户] 侧写 1[订单] 侧写 n(一个用户下多个单)。
  • **联系 C:包含 (m:n) **

    • 连接 [订单][商品],中间菱形写 <包含>
    • [订单] 侧写 m[商品] 侧写 n(或相反,总之两边都是字母,表示多对多)。
    • 关键点:题目中有一个属性叫 “购买数量”。这个属性不能挂在[订单]上(因为订单里有不同商品,数量不一样),也不能挂在[商品]上(因为库存和购买量是两码事)。
    • 画法:从 <包含> 这个菱形上引出一根线,连一个椭圆,里面写 (购买数量)

👉 点击这里阅读下一篇:《分解判断专题》


Author: linda1729
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source linda1729 !
评论
  TOC