【数据库技术】第一范式(1NF)与第二范式(2NF)
考点频率★★★★★数据库必考选择题常考1NF/2NF的判断下午题常考模式分解难度⭐⭐⭐⭐建议重点掌握1NF的定义与判断、2NF的判断方法是否存在部分函数依赖以及从1NF到2NF的分解规则1️⃣ 范式是什么范式Normal FormNF是关系数据库规范化过程中用于衡量关系模式“好与坏”的标准。范式的级别越高数据冗余越小异常越少。打个比方范式就像“房屋质量等级”。1NF是“能住人”最基础2NF是“结构稳定”3NF是“精装修”。每一级都在上一级的基础上改进。规范化就是将低一级范式的关系模式通过模式分解转化为高一级范式的过程。本节学习目标1NF消除“属性不可再分”的问题最基础的合格线2NF消除“部分函数依赖”的问题让表更聚焦2️⃣ 第一范式1NFFirst Normal Form2.1 定义第一范式1NF要求关系中的每个属性都是原子的、不可再分的。这是关系模型的基本要求——任何关系型数据库中的表默认都满足1NF只要你没有把多个值塞到一个字段里。2.2 什么样的设计违反1NF错误设计违反1NF问题正确设计满足1NF学生表学号, 姓名, 电话列表其中电话列表 138..., 139...一个属性包含多个值不可再分拆分为多行或另建电话表员工表员工号, 姓名, 地址其中地址 安徽省合肥市包河区地址包含省、市、区可进一步细分拆分为省、市、区三个属性如果业务需要按地区查询示例❌ 违反1NF 学生表 | 学号 | 姓名 | 电话号码 | |------|------|---------------| | 001 | 张三 | 1381111,1392222 | ← 一个字段存了多个值 ✅ 满足1NF方案一拆行 | 学号 | 姓名 | 电话号码 | |------|------|----------| | 001 | 张三 | 1381111 | | 001 | 张三 | 1392222 | ✅ 满足1NF方案二拆列 | 学号 | 姓名 | 电话1 | 电话2 | |------|------|---------|---------| | 001 | 张三 | 1381111 | 1392222 |软考重点1NF的判断标准很简单——看每个格子是否都只存了“一个值”。如果某个字段存了多个值如逗号分隔的列表就违反1NF。大多数关系数据库表天然满足1NF因为SQL标准不支持在单列中存储多值集合。2.3 满足1NF后还存在什么问题即使满足1NF如果一张表的主键是组合键仍可能存在数据冗余和异常。先回顾一个之前用过的例子选课表学号, 课程号, 成绩, 姓名, 班级号主键为(学号, 课程号)学号课程号成绩姓名班级号001C0185张三101001C0290张三101002C0178李丽102这张表满足1NF吗✅ 满足每个格子只有一个值。但它仍有数据冗余——姓名和班级号在001的三条选课记录中重复了三次。为什么会这样因为姓名和班级号只依赖于主键的一部分学号而不是整个主键(学号, 课程号)。这就是部分函数依赖也是2NF要解决的问题。3️⃣ 第二范式2NFSecond Normal Form3.1 定义第二范式2NF在1NF的基础上要求每一个非主属性都完全函数依赖于候选键不允许存在非主属性对候选键的部分函数依赖。通俗理解一张表的主键如果是组合键那么所有非主属性必须依赖于整个组合键不能只依赖于组合键中的一部分。如果主键是单一属性该表自动满足2NF因为不存在“部分依赖”的可能性。3.2 判断步骤判断一个关系模式是否满足2NF按以下步骤进行步骤操作第1步确认该关系满足1NF第2步找出所有的候选键可能是组合键第3步找出所有的非主属性第4步检查每个非主属性是否完全依赖于候选键第5步如果存在非主属性只依赖于候选键的一部分→ 违反2NF否则满足2NF3.3 典型反例选课表关系模式选课表学号, 课程号, 成绩, 姓名, 班级号候选键学号, 课程号非主属性成绩、姓名、班级号函数依赖(学号, 课程号) → 成绩✅ 完全依赖学号 → 姓名❌ 姓名只依赖学号是部分函数依赖学号 → 班级号❌ 班级号只依赖学号是部分函数依赖结论存在非主属性姓名、班级号对候选键的部分函数依赖 →不满足2NF。3.4 如何从1NF提升到2NF模式分解将违反2NF的表拆分成多张表消除部分函数依赖原表不满足2NF选课表学号, 课程号, 成绩, 姓名, 班级号分解为两张表选课表学号, 课程号, 成绩—— 描述“谁选了哪门课、得了多少分”学生表学号, 姓名, 班级号—— 描述“学生的基本信息”分解后的依赖关系选课表候选键(学号, 课程号)非主属性成绩完全依赖(学号, 课程号)✅学生表候选键学号非主属性姓名、班级号完全依赖学号✅两张表都满足2NF。4️⃣ 1NF vs 2NF 对比总结对比项第一范式1NF第二范式2NF基本要求属性不可再分原子性1NF 消除部分函数依赖关键检查每个格子是否只有一个值非主属性是否完全依赖整个主键组合键时主键为单一属性时需满足自动满足2NF主键为组合键时需满足需要检查每个非主属性是否依赖整个组合键违反后果无法用关系模型表示数据冗余、插入/删除/修改异常解决方法拆分属性或拆分行模式分解将表拆成多张表5️⃣ 经典例题例题1关系模式R(A,B,C,D)R(A, B, C, D)R(A,B,C,D)函数依赖集F{(A,B)→C,A→D}F \{ (A, B) \rightarrow C, A \rightarrow D \}F{(A,B)→C,A→D}。则RRR满足 。A. 1NF但不满足2NFB. 2NF但不满足3NFC. 3NFD. BCNF解析候选键为(A,B)(A, B)(A,B)非主属性CCC和DDD(A,B)→C(A, B) \rightarrow C(A,B)→C完全依赖 ✅A→DA \rightarrow DA→DDDD只依赖候选键的一部分AAA存在部分函数依赖❌因此RRR满足1NF但不满足2NF。选A。例题2关系模式R(A,B,C)R(A, B, C)R(A,B,C)函数依赖集F{A→B,B→C}F \{ A \rightarrow B, B \rightarrow C \}F{A→B,B→C}。则RRR的主键是 它是否满足2NFA.AAA满足2NFB.(A,B)(A, B)(A,B)不满足2NFC.AAA不满足2NFD.(A,B)(A, B)(A,B)满足2NF解析候选键是AAAAAA能决定所有属性A→BA \rightarrow BA→BA→CA \rightarrow CA→C通过传递主键是单一属性不存在“部分函数依赖”的问题部分依赖只会出现在组合键中因此RRR满足2NF但不满足3NF因为有传递依赖A→B→CA \rightarrow B \rightarrow CA→B→C选A。6️⃣ 记忆口诀1NF看原子性一个格子一个值。2NF看完全性非主属性全依赖主键。组合主键要小心部分依赖要消除。单一主键自动过2NF门槛轻松跨。7️⃣ 小测验评论区对答案关系模式R(A,B,C,D)R(A, B, C, D)R(A,B,C,D)函数依赖集F{A→B,C→D,(A,C)→D}F \{ A \rightarrow B, C \rightarrow D, (A, C) \rightarrow D \}F{A→B,C→D,(A,C)→D}。候选键为(A,C)(A, C)(A,C)以下说法正确的是 。A. 满足1NF但不满足2NFB. 满足2NF但不满足3NFC. 满足3NFD. 不满足1NF提示先判断有没有违反1NF再看非主属性是否存在部分函数依赖本专栏日更点击头像 → 专栏《软考中级高频考点》订阅第一时间接收新内容#软考中级 #软件设计师 #第一范式 #第二范式 #数据库规范化 #数据库技术基础 #软考备考