第2章学习笔记:关系模型与关系代数
课程笔记把表提升为集合与逻辑对象,用代数推演查询含义并为优化奠定基础。
关联:章节 第2章 关系模型与关系代数
第2章笔记:关系模型与关系代数
本章不是七个并列名词
把表提升为集合与逻辑对象,用代数推演查询含义并为优化奠定基础。 学习顺序从《关系、元组、属性与域》开始,到《从自然语言翻译成关系代数》闭合。每一节都要留下下一节能直接使用的对象:模式、关系、查询结果、页、计划、事务状态、日志记录或部署证据。若你只能逐条背定义,却说不清前一节输出怎样成为后一节输入,这一章还没有真正连起来。
七节依赖与例题
1. 关系、元组、属性与域
要解决的问题: 关系是同构元组的有限集合,属性名决定语义位置,域限制可能取值;理论关系没有重复元组和固定行序。
跟着做: R(student_id, course_id, score) 中一行是元组,score 的域可限制为 0 到 100;交换展示顺序不改变关系。
验收规则: n 元关系 R 是域 D1×…×Dn 的有限子集。
2. 候选键、主键与外键
要解决的问题: 候选键要求唯一且最小,主键只是被选中的候选键;外键表达两个关系之间的引用承诺。
跟着做: 用户既有 user_id 又有唯一 email,二者都可能是候选键;订单用 user_id 外键引用用户,不能用姓名替代稳定身份。
验收规则: K 是候选键当且仅当 K→全部属性,且 K 的任一真子集都不具有该性质。
3. 选择与投影
要解决的问题: 选择按谓词保留行,投影按属性保留列并在关系语义下去重;先做选择常减少后续处理量。
跟着做: 从选课关系中取 score≥90 的记录,再投影 course_id,可得到有高分学生的课程集合。
验收规则: σ_p(R) 过滤元组,π_A(R) 过滤属性;若谓词只依赖 R,可把 σ 下推到连接之前。
4. 连接不是把两张表随便拼起来
要解决的问题: 连接由笛卡尔积加匹配条件构成;等值连接、自然连接和外连接对列与缺失行的处理不同。
跟着做: 学生与选课按 student_id 连接得到姓名和成绩;漏写条件会产生人数乘选课数的组合爆炸。
验收规则: R ⋈_θ S = σ_θ(R×S),连接输出规模上界为 |R|·|S|。
5. 集合运算与除法
要解决的问题: 并、交、差要求并相容;关系除法表达‘对所有’条件,是双重 NOT EXISTS 的代数原型。
跟着做: 找修完培养方案中全部必修课的学生:用 enrollment(student,course) 除以 required(course)。
验收规则: R(X,Y) ÷ S(Y) 返回满足 ∀y∈S, (x,y)∈R 的全部 x。
6. 重命名与复杂查询树
要解决的问题: 重命名解决自连接和属性歧义,复杂表达式应画成查询树逐层核对输入输出模式。
跟着做: 员工表自连接比较员工与经理,必须把两份 employee 分别重命名为 e 与 m,再按 e.manager_id=m.id 连接。
验收规则: 查询树每个节点都应标注输出属性和估算基数,避免投影过早丢失连接列。
7. 从自然语言翻译成关系代数
要解决的问题: 翻译应先锁定最终输出,再找证据关系和量词,最后选择、连接、聚合或差;不能见名词就机械连表。
跟着做: ‘找从未挂科的学生’可先得到挂科学生集合,再用全部学生差去该集合,而不是筛 score≥60 后直接投影。
验收规则: 否定存在常写成集合差:All − π_key(σ_bad(Evidence))。
章内共同推理方法
先写“一行或一个状态代表什么”,再写它必须满足的键、约束、顺序或故障假设。遇到 SQL,先定结果粒度和重复/NULL 语义,再编码;遇到存储与优化,先估算页数、基数和 I/O,再看真实执行计划;遇到事务与分布式,先画时间线和允许历史,再讨论隔离级别、日志或共识。任何公式都要带单位、数据分布和适用边界。
可复现练习
从本章七个例题中任选两个,用 SQLite 或课程给定模型从空环境重做。保存建表/输入、执行步骤、实际输出和断言;随后故意加入一个重复键、NULL、并发交错、崩溃点、倾斜分布或网络分区,记录第一个被破坏的不变量。只截成功界面、只贴 SQL 或只报告耗时不算完成。
闭卷验收
用十分钟画出本章七节箭头图;任选一条箭头解释传递的具体字段、状态或证据。再为《从自然语言翻译成关系代数》写一个最小失败案例,并追溯它需要《关系、元组、属性与域》中的哪条定义才能修复。最后列出三道题:一道唯一答案判断、一道多条件选择、一道必须计算或写 SQL/状态轨迹的问题,且每题都写清为什么其他答案错。