什么是范式:为了创建冗余较小、结构合理的数据库,设计数据库时必须遵循必定的规则。在关系型数据库中这种规则就称为范式。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讲师
这样,新教师的职称在没被选课的时候也有地方存了,没人选这个教师的课的时候教师的职称也不至于被删除,修改教师职称时只修改教师表就能够了。
简单的说,第一范式就是原子性,字段不可再分割;第二范式就是彻底依赖,没有部分依赖;第三范式就是没有传递依赖。