数据库的三大范式讲解
在讲解数据库的三大范式之前,我们需要了解一些基本概念,我们可以通过一张表来对这些概念进行更好的理解
-
函数依赖: A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A。
例如:(A)学号–>(B)姓名。
(A)(学号,课程名称) -->(B) 课程分数 -
完全函数依赖: A–>B,如果A是一个属性组,则B属性值进行确定时,要依赖于A属性组中所有的属性值,缺一不可。
例如:(A)(学号, 课程名称) --> (B)课程分数
//必须通过学号和课程名称才能确定课程分数 -
部分函数依赖: A–>B,如果A是一个属性组,则B属性值进行确定只需要依赖于A属性组中某一些值即可。
例如: (学号, 课程名称)–>(B)姓名
//只需要学号便可确定该生的姓名,并不需要A属性组中的课程名称来确定姓名。 -
传递函数依赖: A–>B, B–>C .如果通过A属性(属性组)的值,可以确定唯一B属性的值,再通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A。
例如:(A)学号–>(B)系名,(B)系名–>©系主任
//通过学号可以找到系名,通过系名可以确定系主任 -
码:如果在一张表中,一个属性或者属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如:该表中码是一个属性组,该属性组为: (学号, 课程名称),
*主属性:码属性组中的所有属性
*非主属性:除过码属性组的属性组.
引出问题:
- 存在非常严重的数据冗余(重复): 例如:(姓名、系名、系主任)这一个属性组重复了很多次
- 数据添加存在问题:
例如:添加新开设的系和系主任时,因为没有招入学生,所以会导致数据不合法而无法添加新开设的系和系主任。 - 数据删除存在问题:
例如:张无忌同学毕业了,需要删除其所有数据,但会将经济系和该系的系主任的数据一起删除,并不符合逻辑,学生一走,难道就让整个系消失吗,显然相当不合理。
那么既然存在这么多的问题,那就说明我们这个数据库的学生表就创建的很有问题,那么我们该如何解决这些问题呢?这就需要请出我们的数据库三大范式来解决了
第一范式(1NF):
概念:
在一张表中,每一列都是不可分割的原子数据项。
实际操作:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e2ec574fd0cb6567fd5f3739f00ccc2f.png)
这一列就不符合第一范式的要求,系中竟然包含了两列——系名和系主任,我们只需要将其直接划分为两列即可,因为数据库的创建要求下也无法写成上述的样子,所以第一范式较好理解。
此表符合了数据库的第一范式
第二范式(2NF):
概念:
在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非码属性对主码的部分函数依赖)
欲解决的问题:
存在非常严重的数据冗余(重复):
例如:(姓名、系名、系主任)这一个属性组重复了很多次。
实际操作:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/082a4c20e26337a6c3eb41a082f7e3ad.png)
将原来的表拆分成两个表,一个选课表,一个学生表。
选课表:
- 码:属性组(学号,课程名称)
- 非码:分数
非码属性(分数)必须由主码属性组(学号,课程名称)确定,缺一不可。
学生表:
码:学号
非码:姓名 、系名、系主任
非码属性(姓名 、系名、系主任)都可由主码属性(学号)确定。
解决的问题:
消除了 类似(A)(学号, 课程名称)–>(B)姓名 这种B对A的部分函数依赖
同时也消除了(姓名、系名、系主任)这一个属性组重复了很多次的问题。
未解决的问题:
- 数据添加存在问题: 例如:添加新开设的系和系主任时,因为没有招入学生,所以会导致数据不合法而无法添加新开设的系和系主任。
- 数据删除存在问题:
例如:张无忌同学毕业了,需要删除其所有数据,但会将经济系和该系的系主任的数据-起删除,并不符合逻辑,学生一走,难道就让整个系消失吗,显然相当不合理。
第三范式(3NF):
概念:
在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF 基础上消除传递依赖)
欲解决的问题:
- 数据添加存在问题: 例如:添加新开设的系和系主任时,因为没有招入学生,所以会导致数据不合法而无法添加新开设的系和系主任。
- 数据删除存在问题:
例如:张无忌同学毕业了,需要删除其所有数据,但会将经济系和该系的系主任的数据一起删除,并不符合逻辑,学生一走,难道就让整个系消失吗,显然相当不合理。
实际操作:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4f4a22169fc247c574429d496829e87e.png)
将学生表再细分为学生表和系表:
消除了之前可以通过学号找到系名,再从系名找到系主任存在的系主任对于学号的传递函数依赖关系
解决的问题:
- 数据添加存在问题: 例如:添加新开设的系和系主任时,可以在系表上直接添加,这一操作变得合法。
- 数据删除存在问题:
例如:张无忌同学毕业了,需要删除其所有数据,但却不会将经济系和该系的系主任的数据一起删除,该系和系主任依旧存在于系表中。
至此:
我们已经将原表中存在的问题通过数据库的三大范式一一解决了,我们也从实际操作中更好的对三大范式进行了一定的理解,数据库的三大范式是规范数据库中的表创建的准则,我们需要对其进行充分的理解后才能创建出更合理的数据库,已达到方便我们对数据的操作。
扩展:
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般来说,数据库只需满足第三范式(3NF)就行了。
大家如果对后面的三个范式感兴趣的话。可以自行查阅资料,以完善我们对数据库的知识体系。