很多初学者碰到“三大范式”的相关考试题都一脸懵逼,然后问度娘,翻遍了各种网站也没有一个通俗易懂的答案,
我写这篇文章记录一下自己理解这个问题的过程,总结一下关于范式的问题,也希望可以帮助到大家
每年的软考试题一般都会有一两道关于数据库的题,而“范式”也算是其中的一个难点,很多人在这个地方花费了大量的时间
简单的写一下自己的理解,主要用来辅助理解官方的定义。
简单通俗易理解的定义如下:
范式:数据库设计的规范模式, 是一种规范。一般分为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这篇文章比较容易理解,大家有兴趣的可以看下
https://blog.csdn.net/qq_38712932/article/details/83051288
小结
1.范式:(1NF)无重复的列,符合1NF的关系中的每个属性都不可再分。
2.范式:(2NF)属性完全依赖于主键
3.范式:(3NF)属性不依赖于其它非主属性
有兴趣的朋友可以添加下我的公众号,大家一起成长
公众号名字 “IT铸造室”
IT铸造室,一个关于IT人员百炼成钢的公众号