首页 > 编程知识 正文

数据库四大范式简单理解,数据库三大范式

时间:2023-05-06 15:18:00 阅读:231634 作者:1982

转自微信

上周四下午的VIP试听课是由芒果给大家介绍的MySQL的一些基础知识,在这里芒果给大家分享其中的一部分内容——对数据库三大范式做个小介绍:

范式(数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则,在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。范式,对于软件的性能、数据库的维护都是我们软件从业人员必须掌握的内容。

 

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。

满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了,所以在这里我也就跟大家介绍这三大范式。这六种范式关系如下图所示:

 

 

第一范式(1NF)

确保每列的原子性(强调的是列的原子性,即列不能够再分成其他几列)。实际上,第一范式是所有关系型数据库的最基本要求。

例:

按照1NF的要求如上图的数据表,它的第三列和第四列明显是不符合原子性的,这两列都可以被分割为两列,要符合第一范式,我们可以将其改为以下形式:

 

 

 

第二范式(2NF)

第二范式依赖第一范式,所以第二范式必须符合第一,然后第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

例:

如上图所示数据表,它的主键为:学号+课程(联合主键),而姓名、系名、系主任都是仅仅依赖于学号,与课程无关,明显不符合第二范式。

对于每一个学生的姓名、系名、系主任信息都重复多次——数据冗余;如果学校新开设一个院系,还未招生,无学号即课程表,则系名跟系主任无法插入表格——插入异常;如果删除某一个系所有学生的成绩信息,那么系名、系主任信息也会随之消失——删除异常;如果修改某个学生的姓名,则表格中多条记录都要进行修改——修改异常

对于这样的表格,我们肯定要进行修改的,那么要怎么修改才能满足第二范式呢?

我们首先来看表格属性的关系图:

从上图我们可以看出姓名、系名都与学号相关;而系主任与系名相关,间接与学号相关;分数与学号+课程名相关。因此我们可以根据这些关系依赖将表格,拆分为以下两个表格:

这样分割之后,表1的分数与主键(学号+课程)相关,表2的姓名、系名、系主任与主键(学号)相关,而非部分相关,满足第二范式要求。

 

第三范式(3NF)

在第二范式的基础上更进一层,目标是确保每列都和主键列直接相关,而不是间接相关(另外非主键列必须直接依赖于主键,不能存在传递依赖)。

上面根据第二范式修改的表格中,在表2中,系主任是通过系名与学号间接相关的,明显不符合第三范式。

并且当一个系有多名学生时(在实际记录中,这是必然情况),系主任信息也会有多条——数据冗余;如果学校新开设一个院系,还未招生,无学号即课程表,则系名跟系主任无法插入表格——插入异常没有解决;如果删除某一个系所有学生的成绩信息,那么系名、系主任信息也会随之消失——删除异常也没有解决。 

对于这样的表格,我们肯定要进行修改的,那么要怎么继续修改才能满足第三范式呢?

我们再来看表格属性的关系图:

从上图我们可以看出姓名、系名都与学号直接相关;而系主任与系名直接相关;分数与学号+课程名相关。因此我们可以根据这些关系依赖将上面的表格2,拆分为以下两个表格,具体表格情况如下:

这样就满足了第三范式,而且对于数据冗余、插入异常、删除异常的情况都得到了解决。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。