一、第一范式(1NF)
要求:
要求:每一个分量必须是不可分的数据项。
特点:
1)有主键,且主键不能为空。
2)字段不能再分。
示例:(以下例子不满足第一范式)
学号 | 年龄 | 信息 |
101 | 19 | 湖北武汉市,电话:12345678 |
101 | 20 | 湖北 |
主键:学号
不满足原因:1)主键重复。2)信息字段可以再分
二、第二范式(2NF)
要求:在范式一的基础上,且每一个非主属性完全函数依赖于主键。
特点:
1)满足第一范式。
2)表中的每一个非主属性,必须完全依赖于本表主键。
3)只有当一个表中,主键由两个或以上的属性组成的时候,才会出现不符合第二范式的情况。
示例:(以下例子不符合第二范式)
学号 | 课程号 | 得分 | 课程名 |
101 | 003 | 95 | 数据库 |
主键:学号,课程号
不满足原因:课程名不完全依赖于所定义的所有主键,课程名部分依赖于主键课程号。
三、第三范式(3NF)
要求:在第二范式的基础上,且消除传递依赖性
1)满足第二范式
2)所有的非主键列依赖于主键列
注:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余,但是没有数据冗余的数据库并不一定是最好的数据库,所以有没有冗余的设计,要综合来考虑
学生 | 课程 | 老师 | 老师职称 | 教室 | 上课时间 |
小明 | 语文 | 王五 | 讲师 | 110 | 8:30 |
上面的“学生上课表”符合2NF,可以这样验证:两个主属性单独使用,不能确定其它四个非主属性的任何一个。但是它有传递依赖!在“老师”和“老师职称”这里,一个老师一定能确定一个老师职称。
如果不消除这种传递依赖,有可能会出现:
1、老师职称变了,变教授了,要改数据库,表中有N条,改了N次……(修改异常)
2、没人选这个老师的课了,老师的职称也没了记录……(删除异常)
3、新来一个老师,还没分配教什么课,他的职称记到哪?……(插入异常)
所以为了解决这些问题应把表拆分成:学生 | 课程 | 老师 | 教室 | 上课时间 |
小明 | 语文 | 王五 | 110 | 8:30 |
老师 | 老师职称 |
大宝 | 讲师 |
版权声明:本博客为记录本人自学感悟,内容大多从网上学习与整理所得,若侵权请告知!
https://mp.csdn.net/postedit/80365677