MySQL学习笔记五

MySQL 学习进度笔记

版本日期:2026-10-12

用途:在新聊天中上传或粘贴本文件后,请根据本笔记继续 MySQL 学习,不要从头开始。

============================================================

一、学习方式与批改要求

============================================================

  1. 使用中文讲解 MySQL,尽量结合具体业务表和数据例子。

  2. 采用循序渐进、一次一道题的练习方式。

  3. 出题后先等待我作答,不要提前公布答案。

  4. 我提交答案后,请:

  • 按 10 分制评分;

  • 明确指出正确答案;

  • 分析我的思路哪里正确、哪里有问题;

  • 解释所有选项,不要只解释正确选项;

  • 给出可以记住的判断方法;

  • 更新累计成绩;

  • 总结当前薄弱点,并据此安排下一题。

  1. 如果一道题分成多个步骤,应按步骤逐个进行;我回答当前步骤后再批改,不要跳到后续步骤。

  2. 我有时能够正确复述定义,但在应用到题目时容易混淆概念。因此批改时请特别检查"定义是否真正应用到题目条件"。

  3. 新聊天中如发现累计分数存在算术错误,请以本笔记中的明细重新计算,并说明更正,不要沿用错误总分。

============================================================

二、总体学习进度

============================================================

已知学习过或练习过的主题:

  • JOIN(第六课练习曾进行逐题批改)

  • 子查询(曾继续子查询练习)

  • 事务(第十课事务练习)

  • 数据库设计与规范化(第十二课)

  • 函数依赖、属性闭包、候选键、部分函数依赖、传递函数依赖、第三范式(3NF)

注意:

目前可确认的详细知识点和题目成绩主要集中在第十二课。更早课程的每一课具体题目、完整分数及全部知识点没有完整保存在本笔记上下文中;不要凭空编造历史成绩或题目内容。若需要补充早期课程细节,请以我之后提供的旧笔记为准。

============================================================

三、第十二课:数据库设计与规范化

============================================================

已完成题目:

  • 第12课题1---15:143/150 分。

  • 题16是分步骤题:

  • 16.1 确定候选键:10/10。

  • 16.2 判断部分函数依赖:6/10。

  • 16.3 判断传递函数依赖:4/10。

  • 函数依赖方向专项练习第1题:10/10。

根据上述明细,当前可核算的累计成绩为:

143 + 10 + 6 + 4 + 10 = 173 分;

总分为 150 + 10 + 10 + 10 + 10 = 190 分;

即 173/190,约 91.1%。

重要:此前一次批改曾把该成绩写成 173/180,这是分母计算错误。正确分母应为 190。后续请从 173/190 继续累计,并保留上面的分项记录。

当前进度:

  • 第12课题1---15已完成。

  • 题16的三个步骤已完成。

  • 函数依赖方向专项练习第1题已完成。

  • 下一步建议继续练习复合候选键、部分函数依赖与传递函数依赖的区分;继续一次一道题,答后再批改。

============================================================

四、已掌握的核心概念

============================================================

  1. 函数依赖(Functional Dependency)

若属性或属性组 X 的值能够唯一确定属性 Y 的值,记为 X → Y。

依赖方向很重要:X → Y 不代表 Y → X。不能仅因为 X 能确定 Y,就反推 Y 能确定 X。

  1. 属性闭包(Attribute Closure)

X+ 表示在给定函数依赖集合下,能够由 X 推导出的全部属性。

判断 X 是否为超键,可以计算 X+:

  • 若 X+ 覆盖关系中的全部属性,则 X 是超键。

  • 若 X 还是最小的,即删除 X 中任何属性后都不能继续决定全部属性,则 X 是候选键。

  1. 超键与候选键
  • 超键:能够唯一确定表中的一条记录的属性集。

  • 候选键:满足唯一标识能力,并且具有最小性(不能再删除其中属性)。

  • 主键通常从候选键中选出。

  • 单字段候选键的最小性通常较容易判断,但仍要确认它能否决定表中的所有属性。

  1. 主属性与非主属性
  • 主属性:至少属于一个候选键的属性。

  • 非主属性:不属于任何候选键的属性。

判断 2NF、3NF 时,需要区分主属性和非主属性。

  1. 部分函数依赖

部分函数依赖与复合候选键有关:非主属性只依赖于复合候选键的真子集,而不是依赖整个候选键。

关键判断:

  • 必须先确认候选键。

  • 若候选键只有一个字段,就没有可拆分的真子集,因此不存在部分函数依赖。

  • 存在普通函数依赖,不等于存在部分函数依赖。

  • 复合候选键只是意味着"需要检查是否存在部分依赖",不代表一定存在部分依赖。

  1. 传递函数依赖

常见判断模式:

候选键 X → 非候选键属性 A → 非主属性 B。

如果候选键通过一个非候选键属性间接决定非主属性,就需要检查传递函数依赖。

单字段候选键也可能存在传递函数依赖;"没有部分依赖"不等于"没有传递依赖"。

  1. 第二范式(2NF)与第三范式(3NF)
  • 2NF重点检查非主属性是否部分依赖于候选键。

  • 3NF需要进一步检查传递依赖等情况。

  • 不能因为一张表的候选键只有一个字段,就认定它自动满足3NF。

  • 当公会名称依赖于公会编号,而玩家记录通过公会编号关联公会名称时,可能产生传递函数依赖。

============================================================

五、已练习题目与错题记录

============================================================

【第12课题15:候选键与2NF/3NF】

题目业务规则:

每个玩家最多加入一个公会;

userId → userName, guildId;

guildId → guildName;

joinTime 表示加入当前公会的时间。

用户答案:B。

成绩:4/10。正确答案:C。

关键教训:

  • 候选键是 userId。

  • userId 是单字段候选键,因此不存在部分函数依赖。

  • 但 userId → guildId → guildName 形成传递函数依赖。

  • 单字段候选键并不自动保证3NF。

  • 需要区分2NF的部分依赖问题与3NF的传递依赖问题。

【第12课题16:装备表分步骤题】

表结构:

PlayerEquip(userId, equipId, equipTypeId, equipName, strengthLevel)

业务规则:

  • 每件装备实例有唯一 equipId。

  • 每件装备属于一个玩家。

  • equipId → userId, equipTypeId, strengthLevel。

  • equipTypeId → equipName。

  • 没有给出其他函数依赖。

步骤16.1:确定候选键

用户答案:C(equipId)。

成绩:10/10。

结论:equipId 是候选键,因为它能够唯一确定该装备实例的其他属性。

步骤16.2:判断部分函数依赖

用户答案:A(存在,因为 equipTypeId 可以确定 equipName)。

成绩:6/10。该选项错误。

正确理解:

  • equipId 是单字段候选键,没有可拆分的真子集,所以不存在部分函数依赖。

  • equipTypeId → equipName 是普通函数依赖,不是部分函数依赖。

  • 先确认候选键,再判断部分依赖,不能把任意普通函数依赖都叫作部分依赖。

步骤16.3:判断传递函数依赖

用户答案:C。

成绩:4/10。正确答案:B。

正确依赖链:

equipId → equipTypeId → equipName。

错误选项C假设 userId → equipId,但题目只给出了 equipId → userId,不能反转方向。

结论:equipName 通过 equipTypeId 传递依赖于候选键 equipId。

重要提醒:函数依赖方向不可随意反推。

【函数依赖方向专项练习第1题】

表:

PlayerGuild(userId, userName, guildId, guildName)

已知:

userId → userName, guildId;

guildId → guildName。

用户答案:B,得分10/10。

用户的分析包括:

  • userId 是候选键,因为 userId 的属性闭包覆盖表中全部属性,且它是单字段键。

  • 依赖链为 userId → guildId → guildName。

  • guildName → guildId 和 guildId → userId 均不能从已知依赖中反推。

  • guildName 通过 guildId 传递依赖于 userId,违反3NF。

  • 可将公会信息拆分到独立的公会表中。

补充严谨表述:

从传递性可推导出 userId → guildName,所以不要说数学意义上"userId 无法决定 guildName"。更准确的说法是:guildName 通过非候选键属性 guildId 传递依赖于 userId。

============================================================

六、当前薄弱点与答题检查清单

============================================================

薄弱点:

  1. 有时能够说出定义,但在题目应用时混淆普通函数依赖与部分函数依赖。

  2. 容易把"单字段候选键不存在部分依赖"误认为"没有传递依赖"。

  3. 必须特别检查函数依赖箭头方向,不能反推。

  4. 需要熟练区分2NF与3NF的检查重点。

每道依赖判断题,建议按以下顺序分析:

第一步:列出题目明确给出的所有函数依赖,不添加题目没有给出的依赖。

第二步:求候选键或属性闭包,确认候选键。

第三步:标记主属性与非主属性。

第四步:判断候选键是单字段还是复合字段。

第五步:若是复合候选键,检查是否有非主属性依赖于候选键的真子集(部分依赖)。

第六步:检查是否存在"候选键 → 非候选键属性 → 非主属性"的传递链。

第七步:根据题目问的是候选键、部分依赖、传递依赖、2NF还是3NF,选择对应结论。

答题时可使用模板:

  1. 候选键是:____,因为其属性闭包为 ____。

  2. 已知依赖链是:____ → ____ → ____。

  3. 依赖方向不能反转,因此不能推出 ____ → ____。

  4. 该依赖属于:普通函数依赖 / 部分函数依赖 / 传递函数依赖。

  5. 对范式的影响是:____,理由是 ____。

============================================================

七、下一步学习安排

============================================================

下一次聊天请从以下内容继续:

"第12课函数依赖方向与部分/传递函数依赖专项练习第2题"。

要求:

  • 先出一道题,不公布答案。

  • 题目最好使用复合候选键,让我练习判断部分函数依赖;同时可以设置另一条依赖链用于区分传递依赖。

  • 等我作答后再按10分制批改。

  • 解释所有选项。

  • 更新累计成绩:当前基准为173/190,约91.1%。

  • 持续记录错题、正确思路和薄弱点。

  • 不要因为我能复述定义就默认我已掌握;要看我是否能正确应用到具体依赖关系。

============================================================

八、给新聊天的启动指令

============================================================

请先读取并理解这份《MySQL 学习进度笔记》,把它作为本次学习的进度依据。不要从头讲课,也不要重复已经完成的题目。请从"第12课函数依赖方向与部分/传递函数依赖专项练习第2题"开始,一次只出一道题,等我回答后再批改,按10分制评分、解释全部选项、更新累计成绩和薄弱点。

当前累计成绩:173/190(约91.1%)。

相关推荐
这个DBA有点耶6 小时前
从时间到语义:时序数据库与向量数据库的核心机制、选型与多模融合趋势
数据库·mysql·架构
SL_staff6 小时前
考勤同步工资核算总出错?破解企业级精准自动化的三个刚性支点
mysql·github·全栈
毕业设计7037 小时前
(免费领源码)基于node的学生公寓管理系统06412- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
vue.js·mysql·node.js·maven·mybatis·express·b/s
太理摆烂哥7 小时前
MySQL库的操作
数据库·mysql
Dxy12393102169 小时前
MySQL JSON 生成列索引原理、实战与坑点
mysql·adb·json
wno70410 小时前
MYSQL 常用合并函数
android·数据库·mysql
for_ever_love__11 小时前
LangGraph State 设计:多节点之间怎么安全地共享数据
redis·mysql·状态模式·checkpoint·state·状态图·langgraph
codeejun13 小时前
每日一Go·MySQL-7、MySQL 核心原理全景图谱
开发语言·mysql·golang
minebmw713 小时前
第 04 讲 深入浅出索引(上):B+树索引的数据结构与查询过程
mysql