数据库系统原理期末复习(三)
数据库期末复习规范化设计、函数依赖、候选键与关系模式分解一、本章学习目标这一部分是数据库期末考试中最容易出计算题和综合题的内容。核心内容包括函数依赖范式判断属性闭包候选键求解Armstrong 公理最小函数依赖集关系模式分解无损连接性保持函数依赖最重要的题型1. 判断关系模式属于第几范式 2. 求属性闭包 X 3. 求候选键 4. 判断函数依赖是否能推出 5. 求最小函数依赖集 6. 判断分解是否无损连接 7. 判断分解是否保持函数依赖 8. 分解到 3NF 或 BCNF二、为什么要进行规范化设计1. 问题背景数据库设计不是简单地把所有字段塞进一张大表。例如学生选课表(学号, 姓名, 系别, 宿舍楼, 课程号, 课程名, 成绩)看起来信息很完整但会产生很多问题。如果一个学生选了多门课那么他的姓名、系别、宿舍楼会重复出现多次。这就会带来数据冗余 插入异常 删除异常 修改复杂2. 规范化设计的目的规范化设计的目标是减少关系表中不合理的数据依赖降低冗余避免各种操作异常。简单说规范化就是把一张设计不好的大表合理拆成几张更好的小表。3. 四类常见异常异常含义例子数据冗余同一信息重复存储一个学生选多门课宿舍楼重复出现插入异常想插入某些信息但插不进去学生没选课就无法插入学生信息删除异常删除一条记录时误删其他信息删除最后一门课学生信息也没了修改复杂修改一处信息要改很多行学生转系要修改所有选课记录4. 一句话理解规范化规范化 用分解减少冗余和异常。三、函数依赖1. 什么是函数依赖函数依赖是规范化理论的基础。设关系模式 R 中有属性集 X 和 Y。如果在 R 的任意关系实例中只要两个元组的 X 值相同那么它们的 Y 值也一定相同就说X → Y读作X 函数决定 Y或者Y 函数依赖于 X2. 通俗理解函数依赖就是知道 X就能唯一确定 Y。例如学号 → 姓名 学号 → 所属系别 课程号 → 课程名 教师名 → 教师职务因为一个学号只能对应一个学生姓名。3. 不是函数依赖的例子姓名 → 学号通常不成立。因为可能有重名学生。课程名 → 教师名也不一定成立。因为一门课可能由多个老师讲。4. 函数依赖判断技巧判断 X → Y 是否成立看X 相同的时候Y 是否一定相同。如果一定相同成立。如果可能不同不成立。四、函数依赖的类型1. 平凡函数依赖如果Y ⊆ X则X → Y一定成立。例如AB → A AB → B ABC → AC这种依赖没有提供新信息叫平凡函数依赖。2. 非平凡函数依赖如果Y ⊄ X则 X → Y 是非平凡函数依赖。例如学号 → 姓名 课程号 → 课程名规范化主要关注非平凡函数依赖。3. 完全函数依赖如果X → Y成立并且 X 的任何真子集都不能决定 Y则称Y 完全函数依赖于 X例如(学号, 课程号) → 成绩成绩必须由学号和课程号共同决定。只知道学号不能确定成绩。只知道课程号也不能确定成绩。所以是完全函数依赖。4. 部分函数依赖如果X → Y成立但 X 的某个真子集也能决定 Y则称Y 部分函数依赖于 X例如(学号, 课程号) → 姓名虽然组合键能决定姓名但其实学号 → 姓名已经成立。所以姓名部分依赖于复合键。5. 传递函数依赖如果X → Y Y → Z并且 Y 不决定 X则可以推出X → Z这时称 Z 传递依赖于 X。例如学号 → 系别 系别 → 宿舍楼所以学号 → 宿舍楼宿舍楼传递依赖于学号。6. 对比总结类型判断方法例子平凡依赖右边是左边子集AB → A非平凡依赖右边不是左边子集A → B完全依赖左边整体才能决定右边(学号,课程号) → 成绩部分依赖左边一部分就能决定右边(学号,课程号) → 姓名传递依赖X→YY→Z所以X→Z学号→系别→宿舍楼五、码、候选键、主属性、非主属性1. 超键如果属性集 K 能决定关系模式 R 的全部属性则 K 是超键。即K U其中 U 是关系模式的全部属性。2. 候选键候选键是最小的超键。也就是1. 能决定所有属性 2. 去掉任何一个属性后都不能决定所有属性3. 主键如果一个关系模式有多个候选键选其中一个作为主键。例如候选键学号、身份证号 主键学号4. 主属性出现在任意候选键中的属性叫主属性。例如候选键是AB CD那么主属性是A, B, C, D5. 非主属性不出现在任何候选键中的属性叫非主属性。6. 易错点主属性不是只出现在主键中的属性而是出现在任意候选键中的属性。六、范式总览1. 什么是范式范式是衡量关系模式规范化程度的标准。常见范式1NF 2NF 3NF BCNF 4NF 5NF越往后要求越严格冗余通常越少。2. 范式层次关系5NF ⊂ 4NF ⊂ BCNF ⊂ 3NF ⊂ 2NF ⊂ 1NF也就是说满足 BCNF 一定满足 3NF。 满足 3NF 一定满足 2NF。 满足 2NF 一定满足 1NF。3. 实际应用实际数据库设计中最常用3NF BCNF考试重点也是1NF、2NF、3NF、BCNF七、第一范式 1NF1. 定义1NF 要求每个属性都是不可再分的原子值。简单说表中每个单元格只能有一个值。2. 不满足 1NF 的例子学号姓名电话1001张三111, 222电话这一列有多个值不满足 1NF。3. 满足 1NF 的改法可以拆成多行学号姓名电话1001张三1111001张三222或者单独建立电话表。4. 高频考点不满足 1NF 就不是关系数据库中的规范关系。八、第二范式 2NF1. 定义2NF 要求1. 满足 1NF 2. 每个非主属性都完全函数依赖于每个候选键简单说不能有非主属性部分依赖于候选键。2. 2NF 主要解决什么问题解决部分函数依赖尤其是复合主键场景。3. 例子关系模式SLC(学号, 课程号, 成绩, 系别, 宿舍楼)候选键(学号, 课程号)函数依赖(学号, 课程号) → 成绩 学号 → 系别 学号 → 宿舍楼其中系别、宿舍楼只依赖于学号而不是整个复合键。所以存在部分函数依赖不满足 2NF。4. 分解方法拆成SC(学号, 课程号, 成绩) SL(学号, 系别, 宿舍楼)这样成绩完全依赖于(学号,课程号) 系别、宿舍楼完全依赖于学号5. 2NF 判断口诀先看是否 1NF。 再看非主属性是否依赖整个候选键。 如果只依赖候选键的一部分就不是 2NF。九、第三范式 3NF1. 定义3NF 要求1. 满足 2NF 2. 不存在非主属性对候选键的传递函数依赖简单说非主属性不能依赖另一个非主属性。2. 3NF 主要解决什么问题解决传递函数依赖3. 例子关系模式SL(学号, 系别, 宿舍楼)函数依赖学号 → 系别 系别 → 宿舍楼所以学号 → 宿舍楼是传递依赖。宿舍楼不是直接由学号决定而是通过系别决定。不满足 3NF。4. 分解方法拆成S(学号, 系别) D(系别, 宿舍楼)5. 3NF 判断口诀非主属性不能依赖非主属性。十、BCNF1. 定义BCNF 要求对于关系模式中的每一个非平凡函数依赖 X → YX 都必须是候选键或超键。简单说所有决定因素都必须是键。2. BCNF 和 3NF 的区别3NF 主要限制非主属性BCNF 更严格限制所有属性包括主属性3. 例子关系模式SCT(学号, 课程号, 教师号)假设(学号, 课程号) → 教师号 教师号 → 课程号候选键可能是(学号, 课程号) (学号, 教师号)所有属性都是主属性所以可能满足 3NF。但是教师号 → 课程号教师号不是候选键却决定了课程号。所以不满足 BCNF。4. 分解方法可以拆成ST(学号, 教师号) TC(教师号, 课程号)5. BCNF 高频结论满足 BCNF 一定满足 3NF。 满足 3NF 不一定满足 BCNF。 如果一个关系模式满足 3NF且只有一个候选键则一定满足 BCNF。十一、第四范式 4NF1. 定义4NF 要求在满足 BCNF 的基础上消除非平凡且非函数依赖的多值依赖。2. 多值依赖直观理解如果一个学生有多个电话也有多个邮箱学生 →→ 电话 学生 →→ 邮箱电话和邮箱之间彼此独立。如果放在一张表中会产生组合冗余。3. 例子Contact(学号, 电话, 邮箱)如果一个学生有 2 个电话和 2 个邮箱就会组合出 4 行。应该拆成PhoneInfo(学号, 电话) EmailInfo(学号, 邮箱)十二、范式判断总口诀1NF属性不可再分 2NF消除部分依赖 3NF消除传递依赖 BCNF决定因素必须是键 4NF消除多值依赖十三、Armstrong 公理系统1. Armstrong 公理作用Armstrong 公理用于从已有函数依赖推出新的函数依赖 判断函数依赖是否被蕴涵 计算属性闭包 求候选键 求最小依赖集2. 三大基本公理1自反律如果Y ⊆ X则X → Y例如AB → A ABC → BC2增广律如果X → Y则XZ → YZ例如A → B可以推出AC → BC3传递律如果X → Y Y → Z则X → Z例如A → B B → C推出A → C3. 常用推理规则1合并规则如果X → Y X → Z则X → YZ2分解规则如果X → YZ则X → Y X → Z3伪传递规则如果X → Y WY → Z则WX → Z4. 记忆口诀自反大的决定小的 增广两边一起加 传递一环推一环 合并同左合右 分解右边拆开 伪传递先替换再传递十四、属性闭包 X1. 什么是属性闭包属性集 X 关于函数依赖集 F 的闭包记作X含义是由 X 出发利用 F 能推出的所有属性集合。2. 属性闭包有什么用属性闭包非常重要用于1. 判断 X 是否为候选键 2. 判断 X → Y 是否成立 3. 求候选键 4. 判断函数依赖是否冗余 5. 求最小覆盖3. 判断 X → Y 是否成立方法求 X 如果 Y ⊆ X则 X → Y 成立。 如果 Y ⊄ X则 X → Y 不成立。4. 属性闭包计算步骤给定R(U, F) 要求 X步骤1. 初始 X X 2. 扫描函数依赖 F 3. 如果某个依赖 A → B 的左部 A ⊆ X 4. 就把 B 加入 X 5. 重复扫描直到 X 不再变化5. 例题设R(A, B, C) F {A → B, B → C}求A过程初始A {A} 因为 A → B所以加入 B A {A, B} 因为 B → C所以加入 C A {A, B, C}所以A {A, B, C}6. 闭包计算易错点1. 每次加入新属性后要重新扫描函数依赖。 2. 左部是组合属性时必须全部包含才可使用。 3. 不要只扫描一遍。 4. 求到 U 就可以停止。十五、候选键求解1. 候选键判断标准属性集 K 是候选键需要满足1. K U 2. K 的任何真子集闭包都不等于 U第一条说明它是超键。第二条说明它是最小超键。2. 属性分类法根据属性在函数依赖中的出现位置把属性分成四类。类型含义是否一定在候选键中L类只在左部出现一定在R类只在右部出现一定不在LR类左右都出现可能在N类左右都不出现一定在3. 为什么 L 类和 N 类一定在候选键中L 类属性只在左边出现无法由其他属性推出。N 类属性左右都不出现也无法由其他属性推出。所以它们必须自己带上。4. 为什么 R 类一定不在候选键中R 类属性只在右边出现说明它可以被其他属性推出。候选键要求最小所以一般不需要放入候选键。5. 候选键求解步骤1. 找出 U 中所有属性。 2. 根据 F 划分 L、R、LR、N 四类。 3. 令 X L类 ∪ N类。 4. 求 X。 5. 如果 X U则 X 是唯一候选键。 6. 如果 X ≠ U则从 LR 类中逐个尝试加入属性。 7. 加入后求闭包。 8. 闭包等于 U并且没有包含已有候选键则得到候选键。6. 例题 1设R(A, B, C, D) F {D → B, B → D, AD → B, AC → D}求候选键。分类L类A, C R类无 N类无 LR类B, D所以先取X AC求闭包AC {A, C} 因为 AC → D所以加入 D AC {A, C, D} 因为 D → B所以加入 B AC {A, B, C, D}所以AC U候选键是AC7. 例题 2设R(A, B, C) F {AB → C, C → A}求候选键。分类L类B R类无 N类无 LR类A, C先取B {B}不能推出全部属性。尝试加入 AAB {A, B} AB → C AB {A, B, C}所以 AB 是候选键。尝试加入 CBC {B, C} C → A BC {A, B, C}所以 BC 是候选键。最终候选键AB, BC8. 候选键速解口诀先找必带L N 再算闭包 不够就加 LR R 类别乱带 最后检查最小性十六、函数依赖集等价1. 什么是函数依赖集等价如果两个函数依赖集 F 和 G 能推出的所有函数依赖完全一样则称 F 和 G 等价。记作F G2. 判断方法判断 F 和 G 是否等价1. 判断 F 中每个依赖是否能由 G 推出 2. 判断 G 中每个依赖是否能由 F 推出 3. 两边都能推出则等价3. 用闭包判断判断X → Y 是否能由 F 推出就求X如果Y ⊆ X则能推出。十七、最小函数依赖集1. 什么是最小函数依赖集最小函数依赖集也叫最小覆盖 极小函数依赖集 minimal cover它是和原函数依赖集等价的最简形式。2. 最小覆盖必须满足三个条件1. 每个函数依赖右部只有一个属性。 2. 没有多余的函数依赖。 3. 每个函数依赖左部没有多余属性。3. 最小覆盖求解步骤第一步右部单属性化如果有A → BC拆成A → B A → C第二步去掉左部多余属性例如AB → C判断 A 是否多余求 B看能否推出 C。如果能则 A 多余改成B → C判断 B 是否多余求 A看能否推出 C。第三步去掉多余函数依赖对每条依赖X → A临时删除它。用剩余依赖求X如果仍能推出 A则这条依赖多余可以删除。4. 例题给定F {BCD → A, BC → E, A → F, F → G, C → D, A → G}求最小覆盖。第一步右部都已经是单属性不用拆。第二步判断冗余依赖A → G因为A → F F → G所以A → G可以由其他依赖推出是冗余的。删除。第三步检查左部冗余BCD → A因为BC 可以推出 A所以 D 多余。改成BC → A最终最小覆盖G {BC → A, BC → E, A → F, F → G, C → D}5. 最小覆盖易错点1. 最小覆盖不一定唯一。 2. 先拆右部再删左部多余属性再删多余依赖。 3. 判断多余时要临时删除或替换后重新求闭包。 4. 不要凭感觉删依赖。十八、关系模式分解1. 什么是关系模式分解关系模式分解就是把一个关系模式 R 分成若干个较小的关系模式 R1, R2, …, Rn。例如R(A, B, C)分解成R1(A, B) R2(B, C)2. 为什么要分解因为一张大表可能存在部分依赖 传递依赖 主属性依赖异常 多值依赖分解可以让关系模式满足更高范式。3. 好的分解需要满足什么好的分解最好满足1. 达到较高范式 2. 具有无损连接性 3. 保持函数依赖十九、无损连接性1. 什么是无损连接无损连接是指分解后的表通过自然连接能够恢复原来的表既不丢失信息也不产生错误信息。记忆分开后还能无误拼回去。2. 无损连接不是“不丢属性”很多人误以为分解后属性没少就是无损。这是错误的。无损连接看的是自然连接后数据是否正确恢复不是只看属性集合。3. 二元分解无损判断定理如果关系模式 R 分解为R1, R2那么该分解无损连接的充分必要条件是(R1 ∩ R2) → (R1 - R2)或者(R1 ∩ R2) → (R2 - R1)也就是说两个子模式的公共属性必须能决定其中一个子模式的剩余属性。4. 例子设R(A, B, C) F {A → B}分解R1(A, B) R2(A, C)公共属性R1 ∩ R2 {A}判断A → R1 - R2 {B}因为 F 中有A → B所以该分解是无损连接。5. 高频口诀二元分解看交集。 交集能决定一边就是无损。二十、保持函数依赖1. 什么是保持函数依赖分解后如果原来的函数依赖仍然可以在各个子关系中检查出来就叫保持函数依赖。简单说不用把表重新连接起来也能检查原来的约束。2. 为什么要保持函数依赖如果不保持函数依赖检查约束时可能要做自然连接。这会导致检查麻烦 效率低 维护困难3. 无损连接和保持依赖的关系二者是独立的。情况是否可能无损但不保持依赖可能保持依赖但不是无损可能既无损又保持依赖最理想既不无损也不保持依赖最差4. 高频结论无损连接保证数据不丢。 保持依赖保证约束不丢。二十一、分解到 3NF1. 3NF 分解目标分解到 3NF 时通常希望同时满足1. 满足 3NF 2. 保持函数依赖 3. 具有无损连接性2. 基本思路1. 求最小函数依赖集 Fm 2. 对每个函数依赖 X → A建立一个关系模式 XA 3. 左部相同的依赖可以合并 4. 如果没有任何一个关系模式包含原关系的候选键则额外加入一个候选键关系 5. 删除被包含的冗余关系模式3. 为什么要加入候选键关系因为要保证无损连接性如果分解后的关系中没有任何一个包含原关系的候选键就可能无法无损连接。二十二、分解到 BCNF1. BCNF 分解目标BCNF 分解通常保证无损连接性但不一定保持函数依赖。2. BCNF 分解步骤1. 检查当前关系模式是否满足 BCNF。 2. 如果满足保留。 3. 如果不满足找到一个违反 BCNF 的依赖 X → Y。 4. 分解为 R1 X ∪ Y R2 R - (Y - X) 5. 对分解后的关系继续检查直到全部满足 BCNF。3. 违反 BCNF 的判断对于每个非平凡函数依赖X → Y如果X 不是超键则违反 BCNF。4. 3NF 分解 vs BCNF 分解对比项3NF 分解BCNF 分解范式程度较高更高是否一定无损可做到可做到是否保持依赖可保证不一定实际常用很常用也常用考试重点算法题判断和分解题二十三、规范化综合判断方法1. 判断属于第几范式步骤1. 看是否满足 1NF属性是否原子。 2. 求候选键。 3. 找主属性和非主属性。 4. 看非主属性是否部分依赖候选键。 有则不满足 2NF。 5. 看非主属性是否传递依赖候选键。 有则不满足 3NF。 6. 看每个决定因素是否都是超键。 不是则不满足 BCNF。2. 快速判断口诀先求候选键。 再分主非主。 部分依赖卡 2NF。 传递依赖卡 3NF。 左边非键卡 BCNF。二十四、常见选择题陷阱1. 满足 3NF 一定满足 BCNF错误。BCNF 比 3NF 更严格。2. 满足 BCNF 一定满足 3NF正确。3. 2NF 只和复合键有关基本正确。如果候选键都是单属性通常不会存在非主属性对候选键的部分依赖。4. 无损连接一定保持函数依赖错误。二者相互独立。5. 保持函数依赖一定无损连接错误。6. 最小函数依赖集唯一错误。最小覆盖不一定唯一。7. 候选键可以包含多余属性错误。候选键必须是最小超键。8. R 类属性一定不能出现在任何候选键中通常按课堂算法R 类属性必然不是候选键中的属性。因为它只在右部出现可以由其他属性推出。二十五、考试高频题型总结1. 求 X模板初始 X X 不断使用左部包含于 X 的函数依赖 把右部加入 X 直到不再变化2. 判断 X → Y 是否成立模板求 X 若 Y ⊆ X成立 否则不成立3. 求候选键模板1. 分类 L、R、LR、N 2. 必带 L 和 N 3. 求闭包 4. 不够就从 LR 中组合尝试 5. 闭包为 U 且最小就是候选键4. 判断范式模板1NF属性原子 2NF无非主属性部分依赖 3NF无非主属性传递依赖 BCNF每个决定因素都是超键5. 求最小覆盖模板1. 右部拆单属性 2. 删除左部多余属性 3. 删除多余函数依赖6. 判断二元分解是否无损模板R 分解为 R1, R2 求公共属性 R1∩R2 看公共属性能否决定 R1-R2 或 R2-R1 能则无损 不能则不一定无损二十六、考前速记1. 范式口诀1NF属性不可分 2NF消除部分依赖 3NF消除传递依赖 BCNF决定因素必须是键 4NF消除多值依赖2. Armstrong 公理自反Y⊆X则X→Y 增广X→Y则XZ→YZ 传递X→YY→Z则X→Z3. 推理规则合并X→YX→Z则X→YZ 分解X→YZ则X→YX→Z 伪传递X→YWY→Z则WX→Z4. 候选键候选键 最小超键 K U 去掉任一属性后不能推出 U5. 属性分类L只在左边一定在候选键 R只在右边一定不在候选键 LR左右都出现可能在 N左右都不出现一定在候选键6. 分解目标无损连接数据不丢 保持依赖约束不丢 3NF可兼顾无损和保持依赖 BCNF可保证无损但不一定保持依赖二十七、本章一句话总结本章的核心是通过函数依赖分析关系表中的不合理依赖再利用闭包、候选键、范式判断和模式分解把有冗余和异常的大表拆成结构更合理的小表。

相关新闻