三大范式
目前的关系型数据库设计有六种范式,分别是:第一范式(1NF),第二范式(2NF),第三范式(3NF),巴斯-科德范式(BCNF),第四范式(4NF)和第五范式(5NF)。
后三种我们都不常使用,我们最常用的就是前三种:第一范式、第二范式和第三范式。
第一范式(1NF)
第一范式:要求数据库表的每一列都是不可分割的原子数据项。
上面这个表,我们发现在联系方式这列,可以再进行拆分,这就不满足第一范式。改进后如下:
现在每一列的数据都已经不可再分了,即每一列都是一个原子数据项,满足第一范式。
第二范式(2NF)
第二范式:在满足第一范式的基础上,非码属性必须完全依赖于候选码,在第一范式的基础上消除非主属性对主码的部分函数依赖。
通俗来说,就是在满足第一范式的基础上,表中的每一列都和主键相关,不能只与部分主键相关(主要针对联合主键),就是为了保证一张表中只有一列作为主键,防止多列作为主键,而非主键列都和主键列相关。
对于上面的表,我们发现,学号为主键,但是专业,学制,班主任和职称与学号并无关联,我们就可以对其做优化,优化如下:
经过上述优化,我们发现两张表中的数据都与各自表中的主键相关,学生表中的数据都与学号相关,而班主任表中的数据都与班主任职工号相关。这就满足第二范式。
第三范式(3NF)
第三范式:在满足第二范式的基础上,任何非主属性不依赖于其他非主属性,在第二范式的基础上消除传递依赖。
通俗来说,就是在满足了第二范式的基础上,表中的每一个数据都和主键直接相关,不能存在间接相关的列。
在第三范式看来,上述优化也有点问题,职工号与学号并无直接相关的联系,它们是通过班级连接起来的,所以我们对上述优化再做优化,如下:
现在的表中数据都是与主键直接相关了,班级和教师之间通过另一个管理关系联系在一起,学生直接属于班级,班级又直接属于老师管理,都是直接相关。
我们发现经过优化后的数据表,不仅能减少数据的冗余,数据表也更加的清晰,一张数据表就专注的记录一种数据。