数据库设计的三大范式

Posted Demon神秘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库设计的三大范式相关的知识,希望对你有一定的参考价值。

什么是范式:为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)

一般在项目中,前三种方式就满足我们的需求了

第一范式:

  简单的说,数据表中的每一列(每个字段)必须是不可拆分的最小单元。每一个属性都是原子项,不可分割。
  第一范式是关系模式应具备的最起码的条件,如果数据库设计不能满足第一范式,就不称为关系型数据库。关系数据库设计研究的关系规范化是在1NF之上进行的。

  例如(学生信息表):
  学生编号   姓名   性别       联系方式
  20080901    张三     男   email:[email protected],phone:88886666
  20080902    李四     女   email:[email protected],phone:66668888

以上的表就不符合,第一范式:联系方式字段可以再分,所以变更为正确的是:

  学生编号   姓名   性别     联系方式     电话
  20080901    张三     男   email:[email protected]  88886666
  20080902    李四     女   email:[email protected]  66668888

第二范式(2NF)
简单的说,第二范式要满足以下的条件:首先要满足第一范式,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情

  例如(学生选课表):
  学生   课程     教师     教师职称       教材       教室   上课时间
  李四   Spring   张老师   java讲师   《Spring深入浅出》   301   08:00
  张三   Struts    杨老师   java讲师   《Struts in Action》   302   13:30

这里通过(学生,课程)可以确定教师、教师职称,教材,教室和上课时间,所以可以把(学生,课程)作为主键。但是,教材并不完全依赖于(学生,课程),只拿出课程就可以确定教材,因为一个课程,一定指定了某个教材。这就叫不完全依赖,或者部分依赖。出现这种情况,就不满足第二范式。

  修改后,选课表:
  学生   课程     教师      教师职称   教室   上课时间
  李四   Spring   张老师   java讲师   301   08:00
  张三   Struts    杨老师   java讲师   302   13:30

课程表:
  课程       教材 
  Spring   《Spring深入浅出》 
  Struts   《Struts in Action》

所以,第二范式可以说是消除部分依赖。第二范式可以减少插入异常,删除异常和修改异常。

第三范式(3NF)
第三范式要满足以下的条件:首先要满足第二范式。要求:表中的每一列只与主键直接相关而不是间接相关,

上例中修改后的选课表中,一个教师能确定一个教师职称。这样,教师依赖于(学生,课程),而教师职称又依赖于教师,这叫传递依赖。第三范式就是要消除传递依赖。

  修改后,选课表:

  学生   课程        教师    教室   上课时间
  李四   Spring   张老师   301   08:00
  张三   Struts    杨老师   302   13:30

  

    教师表:
    教师   教师职称
  张老师   java讲师
  杨老师   java讲师

这样,新教师的职称在没被选课的时候也有地方存了,没人选这个教师的课的时候教师的职称也不至于被删除,修改教师职称时只修改教师表就可以了。

简单的说,
第一范式就是原子性,字段不可再分割;
第二范式就是完全依赖,没有部分依赖;
第三范式就是没有传递依赖。

以上是关于数据库设计的三大范式的主要内容,如果未能解决你的问题,请参考以下文章

数据库设计的三大范式

数据库设计三大范式

数据库设计三大范式

数据库设计的三大范式

关系型数据库设计三大范式

数据库设计三大范式