依赖

如果一个值/元素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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐