如果一个值/元素A,可以确定另一个值/元素B,则称B依赖于A。例:
函数 y = x²
就有,y依赖于x。
同理,在数据库表中: 如果表中一个字段/元素Column1能够确定另一个字段/元素Column2,那么就可称 Column2依赖于Column1。
错误示范:
| 教师 | 备注 |
|---|---|
| 张三,高级职称 | |
| 这里的教师列,不但存储了姓名,还存储了职称,违反了第一范式的原子性。 |
正确示范:
| 教师 | 职称 | 备注 |
|---|---|---|
| 张三, | 高级 |
错误示例
| 学号 | 课程号 | 课程名 | 得分 |
|---|---|---|---|
| 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 | 江三 |
错误示例
| 学号 | 班级 | 班级人数 |
|---|---|---|
| SN001 | 1班 | 80 |
| SN001 | 2班 | 85 |
| SN002 | 3班 | 90 |
上表中, 主键为 学号。非主键列班级人数依赖了班级列,违反了第三范式。
正确示例:
将班级单独设计为一个表
| 班级 | 人数 |
|---|---|
| 1班 | 80 |
| 2班 | 85 |
| 3班 | 90 |
| 学号 | 班级 |
|---|---|
| SN001 | 1班 |
| SN002 | 2班 |
| SN003 | 3班 |
每个列都不能再拆分,非主键列只能依赖于主键。
注:当主键为组合主键时,非主键列必须依赖整个组合主键,而不是组合主键中的某一列,否则就违反了第二范式。
要满足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