依赖

如果一个值/元素A,可以确定另一个值/元素B,则称B依赖于A。例:

函数 y =  x²

就有,y依赖于x。

同理,在数据库表中: 如果表中一个字段/元素Column1能够确定另一个字段/元素Column2,那么就可称 Column2依赖于Column1。

三范式

第一范式(1NF):唯一性,数据列不可再分割

错误示范:

教师备注
张三,高级职称
这里的教师列,不但存储了姓名,还存储了职称,违反了第一范式的原子性。

正确示范:

教师职称备注
张三,高级

第二范式(2NF):唯一性,消除非主键元素/列对组合主键中部分元素/列的依赖

  • 所有的非主键元素/列都会依赖于主键(这是主键的定义)
  • 如果主键不是组合形式,只是单个元素/列的话,则不会存在违反第二范式。

错误示例

学号课程号课程名得分
SN001CN_a毛选80
SN001CN_b邓理85
SN002CN_c江三90

上表中联合主键为: 学号 + 课程号
但是,非主键元素/列 课程名依赖于组合主键中的 课程号, 所以违反了第二范式。

正确示例
拆成两张表, 将课程单独设计为一张表

学号课程号得分
SN001CN_a80
SN001CN_b85
SN002CN_a90
课程号课程名
CN_a毛选
CN_b邓理
CN_c江三

第三范式(3NF):独立性,消除传递依赖即是非主键元素/列不能依赖其他非主键元素/列

错误示例

学号班级班级人数
SN0011班80
SN0012班85
SN0023班90

上表中, 主键为 学号。非主键列班级人数依赖了班级列,违反了第三范式。

正确示例:
将班级单独设计为一个表

班级人数
1班80
2班85
3班90
学号班级
SN0011班
SN0022班
SN0033班

三个范式一句话总结

每个列都不能再拆分,非主键列只能依赖于主键。

注:当主键为组合主键时,非主键列必须依赖整个组合主键,而不是组合主键中的某一列,否则就违反了第二范式。

BC范式(BCNF):在关系模式中每一个决定因素都包含候选键,也就是说,只要属性或属性组A能够决定任何一个属性B,则A的子集中必须有候选键(或者说A必须为超键)。

要满足BC范式,需要先满足第三范式。

解释:

属性A决定(确定)属性B,
即是 A ----> B , 表示 B依赖于A
那么, A(或A的子集)一定要有候选关键字

错误示例:

学号课题课题编号课题学分
CN001课题1CN_a5.0
CN001课题1CN_a5.0
CN002课题2CN_b4.0
CN002课题2CN_b4.0

如上表,将 学号 + 课题 设计为组合主键
由于课题编号可以确定课程,所以要满足BC范式,那么课程编号必须为候选关键字,由表可知课程编号并不是候选关键字,所以违反了 BC范式。

正确示例

学号课程编号课程学分
CN001CN_a5.0
CN001CN_a5.0
CN002CN_b4.0
CN002CN_b4.0
课程编号课程
CN_a课题1
CN_b课题2

一般原则:

  • 通过增加列或者表来满足更多/更高级别的范式
  • 要满足更高的范式得保证满足了前面低级别的范式
  • 遵循三范式有利于减少数据冗余、消除插入异常、更新异常、删除异常
  • 实际设计时,有时适当的冗余也是允许的(其他方面综合权衡考虑,如效率等)

参考:https://blog.csdn.net/A_art_xiang/article/details/113880638

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐