数据库关系模式范式

范式

关系模型满足的确定约束条件称为范式,根据约束条件级别不同从低到高分为以下六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。六种范式一种比一种更加严格,满足某一种范式也要满足其前面所有范式。

越高的范式数据库冗余越小,一般数据库设计达到3NF就足够了。3NF的关系模型已经能消除冗余和各种异常情况,得到比较满意的效果。

第一范式(1NF)

  • 第一范式(1NF)通俗的讲就是无重复的域。

例:表A(b,c,d,d) 属性d有重复则不满足第一范式。删除重复属性表A(b,c,d),则满足。

第二范式(2NF)

  • 第二范式(2NF)在第二范式的基础上,属性完全依赖主键。

例:学生表(学号,姓名,年龄,课程名,学分,成绩),这张表的主键是学号,但是成绩属性不能通过主键直接取得,同时依赖于课程名。所以不符合属性完全依赖主键要求,所以不满足第二范式。

上述表要改成:学生表(学号,姓名,年龄) 课程表(课程名,学分) 选课表(学号课程名,成绩)即可。

第三范式(3NF)

  • 第三范式(3NF)在第二范式的基础上,任何非主属性不依赖于其它非主属性,即任何非主属性不得传递依赖于主属性。

例:学生表(学号,姓名,年龄,专业名,专业介绍),课程介绍是依赖于非主属性课程名,这样会造成数据冗余,所以不符合第三范式。

上述表改成:学生表(学号,姓名,年龄,专业名) 专业表(专业名,专业介绍)

反规范化

范式的优点主要是减少数据冗余,节约存储空间,来加快数据库操作的速度。但有时候完全规范的数据库会造成需要更多的连接,从而影响到查询速度。
所以有时需要破坏规范规则,反规范化

以上面使用过得表为例:

学生表(学号,姓名,年龄)
课程表(课程名,学分)
选课表(学号课程名,成绩)

增加冗余列

  • 根据范式要求选课表不需要姓名属性,该属性是通过学号在学生表中查询的。但是在反规范化设计中为了减少两表的连接操作,我们可以再选课表中增加冗余的姓名属性来减少连接。

增加派生列

  • 如果我们需要查询学生总成绩,我们直接在学生表中添加总成绩属性是不符合规范的,因为总成绩不能完全依赖于学生表主键学号属性。

  • 按照规范是需要我们通过连接选课表查询后计算得出的。这样会占用大量的系统资源,所以我们在学生表中添加总成绩属性来提高查询效率。

重组表

  • 如果用户需要经常查看数据(学号,课程名,成绩,学分)即课程表和选课表连接以后的数据,则我们将这两个表重新组成一个表来提高性能。
posted @ 2021-07-28 11:03  可爱的黑精灵  阅读(1068)  评论(0)    收藏  举报