1NF
符合数据表的原子性
通俗的说:第一范式就是每个属性不可再分
- 表中同一列的数据类型相同
- 一个列名只能对应一列
- 并且每一类不可再分
- 每一行的数据互不影响
例子
编号 | 代表作 | 演员 | 公司名称 | 发表时间 |
---|---|---|---|---|
1 | 《yewens》 | 张三、李四 | 幸福里公司、演好戏公司 | 2021-11-15 |
2 | 《chuangtian》 | 王二 | 爆笑喜剧公司 | 2021-11-15 |
显然第一行不符合数据表的原子性。
修改后【拆列】:
编号 | 代表作 | 演员 | 公司名称 | 发表时间 |
---|---|---|---|---|
1 | 《yewens》 | 张三 | 幸福里公司 | 2021-11-15 |
2 | 《yewens》 | 李四 | 演好戏公司 | 2021-11-15 |
3 | 《chuangtian》 | 王二 | 爆笑喜剧公司 | 2021-11-15 |
2NF
第二范式在第一范式的基础上消除了非主属性
对于主属性
的部分函数依赖
。
通俗的说:第二范式就是表中的非主属性必须
完全依赖于主属性。【消除了部份依赖,保留了完全依赖】
完全依赖
是指不能存在仅依赖候选键一部分的属性
属性
码
码是可以确定一个元组的所有信息的属性名或属性名组。
例如在 { a, b, c, d } 中,
假设知道 a 的值就能确定 a, b, c, d 的值,
假设知道 c, d 的值就可以确定 a, b, c, d 的值,
那么 { a } 就是码,{ c, d } 就是码。
并且 { a, b }, { a, c }, { a, b, c }, { a, b, c, d } 等也都是码,因为它们也可以确定一个元组的所有值,即使很多余
``候选码` 候选码的真子集中不存在码,候选码可以有多个
就上面的例子而言,{ a } 是候选码,{ c, d } 是候选码,因为它们的真子集中不存在码。
而诸如 { a, b } 并不是候选码,因为它的真子集中含有 { a }, 且 { a } 是码。
主码
就是主键的意思,主码是任意一个候选码
还是上面的例子,主码是候选码 { a }, { c, d } 中的其中一个。
既可以是 { a }, 也可以是 { c, d }。
主属性
包含在任何一个候选码中的属性
非主属性
不包含在任何候选码中的属性
主码候选码
码
例子[理解概念]
学生基本信息表(学号,身份证号,姓名),学号取值唯一
(学号,身份证号)-> 姓名
(身份证号)-> 姓名
(学号)-> 姓名
所以姓名
部分函数依赖于(学号,身份证号)
所以只有一个主属性的表如果符合第一范式,那一定是第二范式
判断2NF
- 找出数据表中所有的候选键
- 找出所有主属性和非主属性
- 判断所有的非主属性对候选键的部份依赖
例子[学会做题]
学生信息表(sno,系别,住处,cno,分数)
(sno,cno)可以组成候选键
系别,住处,分数 不是候选键的一部分,是非主属性
分数依赖于(sno,cno),系别依赖于sno,住处依赖于sno
(sno,cno)->分数 完全依赖
sno -> 系别,(sno,cno)-> 系别 部分依赖
sno -> 住处,(sno,cno)-> 住处 部分依赖
系别 -> 住处 每个系的学生只住一个地方
所以非主属性部分依赖于候选键,不满足2NF
不满足2NF会出现的问题
- 插入异常
- 删除异常
- 修改复杂
3NF
第三范式就是指表中的所有数据元素不但要能唯一地被主关键字所标识,而且它们之间还必须相互独立
,不村子啊其他的函数关系。
通俗的说:在2NF的基础上消除传递函数依赖
。
传递函数依赖
指的是如果存在“A->B->C”的决定关系,则C传递函数依赖于A。
例子[理解概念]
名称 | 专辑 | 发表时间 | 专辑类别 |
---|---|---|---|
《非白》 | 《理想》 | 2020/1/5 | 录音室版本 |
《梧桐》 | 《梧桐》 | 2018/10/30 | 录音室版本 |
显然
名称->专辑
专辑->(发表时间,专辑类别)
所以名称 -> (发表时间,专辑类别)
(发表时间,专辑类别) 传递依赖与 名称
不满足3NF
优点
消除了数据冗余,更新异常,插入异常,删除异常
BCNF
消除主属性对主键的部分于传递依赖