数据库的三范式及BC范式
数据库的三范式及BC范式
·
数据库的三范式及BC范式
依赖
如果一个值/元素A,可以确定另一个值/元素B,则称B依赖于A。例:
函数 y = x²
就有,y依赖于x。
同理,在数据库表中: 如果表中一个字段/元素Column1能够确定另一个字段/元素Column2,那么就可称 Column2依赖于Column1。
三范式
第一范式(1NF):唯一性,数据列不可再分割
错误示范:
教师 | 备注 |
---|---|
张三,高级职称 | |
这里的教师列,不但存储了姓名,还存储了职称,违反了第一范式的原子性。 |
正确示范:
教师 | 职称 | 备注 |
---|---|---|
张三, | 高级 |
第二范式(2NF):唯一性,消除非主键元素/列对组合主键中部分元素/列的依赖
- 所有的非主键元素/列都会依赖于主键(这是主键的定义)
- 如果主键不是组合形式,只是单个元素/列的话,则不会存在违反第二范式。
错误示例
学号 | 课程号 | 课程名 | 得分 |
---|---|---|---|
SN001 | CN_a | 毛选 | 80 |
SN001 | CN_b | 邓理 | 85 |
SN002 | CN_c | 江三 | 90 |
上表中联合主键为: 学号 + 课程号
但是,非主键元素/列 课程名依赖于组合主键中的 课程号, 所以违反了第二范式。
正确示例
拆成两张表, 将课程单独设计为一张表
学号 | 课程号 | 得分 |
---|---|---|
SN001 | CN_a | 80 |
SN001 | CN_b | 85 |
SN002 | CN_a | 90 |
课程号 | 课程名 |
---|---|
CN_a | 毛选 |
CN_b | 邓理 |
CN_c | 江三 |
第三范式(3NF):独立性,消除传递依赖即是非主键元素/列不能依赖其他非主键元素/列
错误示例
学号 | 班级 | 班级人数 |
---|---|---|
SN001 | 1班 | 80 |
SN001 | 2班 | 85 |
SN002 | 3班 | 90 |
上表中, 主键为 学号。非主键列班级人数依赖了班级列,违反了第三范式。
正确示例:
将班级单独设计为一个表
班级 | 人数 |
---|---|
1班 | 80 |
2班 | 85 |
3班 | 90 |
学号 | 班级 |
---|---|
SN001 | 1班 |
SN002 | 2班 |
SN003 | 3班 |
三个范式一句话总结
每个列都不能再拆分,非主键列只能依赖于主键。
注:当主键为组合主键时,非主键列必须依赖整个组合主键,而不是组合主键中的某一列,否则就违反了第二范式。
BC范式(BCNF):在关系模式中每一个决定因素都包含候选键,也就是说,只要属性或属性组A能够决定任何一个属性B,则A的子集中必须有候选键(或者说A必须为超键)。
要满足BC范式,需要先满足第三范式。
解释:
属性A决定(确定)属性B,
即是 A ----> B , 表示 B依赖于A
那么, A(或A的子集)一定要有候选关键字
错误示例:
学号 | 课题 | 课题编号 | 课题学分 |
---|---|---|---|
CN001 | 课题1 | CN_a | 5.0 |
CN001 | 课题1 | CN_a | 5.0 |
CN002 | 课题2 | CN_b | 4.0 |
CN002 | 课题2 | CN_b | 4.0 |
如上表,将 学号 + 课题 设计为组合主键
由于课题编号可以确定课程,所以要满足BC范式,那么课程编号必须为候选关键字,由表可知课程编号并不是候选关键字,所以违反了 BC范式。
正确示例
学号 | 课程编号 | 课程学分 |
---|---|---|
CN001 | CN_a | 5.0 |
CN001 | CN_a | 5.0 |
CN002 | CN_b | 4.0 |
CN002 | CN_b | 4.0 |
课程编号 | 课程 |
---|---|
CN_a | 课题1 |
CN_b | 课题2 |
一般原则:
- 通过增加列或者表来满足更多/更高级别的范式
- 要满足更高的范式得保证满足了前面低级别的范式
- 遵循三范式有利于减少数据冗余、消除插入异常、更新异常、删除异常
- 实际设计时,有时适当的冗余也是允许的(其他方面综合权衡考虑,如效率等)
参考:https://blog.csdn.net/A_art_xiang/article/details/113880638
更多推荐
所有评论(0)