很多初学者碰到“三大范式”的相关考试题都一脸懵逼,然后问度娘,翻遍了各种网站也没有一个通俗易懂的答案,

我写这篇文章记录一下自己理解这个问题的过程,总结一下关于范式的问题,也希望可以帮助到大家

每年的软考试题一般都会有一两道关于数据库的题,而“范式”也算是其中的一个难点,很多人在这个地方花费了大量的时间

简单的写一下自己的理解,主要用来辅助理解官方的定义。

一脸懵逼的数据库范式? 第一范式 第二范式 第三范式简介

简单通俗易理解的定义如下:

        范式:数据库设计的规范模式, 是一种规范。一般分为1、2、3和BNC范式,4、5、6几乎不用

        目的 :为了解决数据库设计中的插入、修改、删除异常。一般使用第三范式或BNC范式。数据库仓库中为了提高效率,有时还需要降范式。

 

 先简单说明一下  

1.范式:(1NF)无重复的列,符合1NF的关系中的每个属性都不可再分。

2.范式:(2NF)属性完全依赖于主键

3.范式:(3NF)属性不依赖于其它非主属性

然后上图  

鲁迅先生说的好,emmmmm.。。。看图是最好的学习方法。

第一范式  表如下

下表是正确的第一范式

一脸懵逼的数据库范式? 第一范式 第二范式 第三范式简介

那么错误的写法可能是这样的,下图的属性值(列名)是可以再分的

一脸懵逼的数据库范式? 第一范式 第二范式 第三范式简介

我想通过这两张图片可以很清楚的理解了 第一范式的规范了吧,而且也能看到第一范式存在的问

题 ,仍然会存在数据冗余过大,插入异常,删除异常,修改异常的问题。

第二范式   

在满足第一范式的基础上,消除了非主属性对于码的部分函数依赖

:可以确定其他属性的值得一组属性组

比如  一个表中有   【学号,姓名,系名】  这三个属性

学号可以决定姓名和系名

系名决定不了姓名和学号(一个系中有好多学生)

姓名也决定不了系名和学号(两个名字相同的学生)

那么确定 学号就是这个表中的码,也是主属性,而姓名和系名就是这个表中的非主属性

接下来看下表  找下码

一脸懵逼的数据库范式? 第一范式 第二范式 第三范式简介

比如上图的表中

一脸懵逼的数据库范式? 第一范式 第二范式 第三范式简介

共有这7个属性值

一脸懵逼的数据库范式? 第一范式 第二范式 第三范式简介

按照上图的分析  就可以确定 (学号,课程号)就是这个表中的码

姓名 系名 系主任 课程 分数   这五个属性就是非主属性

(学号,课程)  

​      一脸懵逼的数据库范式? 第一范式 第二范式 第三范式简介​                一脸懵逼的数据库范式? 第一范式 第二范式 第三范式简介

 学号一个属性就可以决定 【姓名,系名,系主任,课程号】这四个非主属性,而不需要课程号

所以这个表不符合2NF范式的条件

消除学号可以决定的这几个属性后  表就可以达到2NF的要求

即可以分为两个表

码 :[学号]  非主属性: 姓名,系名,系主任,课程

一脸懵逼的数据库范式? 第一范式 第二范式 第三范式简介

码:[学号,课程] 非主属性:课程号,分数 

一脸懵逼的数据库范式? 第一范式 第二范式 第三范式简介

 

 这两个表完全符合2NF 范式  

第三范式

3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖

我们从这个表进行分析

一脸懵逼的数据库范式? 第一范式 第二范式 第三范式简介

主属性为学号 ,但是有【系名】可以决定【系主任】,所以不符合3NF的要求

那么怎么办呢

消除这部分依赖就可以了,即这个表可以进行拆分

学生表(学号,姓名,系名,课程)

系表(系名,系主任)

学生表中除主属性之外没有任何依赖关系

系表同上

所有 这两个表都属于3NF

其他范式

BCNF范式,第四范式,第五范式的介绍,CSDN这篇文章比较容易理解,大家有兴趣的可以看下

BCNF范式(修正的第三范式)、第四范式和第五范式

https://blog.csdn.net/qq_38712932/article/details/83051288

 

小结

1.范式:(1NF)无重复的列,符合1NF的关系中的每个属性都不可再分。

2.范式:(2NF)属性完全依赖于主键

3.范式:(3NF)属性不依赖于其它非主属性

有兴趣的朋友可以添加下我的公众号,大家一起成长

公众号名字  “IT铸造室”

IT铸造室,一个关于IT人员百炼成钢的公众号

 

相关文章: