数据库复习笔记 四.关系数据库设计理论

数据依赖#

函数依赖: 有了 A 就能绝对确定 B, 例如知道学号确定姓名, 知道身份证号确定生日.

平凡函数依赖: (学号, 课程号) → 学号, 废话依赖.

非平凡函数依赖: 学号 → 姓名, 有用的依赖.

部分函数依赖 Partial: 只需要其中的一部分就能确定, 例如姓名部分依赖于 (学号, 课程号).

完全函数依赖 Full: 必须凑齐才能确定, 例如分数依赖于 (学号, 课程号).

传递函数依赖 Transitive: 学号 → 宿舍楼, 宿舍楼 → 楼长, 所以学号 → 楼长.

: 设 K 是关系模式 R 中的属性集合. 如果 K完全函数依赖决定 R 中的所有其他属性, 那么 K 就是候选码 (Candidate Key).

实际上候选码主码超码就是第一章的候选键主键超键, 这里叫码是因为 PPT 不知道发什么癫, 第一章 Key 翻译成键, 这里又翻译成码了.

参考: 数据库基础笔记 一.绪论

数据依赖对关系模式的影响#

U={Sno,Sdept,Mname,Cname,Grade}
F={Sno->Sdept, Sdept->Mname, (Sno,Cname)->Grade}

(U 表示所有属性, F 表示依赖)

该关系模式存在如下问题 :

  • 数据冗余太大: 系主任名字重复出现, 和所有学生的所有课程成绩次数一样
  • 更新异常: 更换系主任必须修改每一个学生信息
  • 插入异常: 刚成立的系如果还没有招生就无法存储系主任信息
  • 删除异常: 某个系的学生全部毕业删除时会丢失系主任信息

范式#

1NF ∈ 2NF ∈ 3NF ∈ BCNF ∈ 4NF ∈ 5NF.

第一范式#

1NF, 原子性, 不可再分.

现在的关系型数据库根本创建不出不满足 1NF 的表, 所以考试应该不用管.

第二范式#

如果一个关系模式 R ∈ 1NF, 并且每一非主属性都完全依赖于 R 的码, 则 R ∈ 2NF.

若 R 的码只包含一个属性, 且 R 是 1NF, 则 R 必是 2NF.

人话: 不存在部分函数依赖.

例:

R (学号, 课程, 姓名, 成绩), 主键 (学号, 课程), 但姓名只依赖于学号, 对主键是部分依赖, 不满足 2NF.

解决方法: 拆成两张表, (学号, 课程, 成绩) 和 (学号, 姓名).

第三范式#

如果一个关系模式 R 中不存在非主属性对码的传递依赖, 则 R ∈ 3NF .

人话: 不存在传递函数依赖.

例:

学生表 (学号, 系名, 系主任), 系主任传递依赖于学号, 不满足 3NF.

BC 范式#

如果一个关系模式 R (U,F) ∈ 1NF, 对 R 中的任意一个非平凡的函数依赖 X->Y, X 都含有候选码, 则 R ∈ BCNF.

人话: 任何能决定某一项的东西, 都必须包含候选键.

例:

R (学生, 课程, 老师)

老师能决定课程, 但老师不能决定学生, 故不满足 BCNF.

第四范式#

不允许有非平凡且非函数依赖的多值依赖.

多值依赖: 存在独立的一对多依赖.

例如, 学生有两个属性, 选课和爱好, 选课包括英语和数学, 爱好包括唱歌和篮球, 选课和爱好无关, 如果放在一张表里:

学生 课程 爱好
张三 英语 篮球
张三 英语 唱歌
张三 数学 篮球
张三 数学 唱歌

这张表非常唐, 所以需要拆成 (学生, 课程) 和 (学生, 爱好), 满足 4NF.

第五范式#

消除了由连接依赖导致的异常.

很复杂, 一般不考.

关系模式的规范化#

无损连接性: 把大表拆成小表后, 将小表自然连接回去, 得到的数据必须和原本相同.

保持函数依赖: 原来大表里有的规则, 在拆分后的小表里, 依然能找到地方验证, 不需要把表拼起来就能验证.

无损连接的判断#

若 R 分解为 R1R_1R2R_2, 则 R1R_1R2R_2 的交集是 R1R_1R2R_2 的主键 (或超键), 当且仅当分解是无损的.