Skip to content
难度案例
建议时长45分钟

4.3.3 综合案例分析

本课核心知识点整理
本课核心知识点手绘流程图(SVG)

这节课的重点:把规则落到案例里

前两节讲的是数据库设计题的总体套路,这一节开始进入综合案例:从题干中找联系、补 E-R 图、补关系模式、写主键外键,并判断规范化问题。

课堂里的案例涉及部门、员工、经理、客户、预定申请、业务员、客房等对象。它看起来像酒店预定系统,也穿插了企业人事关系;真正要训练的是同一套能力:看懂题干语义,而不是背某个系统的固定答案

联系怎么找:从数量词入手

题干里的“每个”“多个”“唯一”“只属于”是判断联系类型的关键。

题干描述实体联系类型解释
每个部门可以有多名员工,一个员工只能属于一个部门部门、员工1:n部门端为 1,员工端为 n
每个部门只有一名经理负责管理本部门部门、经理1:1一个部门对应一个经理,经理管理本部门
一名客户可以有多个预定申请,一个预定申请只对应唯一客户客户、预定申请1:n客户端为 1,预定申请端为 n
业务员根据预定申请安排入住客房业务员、预定申请、客房三元联系“安排”动作需要三者同时参与
部门属于员工1n
<rect x="55" y="140" width="92" height="48" rx="6" fill="#f3f0ff"/> <text x="101" y="170" text-anchor="middle" stroke="none">部门</text> <polygon points="245,164 285,134 325,164 285,194" fill="#fff5e6"/> <text x="285" y="170" text-anchor="middle" stroke="none">管理</text> <rect x="425" y="140" width="92" height="48" rx="6" fill="#f3f0ff"/> <text x="471" y="170" text-anchor="middle" stroke="none">经理</text> <line x1="147" y1="164" x2="245" y2="164"/> <line x1="325" y1="164" x2="425" y2="164"/> <text x="190" y="152" stroke="none">1</text> <text x="372" y="152" stroke="none">1</text> <rect x="640" y="50" width="98" height="48" rx="6" fill="#eef8ed"/> <text x="689" y="80" text-anchor="middle" stroke="none">业务员</text> <rect x="640" y="245" width="98" height="48" rx="6" fill="#eef8ed"/> <text x="689" y="275" text-anchor="middle" stroke="none">客房</text> <rect x="785" y="148" width="98" height="48" rx="6" fill="#eef8ed"/> <text x="834" y="178" text-anchor="middle" stroke="none">预定申请</text> <polygon points="690,172 735,137 780,172 735,207" fill="#fff5e6"/> <text x="735" y="178" text-anchor="middle" stroke="none">安排</text> <line x1="696" y1="98" x2="728" y2="140"/> <line x1="696" y1="245" x2="728" y2="205"/> <line x1="780" y1="172" x2="785" y2="172"/> <text x="703" y="130" stroke="none">1</text> <text x="704" y="226" stroke="none">n</text> <text x="785" y="160" stroke="none">n</text> <text x="735" y="318" text-anchor="middle" stroke="none" font-weight="700">三元联系:业务员根据申请安排客房</text> 

三元联系“安排”为什么不能随便拆

“业务员安排客房”和“预定申请包含客房”分开看,好像也能画成两个二元联系。但题干强调的是:业务员根据某个预定申请来安排入住客房。一次安排同时绑定了业务员、申请和客房;拆开后容易丢失“哪名业务员针对哪份申请安排了哪间客房”这个整体事实。

所以考试中遇到三方共同构成一个业务动作时,应优先考虑三元联系。多重度如果分值很低,不必耗费过多时间;但要知道基本分析方法:

分析角度问题可能结论
以业务员为中心一名业务员能处理几个申请、几间客房?可为多个
以预定申请为中心一个申请能安排几间客房?由几名业务员处理?客房可多,业务员通常唯一
以客房为中心一间客房在一次安排中对应几份申请?语义上通常唯一

关系模式怎么补:先题干,再归并

员工关系中的部门号

题干可能说:员工信息包含员工号、姓名、岗位、电话、工资。乍看员工关系已经完整,但如果题目留空,还要检查联系归并。因为“部门与员工是一对多”,一端部门的主键会并入多端员工,因此员工关系中常补 部门号

text
部门(部门号, 部门名, ...)
员工(员工号, 姓名, 岗位, 电话, 工资, 部门号)

这里 部门号 同时体现两个含义:它记录员工属于哪个部门;它也是员工关系参照部门关系的外键。

安排关系中的三端主键

三元联系独立转换为关系模式时,通常会并入三端实体的主键。若题干说明安排还具有入住时间、离店时间等属性,这些属性也进入安排关系。

text
安排(业务员号, 申请号, 客房号, 入住时间, 离店时间, ...)

主键要以题干为准。如果题干说 客房号身份证号入住时间 能唯一标识一次安排,就按这组属性写组合主键;不要机械地把所有外键都当成组合主键。

主键、外键写法

关系主键判断外键判断
部门部门号 通常唯一标识部门视题干而定
员工员工号 唯一标识员工部门号 参照部门
预定申请申请号 唯一标识申请客户号 参照客户
安排由题干指定的一组属性唯一标识业务员号申请号客房号 等分别参照对应关系

外键写法的一个细节是:外键必须写当前关系中的属性名。比如安排关系里写 业务员号,而不是笼统写“业务员表主键”。

规范化问题:客房类型与收费标准

字幕里的规范化示例是客房关系。假设有:

text
客房(客房号, 客房类型, 收费标准, 入住状态)

题干说 客房号 唯一标识客房,又说“不同房型具有不同的收费标准”。于是依赖关系是:

text
客房号 -> 客房类型
客房类型 -> 收费标准

合起来就是:

text
客房号 -> 客房类型 -> 收费标准

这表示非主属性 收费标准 通过非主属性 客房类型 传递依赖于主键 客房号。问题后果包括收费标准冗余、更新异常、插入异常和删除异常。

异常会发生什么
数据冗余同一房型的收费标准在许多客房记录中重复出现
更新异常调整某房型价格时必须改多行,漏改就不一致
插入异常新增一种房型但还没有客房时,可能无法记录收费标准
删除异常删除某房型最后一间客房时,收费标准也丢失

合理拆分方式:

text
客房类型(客房类型, 收费标准)
客房(客房号, 客房类型, 入住状态)

注意第二个关系中仍要保留 客房类型。否则客房表和客房类型表就无法连接,拆分虽然消除了冗余,却破坏了信息可还原性。

答题时写多长

规范化解释题常写“100 字以内”。这不是要求你必须写满 100 字,而是限制你别写太长。评分通常按关键点给分,例如:

text
存在。客房号决定客房类型,客房类型决定收费标准,收费标准对主键存在传递依赖,导致冗余和更新异常。可拆为客房(客房号, 客房类型, 入住状态)和客房类型(客房类型, 收费标准)。

这类答案不长,但包含了判断、依赖原因、异常结果和修改方案。

例题

单选
“一个部门可以有多名员工,一个员工只能属于一个部门”对应的联系类型是:
单选
部门与员工是一对多联系时,员工关系中常并入的属性是:
单选
若客房号决定客房类型,客房类型又决定收费标准,则主要规范化问题是:
单选
“安排”被建模为三元联系,主要原因是:

自查要点

  1. 为什么“安排”可以作为业务员、预定申请、客房之间的三元联系?
  2. 员工关系中补 部门号 时,它来自题干直接属性还是联系归并?
  3. 安排关系的组合主键和外键写法有什么区别?
  4. 客房关系拆分时为什么不能漏掉 客房类型
  5. 规范化解释题如何用短答案命中“判断、原因、修改”三个得分点?