跳到正文

第5章学习笔记:概念建模、函数依赖与范式

课程笔记

从业务语义建立 ER 模型,再用依赖与无损分解控制冗余和异常。

关联:章节 第5章 概念建模、函数依赖与范式

第5章笔记:概念建模、函数依赖与范式

本章不是七个并列名词

从业务语义建立 ER 模型,再用依赖与无损分解控制冗余和异常。 学习顺序从《实体、值对象与关系》开始,到《无损连接与依赖保持》闭合。每一节都要留下下一节能直接使用的对象:模式、关系、查询结果、页、计划、事务状态、日志记录或部署证据。若你只能逐条背定义,却说不清前一节输出怎样成为后一节输入,这一章还没有真正连起来。

七节依赖与例题

1. 实体、值对象与关系

要解决的问题: 实体有独立身份和值生命周期,值对象由属性共同定义,关系表达参与约束;建模不是把需求名词逐个变表。

跟着做: 收货地址可能是订单快照值而非共享地址实体,因为历史订单必须保留当时文本,不随用户地址簿更新。

验收规则: 用身份、生命周期、共享更新和历史追溯四问判断是否独立成实体。

2. 基数、参与约束与弱实体

要解决的问题: 一对一、一对多、多对多只描述上界,还要声明最小参与数;弱实体的身份依赖拥有者键。

跟着做: 订单至少有一个订单项,订单项必须属于恰好一个订单;(order_id,line_no) 共同标识订单项。

验收规则: min..max 基数必须能映射为主键、唯一、外键、非空或事务级断言。

3. 从 ER 图映射到关系模式

要解决的问题: 实体通常映射为表,多对多关系映射为连接表,复合和多值属性需要拆解;继承映射要权衡稀疏、连接与约束。

跟着做: 学生与课程的多对多经 enrollment 表承载 semester、score 等关系属性,不能把课程列表塞进字符串列。

验收规则: 映射完成后逐项验证实体身份、关系基数和删除语义没有丢失。

4. 函数依赖与属性闭包

要解决的问题: 函数依赖 X→Y 是对所有合法实例的语义承诺,不是对当前样本的偶然观察;闭包用于找键和判断蕴含。

跟着做: 在教学班中 (course_id,term,section)→teacher,但 course_id→teacher 通常不成立;用反例构造检验。

验收规则: X⁺ 从 X 开始反复应用可用依赖直到不再新增;若 X⁺ 包含全部属性则 X 是超键。

5. 最小覆盖与候选键

要解决的问题: 最小覆盖把右部拆为单属性、消去左部冗余和冗余依赖;候选键必须在超键基础上继续做最小性检查。

跟着做: 对 F={A→BC,B→C,AB→D},先拆右部,再判断 A→C 是否可由 A→B 与 B→C 推得。

验收规则: 删除一条依赖后若其右部仍在左部闭包中,该依赖冗余。

6. 2NF、3NF 与 BCNF

要解决的问题: 范式逐级约束非主属性对键的部分依赖、传递依赖以及决定因素是否为超键;选择范式要保留语义解释。

跟着做: 选课表若同时存 student_name 与 course_name,会因键 (student_id,course_id) 的部分依赖产生更新异常,应拆实体信息。

验收规则: 3NF 允许右部为主属性的特例;BCNF 要求每个非平凡依赖的左部都是超键。

7. 无损连接与依赖保持

要解决的问题: 分解不仅要减少冗余,还要保证自然连接不制造伪元组,并尽量让依赖可在单表局部检查。

跟着做: R(A,B,C) 按 R1(A,B)、R2(B,C) 分解时,若 B→A 或 B→C 可保证二元分解无损。

验收规则: 二元分解 R→R1,R2 无损当 (R1∩R2)→R1 或 →R2 在 F⁺ 中成立。

章内共同推理方法

先写“一行或一个状态代表什么”,再写它必须满足的键、约束、顺序或故障假设。遇到 SQL,先定结果粒度和重复/NULL 语义,再编码;遇到存储与优化,先估算页数、基数和 I/O,再看真实执行计划;遇到事务与分布式,先画时间线和允许历史,再讨论隔离级别、日志或共识。任何公式都要带单位、数据分布和适用边界。

可复现练习

从本章七个例题中任选两个,用 SQLite 或课程给定模型从空环境重做。保存建表/输入、执行步骤、实际输出和断言;随后故意加入一个重复键、NULL、并发交错、崩溃点、倾斜分布或网络分区,记录第一个被破坏的不变量。只截成功界面、只贴 SQL 或只报告耗时不算完成。

闭卷验收

用十分钟画出本章七节箭头图;任选一条箭头解释传递的具体字段、状态或证据。再为《无损连接与依赖保持》写一个最小失败案例,并追溯它需要《实体、值对象与关系》中的哪条定义才能修复。最后列出三道题:一道唯一答案判断、一道多条件选择、一道必须计算或写 SQL/状态轨迹的问题,且每题都写清为什么其他答案错。