数据库设计的三大范式

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

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

通常在项目中,前三种方式就知足咱们的需求了数据库设计

第一范式:设计

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

  例如(学生信息表):
  学生编号   姓名   性别       联系方式
  20080901    张三     男   email:zs@126.com,phone:88886666
  20080902    李四     女   email:ls@126.com,phone:66668888email

以上的表就不符合,第一范式:联系方式字段能够再分,因此变动为正确的是:数据

  学生编号   姓名   性别     联系方式     电话
  20080901    张三     男   email:zs@126.com  88886666
  20080902    李四     女   email:ls@126.com  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讲师

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

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

相关文章
相关标签/搜索