数据库关系模式范式
范式
关系模型满足的确定约束条件称为范式,根据约束条件级别不同从低到高分为以下六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。六种范式一种比一种更加严格,满足某一种范式也要满足其前面所有范式。
越高的范式数据库冗余越小,一般数据库设计达到3NF就足够了。3NF的关系模型已经能消除冗余和各种异常情况,得到比较满意的效果。
第一范式(1NF)
- 第一范式(1NF)通俗的讲就是无重复的域。
例:表A(b,c,d,d) 属性d有重复则不满足第一范式。删除重复属性表A(b,c,d),则满足。
第二范式(2NF)
- 第二范式(2NF)在第二范式的基础上,属性完全依赖主键。
例:学生表(学号,姓名,年龄,课程名,学分,成绩),这张表的主键是学号,但是成绩属性不能通过主键直接取得,同时依赖于课程名。所以不符合属性完全依赖主键要求,所以不满足第二范式。
上述表要改成:学生表(学号,姓名,年龄) 课程表(课程名,学分) 选课表(学号,课程名,成绩)即可。
第三范式(3NF)
- 第三范式(3NF)在第二范式的基础上,任何非主属性不依赖于其它非主属性,即任何非主属性不得传递依赖于主属性。
例:学生表(学号,姓名,年龄,专业名,专业介绍),课程介绍是依赖于非主属性课程名,这样会造成数据冗余,所以不符合第三范式。
上述表改成:学生表(学号,姓名,年龄,专业名) 专业表(专业名,专业介绍)
反规范化
范式的优点主要是减少数据冗余,节约存储空间,来加快数据库操作的速度。但有时候完全规范的数据库会造成需要更多的连接,从而影响到查询速度。
所以有时需要破坏规范规则,反规范化
以上面使用过得表为例:
学生表(学号,姓名,年龄)
课程表(课程名,学分)
选课表(学号,课程名,成绩)
增加冗余列
- 根据范式要求选课表不需要
姓名属性,该属性是通过学号在学生表中查询的。但是在反规范化设计中为了减少两表的连接操作,我们可以再选课表中增加冗余的姓名属性来减少连接。
增加派生列
-
如果我们需要查询学生
总成绩,我们直接在学生表中添加总成绩属性是不符合规范的,因为总成绩不能完全依赖于学生表主键学号属性。 -
按照规范是需要我们通过连接选课表查询后计算得出的。这样会占用大量的系统资源,所以我们在学生表中添加总成绩属性来提高查询效率。
重组表
- 如果用户需要经常查看数据(学号,课程名,成绩,学分)即课程表和选课表连接以后的数据,则我们将这两个表重新组成一个表来提高性能。

浙公网安备 33010602011771号