-
关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
-
1NF:原子性,无重复的列,每一列都是不可分割的基本数据项,同一列中不能有多个值,每一列属性都是不可再分的属性值。
不符合:
1NF是所有关系型数据库的最基本要求。
如果只满足1NF,可能造成数据冗余过大。(插入异常、删除异常、修改异常) -
2NF:唯一性,属性完全函数依赖于主键。首先满足第一范式。一个表中的非主键字段、完全依赖于主键字段。消除部分依赖。
函数依赖:若在一张表中,在属性或属性组X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X(X相同是,Y必然相同)。
Y完全函数依赖于X,表示Y不函数依赖于X’(X的一部分)。也就是说X的一部分不能决定Y,即不存在部分函数依赖(如果X的一部分就能唯一确定Y,则存在数据冗余)。找到当前表中的主属性(码中的属性):除 K 之外的所有属性都完全函数依赖于 K。(如果码只有一个属性,则不可能存在部分函数依赖)
看是否存在非主属性对码的部分函数依赖。
如果存在,则将数据表进行拆分(模式分解)。
消除这些部分函数依赖,只有一个办法,就是将大数据表拆分成两个或者更多个更小的数据表,在拆分的过程中,要达到更高一级范式的要求,这个过程叫做”模式分解“。满足2NF可以改善数据冗余和修改异常,但还是可能存在删除异常、插入异常等。
-
3NF:独立性,消除传递依赖,属性不依赖于其它非主属性。首先满足第二范式。要求一个数据库表中不包含在其他表中已包含的非主键字段。
例如:学生表:学生(学号,姓名,系名,系主任),主属性为学号,非主属性为姓名、系名和系主任。因为 学号 → 系名,同时 系名 → 系主任,所以存在非主属性系主任对于码学号的传递函数依赖。
符合3NF要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。当然,在实际中,往往为了性能上或者应对扩展的需要,经常做到2NF或者1NF。
-
BCNF:在某些特殊情况下,即使关系模式符合 3NF 的要求,仍然存在着插入异常,修改异常与删除异常的问题。即满足3NF时,还是有可能存在主属性对于码的部分函数依赖与传递函数依赖。BCNF就是在3NF的基础上消除主属性对于码的部分和传递函数依赖。
如果R∈3NF,且只有一个候选码,则R∈BCNF
数据库设计的三范式
最新推荐文章于 2022-12-11 23:05:05 发布