目前的关系数据库有六种范式:
第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)、巴斯-科德范式
(BCNF)、第四范式(4NF)和第五范式(5NF,⼜称完美范式)。满⾜最低要求的范式是
第⼀范式(1NF)。在第⼀范式的基础上进⼀步满⾜更多规范要求的称为第⼆范式
(2NF),其余范式以次类推。⼀般说来,数据库只需满⾜第三范式(3NF)就⾏了。
1、范式
范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式
2、第⼀范式(1NF)
即表的列的具有原⼦性,不可再分解,即列的信息,不能分解, 只要数据库是关系型数据库(mysql/oracle/db2/informix/sysbase/sql server),就⾃动的满⾜1NF。数据库表的每⼀列都是不可分割的原⼦数据项,⽽不能是集合,数组,记录等⾮原⼦数据项。如果实体中的某个属性有多个值时,必须拆分为不同的属性 。通俗理解即⼀个字段只存储⼀项信息。
3、第⼆范式(2NF)
第⼆范式(2NF)是在第⼀范式(1NF)的基础上建⽴起来的,即满⾜第⼆范式
(2NF)必须先满⾜第⼀范式(1NF)。第⼆范式(2NF)要求数据库表中的每个实例或⾏必须可以被惟⼀地区分。为实现区分通常需要我们设计⼀个主键来实现(这⾥的主键不包含业务逻辑)。即满⾜第⼀范式前提,当存在多个主键的时候,会发⽣不符合第⼆范式的情况。⽐如有两个主键,不能存在这样的属性,它只依赖于其中⼀个主键,这就是不符合第⼆范式。通俗理解是任意⼀个字段都只依赖表中的同⼀个字段。
4、第三范式(3NF)
满⾜第三范式(3NF)必须先满⾜第⼆范式(2NF)。简⽽⾔之,第三范式(3NF)要求⼀个数据库表中不包含已在其它表中已包含的⾮主键字段。就是说,表的信息,如果能够被推导出来,就不应该单独的设计⼀个字段来存放(能尽量外键join就⽤外键join)。很多时候,我们为了满⾜第三范式往往会把⼀张表分成多张表。即满⾜第⼆范式前提,如果某⼀属性依赖于其他⾮主键属性,⽽其他⾮主键属性⼜依赖于主键,那么这个属性就是间接依赖于主键,这被称作传递依赖于主属性。 通俗解释就是⼀张表最多只存两层同类型信息。
5、巴斯-科德范式(BCNF)
在3NF基础上,任何⾮主属性不能对主键⼦集依赖(在3NF基础上消除对主码⼦集的依赖)巴斯-科德范式(BCNF)是第三范式(3NF)的⼀个⼦集,即满⾜巴斯-科德范式(BCNF)必须满⾜第三范式(3NF)。通常情况下,巴斯-科德范式被认为没有新的设计规范加⼊,只是对第⼆范式与第三范式中设计规范要求更强,因⽽被认为是修正第三范式,也就是说,它事实上是对第三范式的修正,使数据库冗余度更⼩。这也是BCNF不被称为第四范式的原因。某些书上,根据范式要求的递增性将其称之为第四范式是不规范,也是更让⼈不容易理解的地⽅。⽽真正的第四范式,则是在设计规范中添加了对多值及依赖的要求
6、第四范式(4NF)
对于第四范式,从理论层⾯来讲是,关系模式R∈1NF,如果对于R对于R的每个⾮平凡多值依赖X→Y(Y不属于X),X都含有候选码,则R∈4NF。4NF就是限制关系模式的属性之间不允许有⾮平凡且⾮函数依赖的多值依赖。显然⼀个关系模式是4NF,则必为BCNF
7、第五范式(5NF,又称完美范式)
不得存在不遵循键约束的⾮平凡连接依赖。如果且只有⼀个表符合4NF,同时其中的每个连接依赖被候选键所包含,此表才符合第五依赖