范式:符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度。
简单来说可以把她粗略理解为一张数据表的表结构所符合的某种设计的级别。就像英语四六级,相对代表了英语水平的高低。范式越高表示数据表越符合设计的标准。满足这些范式的数据库是简洁的、结构明晰的,同时不会发生插入(insert)、删除(delete)和更新(update)操作异常。
数据库的范式分为1NF,2NF,3NF,BCNF,4NF,5NF一般在设计数据库结构的时候最多只要满足3NF就可以了。符合高一级的范式必定包含第一级的范式。
1NF:符合1NF的属性都不可再分。一般用mysql,sqlserver建表时必须满足1NF,否则不能创建成功。属性不可分的即每一个字段是最小的,不包含其他字段,不重复,原子性。
问题:数据冗余,插入异常,删除异常,修改异常的问题。
id | 姓名 | 系名 | 系主任 | 课名 | 分数 |
2017001 | 小花 | 搬砖系 | 小花花 | 高数 | 60 |
2017001 | 小花 | 搬砖系 | 小花花 | 英语 | 99 |
2017001 | 小花 | 搬砖系 | 小花花 | 编程 | 99 |
2017002 | 小明 | 英语系 | 小明明 | 高数 | 80 |
2017002 | 小明 | 英语系 | 小明明 | 英语 | 59 |
2017002 | 小明 | 英语系 | 小明明 | 编程 | 99 |
插入异常:若新建一个系,并且有系主任。但是因为还没有开始学习,所以主键是空的,肯定是不能插入的。
id | 姓名 | 系名 | 系主任 | 课名 | 分数 |
2017001 | 小花 | 搬砖系 | 小花花 | 高数 | 60 |
2017001 | 小花 | 搬砖系 | 小花花 | 英语 | 99 |
2017001 | 小花 | 搬砖系 | 小花花 | 编程 | 99 |
2017002 | 小明 | 英语系 | 小明明 | 高数 | 80 |
2017002 | 小明 | 英语系 | 小明明 | 英语 | 59 |
2017002 | 小明 | 英语系 | 小明明 | 编程 | 99 |
中文系 | 小白 |
删除异常:如果需要把某个系下面学生信息都清空,那么这个系也就不存在了。
修改异常:如果需要把学生的系进行更换,就需要把三条数据里面的系名和系主任都修改才可以。
2NF:在1NF的基础上,消除了非主属性对于码的部分函数依赖。
码:一个表中,可以唯一决定一个元祖的属性“集合”。假设K为表中的某个属性,如果在K确定了的情况下,这个表里面的其他属性都可以确定,那么K就叫做候选码,也叫做码。比如通过ID可以获取到姓名,系名,系主任名,但是不确定课名和分数。氪命可以获取分数。
id------姓名,系名,系主任 课名------分数
(id,课名)这个属性组就叫做码。
非主属性:码里面的属性就是主属性,包括id,课名。不是主属性的就是非主属性,包括姓名,系名,系主任,分数。
函数依赖:函数y=f(x)代表了给定一个x的值,y的值也是确定的,那就说Y函数依赖与X,写作X---Y,比如:在表中,给定一个学号,必定能得到唯一的一个姓名。那就说姓名函数依赖与学号。写作:学号----姓名,在表中的函数依赖还有:学号------系名,学号-------系主任,(学号,课名)-----成绩
完全函数依赖:在一张表中,若x--->y,且对于x的任何一个真子集(假如属性组x包含超过一个属性的话)x',x'->y不成立,那么我们称y对于x完全函数依赖,记做XF--->y.比如(学号,课名)-----成绩,学号和课名都是x的真子集,但是如果只有学号,或者只有课名,是不能得到一个唯一的成绩,满足完全函数依赖的要求,所以y完全依赖与X。
部分函数依赖:如果y函数依赖与x,但是y 不完全函数依赖与x,那就叫做部分函数依赖。比如(学号,课名)------姓名。由学号可以得到唯一的姓名,但是由课名不能的带唯一的姓名。所以称为y部分函数依赖x。
判断是否符合2NF,就是看数据表中是否存在非主属性对于码的部分函数依赖。若存在,则数据表中只符号1NF的要求,若不存在,则符合2NF的要求。步骤:
2NF:
id |
课名 |
分数 |
2017001 |
高数 |
60 |
2017001 |
编程 |
99 |
2017001 |
英语 |
99 |
2017002 |
高数 |
80 |
2017002 |
英语 |
59 |
2017002 |
编程 |
99 |
id |
姓名 |
系名 |
系主任 |
2017001 |
小花 |
搬砖系 |
小花花 |
2017002 |
小明 |
英语系 |
小明明 |
问题:数据冗余,插入异常,删除异常,修改异常的问题。
数据冗余:减少了冗余。 已解决
插入异常:如果需要新建一个系,并且有系主任。但是因为还没有开始学习,所以主键是空的,肯定是不能插入的。
删除异常:如果需要把某个下面的学生信息都清空,那么这个系也就不存在了。
修改异常:如果需要把学生的系进行更换,就需要把三条数据里面的系名和系主任都修改了才可以。2NF可以只修改有个字段就可以实现。已解决
3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。也就是说,如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。
传递函数依赖:如果y依赖于x,z又依赖于y,那就说z依赖于x.
比如:系名依赖于学号,系主任依赖于系名,那么系主任传递依赖函数依赖于雪号。不满足3NF.
3NF:
id | 课名 | 分数 |
2017001 | 高数 | 60 |
2017001 | 英语 | 99 |
2017001 | 编程 | 99 |
2017002 | 高数 | 80 |
2017002 | 英语 | 59 |
2017002 | 编程 | 99 |
id | 姓名 | 系名 |
2017001 | 小花 | 搬砖系 |
2017002 | 小明 | 英语系 |
系名 | 系主任 |
搬砖系 | 小花花 |
英语系 | 小明明 |
插入异常和删除异常 已解决
常见问题:
1NF,2NF,3NF特点是什么,怎么区分?
1NF是否有原子性,2NF是否存在部分函数依赖,3NF是否存在传递函数依赖