此内容有查看借鉴于知乎、B站视频(暂时没找到具体是哪个视频了,后面附上~):
作者:知乎用户
链接:如何理解关系型数据库的常见设计范式? - 知乎
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处
目录
判断是否符合2NF,就是看数据表中是否存在非主属性对于码的部分函数依赖。若存在则数据表最高只符合1NF的要求,若不存在则符合2NF的要求。
3NF在2NF的基础之上消除了非主属性对于码的传递函数依赖。也就是说,如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。
BCNF:在3NF的基础上,不存在主属性对于码的部分与传递函数依赖
先总结一下各种函数依赖:
函数依赖:
函数y=f(x)代表了给定一个x的值 ,y的值也是确定的。在数据表中在属性X确定的情况下 ,必定能确定Y的值,那就说Y函数依赖与X写作X--Y。
相当于:y为学号,如果得知一个学号y,那么就可以查到对应的学生x,即姓名依赖于学号(学号——姓名)
例如下方表中的依赖关系为:
学号——姓名
学号——系名
学号——系主任
学号、课名——分数
完全函数依赖:
在一张表中,若X→Y且对于 X的任何一个真子集(假如属性组X包含超过一个属性的话),X'→Y不成立,那么我们称 Y对于X完全函数依赖 记作XF- Y。
比如:(学号,课名) ----分数
学号和课名都是X(分数)的真子集,但是如果只有学号或者只有课名,是不能得到一个唯一的分数,分数是依赖于学号和课名这两个数据的,满足完全函数依赖的要求,所以Y完全函数依赖于X
部分函数依赖:
如果Y函数依赖于X但是Y不完全函数依赖于X那就叫做部分函数依赖。
比如:通过(学号,课名)------姓名
由学号可以得到唯一的姓名,但是由课名不能得到唯一的姓名,姓名是只依赖于学号的,不依赖课名。所以称为Y部分函数依赖X。
传递函数依赖:
如果Y依赖于X Z又依赖于Y 那就说Z依赖传递函数依赖于X。
比如:系名依赖于学号,系主任依赖于系名 ,那么系主任传递函数依赖于学号。不满足3NF
原表格:
学号 | 姓名 | 系名 | 系主任 | 课程 | 分数 |
1001 | 小明 | 文学系 | 小王 | 语文、数学 | 66、77 |
1NF:属性都不可再分,强调列的原子性
由于表格中课程下是有两个不同的课程的(语文、数学),分数列中也是分别显示了两个分数(66、77)
列是可再分的,所以不属于:1NF
可针对表格进行调整拆分:
学号 姓名 系名 系主任 课程 分数 1001 小明 文学系 小王 语文 66 1001 小明 文学系 小王 数学 77
调整后,课程和分数这两项都已经被拆分为两行显示了,没有可再分的列了,所以是满足:1NF的
2NF:不能存在部分依赖关系
判断是否符合2NF,就是看数据表中是否存在非主属性对于码的部分函数依赖。
若存在则数据表最高只符合1NF的要求,若不存在则符合2NF的要求。
由上方的1NF的二维表可知:
1、先找出数据表中所有的码。(即:学号,课名)
2、根据第一步所得到的码找出所有的主属性。(即:学号,课名)
3、数据表中除去所有的主属性,剩下的就都是非主属性了。(即:姓名,系名,系主任,分数)
4、查看是否存在非主属性对码的部分函数依赖。(相当于有两个主属性的情况下,是否有非主属性是只通过一个主属性就可以确定的)
即:对于(学号,课名)→姓名,有“学号”即可得→“姓名”,存在非主属对码的部分函数依赖
由上方的步骤查询后可知:
上方的表格中,存在非主属性部分函数依赖,即:对于(学号,课名)→姓名,有“学号”即可得→“姓名”,所以不为:2NF
可针对表进行拆分,拆分为2NF表:
表一:(姓名完全依赖于学号,系名、系主任这两个字段同上)
学号 姓名 系名 系主任 1001 小明 文学系 小王 表二:(分数完全依赖于学号和课名)
学号 课程 分数 1001 语文 66 1001 数学 77
2NF所存在的问题:
数据冗余:由于将课程、分数这个数据拆分出来了,所以表一中可以只显示一条学生数据,不再多行重复显示
插入异常:如果需要新建一个系并且有系主任。 但是因为还没有学生开始学习,所以学号的这个主键是空的,是不能进行插入的.
删除异常:如果需要把某个系下面学生信息都清空,根据主键学号,将学生信息删除的话,那么这个系也会被统一删除,不存在了。
修改异常:1NF如果需要把学生的系进行更换就需要把两条数据里面的系名和系主任都修改才可以。2NF可以只修改一个字段就可以实现。
3NF:不能存在传递依赖关系
3NF在2NF的基础之上消除了非主属性对于码的传递函数依赖。也就是说,如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。
由上方的2NF二维表可知:
系名依赖于学号,系主任依赖于系名 ,那么系主任传递函数依赖于学号。是不满足3NF的
可针对2NF表进行拆分,拆分为3NF表:
表一:(由于将系名和系主任这两个字段又拆分了一个表,系主任不再是传递依赖于学号,没有其他的传递依赖关系,所以为:3NF)
学号 姓名 系名 1001 小明 文学系 表二:
系名 系主任 文学系 小王 表三:
学号 课程 分数 1001 语文 66 1001 数学 77
3NF存在问题:
插入异常:2NF的情况下,如果需要新建一个系并且有系主任。 但是因为还没有学生开始学习所以主键是空的 ,肯定是不能插入的。将表格拆分为3NF之后,现在需要新建一个系是不会出问题的。
删除异常:2NF的情况下,如果需要把某个系下面学生信息都清空,那么这个系也就不存在了。将表格拆分为3NF之后,这时候清空只需要清空第二个表,不会影响其他表。不会出现异常。