数据库的三大范式讲解(大白话+图文 小白看了都能懂)

数据库的三大范式讲解

在讲解数据库的三大范式之前,我们需要了解一些基本概念,我们可以通过一张表来对这些概念进行更好的理解

数据库的三大范式讲解(大白话+图文 小白看了都能懂)_第1张图片

  1. 函数依赖: A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A。
    例如:(A)学号–>(B)姓名。
    (A)(学号,课程名称) -->(B) 课程分数

  2. 完全函数依赖: A–>B,如果A是一个属性组,则B属性值进行确定时,要依赖于A属性组中所有的属性值,缺一不可。
    例如:(A)(学号, 课程名称) --> (B)课程分数
    //必须通过学号和课程名称才能确定课程分数

  3. 部分函数依赖: A–>B,如果A是一个属性组,则B属性值进行确定只需要依赖于A属性组中某一些值即可。
    例如: (学号, 课程名称)–>(B)姓名
    //只需要学号便可确定该生的姓名,并不需要A属性组中的课程名称来确定姓名。

  4. 传递函数依赖: A–>B, B–>C .如果通过A属性(属性组)的值,可以确定唯一B属性的值,再通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A。
    例如:(A)学号–>(B)系名,(B)系名–>©系主任
    //通过学号可以找到系名,通过系名可以确定系主任

  5. 码:如果在一张表中,一个属性或者属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
    例如:该表中码是一个属性组,该属性组为: (学号, 课程名称),
    *主属性:码属性组中的所有属性
    *非主属性:除过码属性组的属性组.

引出问题:

  1. 存在非常严重的数据冗余(重复): 例如:(姓名、系名、系主任)这一个属性组重复了很多次
  2. 数据添加存在问题:
    例如:添加新开设的系和系主任时,因为没有招入学生,所以会导致数据不合法而无法添加新开设的系和系主任。
  3. 数据删除存在问题:
    例如:张无忌同学毕业了,需要删除其所有数据,但会将经济系和该系的系主任的数据一起删除,并不符合逻辑,学生一走,难道就让整个系消失吗,显然相当不合理。

那么既然存在这么多的问题,那就说明我们这个数据库的学生表就创建的很有问题,那么我们该如何解决这些问题呢?这就需要请出我们的数据库三大范式来解决了

第一范式(1NF):

概念:

在一张表中,每一列都是不可分割的原子数据项。

实际操作:数据库的三大范式讲解(大白话+图文 小白看了都能懂)_第2张图片

这一列就不符合第一范式的要求,系中竟然包含了两列——系名和系主任,我们只需要将其直接划分为两列即可,因为数据库的创建要求下也无法写成上述的样子,所以第一范式较好理解。

数据库的三大范式讲解(大白话+图文 小白看了都能懂)_第3张图片此表符合了数据库的第一范式

第二范式(2NF):

概念:

在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非码属性对主码的部分函数依赖)

欲解决的问题:

存在非常严重的数据冗余(重复):
例如:(姓名、系名、系主任)这一个属性组重复了很多次。

实际操作:数据库的三大范式讲解(大白话+图文 小白看了都能懂)_第4张图片

将原来的表拆分成两个表,一个选课表,一个学生表。

选课表:

  • 码:属性组(学号,课程名称)
  • 非码:分数

非码属性(分数)必须由主码属性组(学号,课程名称)确定,缺一不可。

学生表:
码:学号
非码:姓名 、系名、系主任
非码属性(姓名 、系名、系主任)都可由主码属性(学号)确定。

解决的问题:

消除了 类似(A)(学号, 课程名称)–>(B)姓名 这种B对A的部分函数依赖
同时也消除了(姓名、系名、系主任)这一个属性组重复了很多次的问题。

未解决的问题:

  • 数据添加存在问题: 例如:添加新开设的系和系主任时,因为没有招入学生,所以会导致数据不合法而无法添加新开设的系和系主任。
  • 数据删除存在问题:
    例如:张无忌同学毕业了,需要删除其所有数据,但会将经济系和该系的系主任的数据-起删除,并不符合逻辑,学生一走,难道就让整个系消失吗,显然相当不合理。

第三范式(3NF):

概念:

在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF 基础上消除传递依赖)

欲解决的问题:

  • 数据添加存在问题: 例如:添加新开设的系和系主任时,因为没有招入学生,所以会导致数据不合法而无法添加新开设的系和系主任。
  • 数据删除存在问题:
    例如:张无忌同学毕业了,需要删除其所有数据,但会将经济系和该系的系主任的数据一起删除,并不符合逻辑,学生一走,难道就让整个系消失吗,显然相当不合理。

实际操作:数据库的三大范式讲解(大白话+图文 小白看了都能懂)_第5张图片

将学生表再细分为学生表和系表:
消除了之前可以通过学号找到系名,再从系名找到系主任存在的系主任对于学号的传递函数依赖关系

解决的问题:

  • 数据添加存在问题: 例如:添加新开设的系和系主任时,可以在系表上直接添加,这一操作变得合法。
  • 数据删除存在问题:
    例如:张无忌同学毕业了,需要删除其所有数据,但却不会将经济系和该系的系主任的数据一起删除,该系和系主任依旧存在于系表中。

至此:

我们已经将原表中存在的问题通过数据库的三大范式一一解决了,我们也从实际操作中更好的对三大范式进行了一定的理解,数据库的三大范式是规范数据库中的表创建的准则,我们需要对其进行充分的理解后才能创建出更合理的数据库,已达到方便我们对数据的操作。

扩展:

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般来说,数据库只需满足第三范式(3NF)就行了。
大家如果对后面的三个范式感兴趣的话。可以自行查阅资料,以完善我们对数据库的知识体系。

你可能感兴趣的:(mysql)