网络上已经有人介绍第二范式与第三范式之间的区别,但是我看了之后觉得甚是模糊,很不清晰.为此特意写了这篇博客再来解释一下第二范式与第三范式之间的区别.
直接给结论:第二范式要求非主键属性与所有主键相关(针对联合主键,单主键必然满足第二范式),第三范式则在第二范式的基础上要求所有非主键属性互相独立,即互不相关.
如何区分?
给出两者定义(来自百度百科):
第二范式(Second Normal Form,2nd NF)是指每个表必须有一个(而且仅有一个)数据元素为主关键字(Primary key),其他数据元素与主关键字一一对应。通常称这种关系为函数依赖(Functional dependence)关系,即表中其他数据元素都依赖于主关键字,或称该数据元素惟一地被主关键字所标识。第二范式是数据库规范化中所使用的一种正规形式。它的规则是要求数据表里的所有非主属性都要和该数据表的主键有完全依赖关系;如果有哪些非主属性只和主键的一部份有关的话,它就不符合第二范式。同时可以得出:如果一个数据表的主键只有单一一个字段的话,它就一定符合第二范式(前提是该数据表符合第一范式)。
简单的说第二范式要求确保数据库表中的每一列都与主键相关,而不能只与主键的某一部分相关(针对联合主键而言),即一个表存只能储存一种数据.
第三范式(Third Normal Form,3rd NF)就是指表中的所有数据元素不但要能惟一地被主关键字所标识,而且它们之间还必须相互独立,不存在其他的函数关系。也就是说,对于一个满足2nd NF 的数据结构来说,表中有可能存在某些数据元素依赖于其他非关键字数据元素的现象,必须消除。
简单的说第三范式要求确保数据表中的每一列数据都和主键直接相关,而不能间接相关,属性不能依赖于其他非主属性.
如何判断?
判断的时候首先依次取每一个非主属性查看其与主键的关系,若每个非主属性与所有主键都相关,那么可以说这张表满足了第二范式.
更进一步,依次取每一个非主属性查看其与其他非主属性的关系,若每个非主属性之间相互独立,那么可以说这张表满足了第三范式.
最后
用一句比较深奥的话做总结:第二范式是完全函数依赖,第三范式是消除传递依赖.