数据库16——数据库范式

200 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

数据库的三大范式?

  • 第一范式(1NF,Normal Form):属性不可分,属性不应该是可分的。

    • 举例:如果将“电话”作为一个属性(一列),是不符合1NF的,因为电话这个属性可以分解为家庭电话和移动电话...如果将“移动电话”作为一个属性,就符合1NF;
  • 第二范式 2NF:每个非主属性完全依赖主属性集(候选键集);(主属性集可以唯一确定一条记录,其子集不行

    • B完全依赖于A,就是说A中的所有属性唯一决定B,属性少了就不能唯一决定,属性多了则有冗余(叫依赖不叫完全依赖)。举例:(学号,课程名)这个主属性集可以唯一决定成绩,但是对于学生姓名这个属性,(学号,课程名)这个属性集就是冗余的,所以学生姓名不完全依赖于(学号,课程名)这一属性集;
    • 主属性集/候选码集:某一组属性能够唯一确定其它的属性(主键就是从候选键集中选的一个键),而其子集不能,这样的属性组中的属性就是主属性;不在候选码集中的属性成为非主属性;
    • 可以通过分解来满足 2NF:将(学号,课程名,成绩)做成一张表;(学号,学生姓名)做成另一张表,避免大量的数据冗余;
  • 第三范式 3NF:在 2NF 的基础上,非主属性不传递依赖于主属性(非主属性不能由其他非主属性唯一确定

    • 传递依赖:如果C依赖于B,B依赖于A,那么C传递依赖于A;
    • 3NF在2NF的基础上,消除了非主属性之间的依赖;比如一个表中,主属性有(学号),非主属性有(姓名,院系,院长名),可以看到院长名这个非主属性依赖于院系,传递依赖于学号。消除的办法是分解。

不符合范式会出现哪些异常?

  • 冗余数据:某些同样的数据多次出现(如学生姓名);
  • 修改异常:修改了一个记录中的信息,另一个记录中相同的信息却没有修改;
  • 删除异常:删除一个信息,那么也会丢失其它信息(删除一个课程,丢失了一个学生的信息);
  • 插入异常:无法插入(插入一个还没有课程信息的学生)