最近刷题总是遇到范式问题,之前本科时候学习过,但很概念已经很模糊。所以做题时候一会做对,一会又错了...再次区分一下吧。
1、第一范式
(1)强调的是列的原子性。不解释了,就是对应了数据库表的一列,不可分。
2、第二范式
(1)在1NF的基础上:任一非主键列 必须 完全依赖于 主键列(X1,X2....)
(2)不允许出现有:非主键列 部分依赖于 主键列(或者说依赖于主键的一部分)。
(3)比如一张表是(A, B, C, D),其中(A, B)是主键,如果存在B->C就违反了2NF,因为C只需要主键的一部分就可以被决定了。
3、第三范式
(1)在2NF的基础上:任一非主键列 必须 直接依赖于 主键列(X1,X2....)
(2)不允许出现:非主键列A 依赖于 非主键列 B,非主键列 B 依赖于 主键C 。
(3)比如一张表(A,B,C,D),其中(A)是主键,如果存在A->B和B->C关系,就违反了3NF,因为非主键C依赖于非主键B,而非主键B依赖于主键A,不满足非主键列直接依赖于主键列。
4、BCNF范式
(1)在3NF的基础上:任一主键列 必须不能 直接依赖or传递依赖于 其它主键列(X1,X2.....)
(2)不允许出现:主键列A 依赖于 其它主键列(X1,X2....),主键列C 依赖于 主键列A
(3)比如一张表:(A,B,C,D),其中(A,B,C)是主键,如果存在(A,B)->C和C->A的关系,违反了BCNF,因为:
a、主键列A对主键列C的直接依赖关系。
b、主键列A对主键列(A,B)的传递依赖关系。
5、总结:
1NF
| 消除非主属性对码的部分依赖
2NF
| 消除非主属性对码的传递依赖
3NF
| 消除主属性对码的部分和传递依赖
BCNF
参考:
http://blog.csdn.net/qingking520/article/details/52937728
http://blog.csdn.net/allenlsy/article/details/5356899
http://blog.csdn.net/g_beginner/article/details/6789308
参考: