各大范式总结(搜索了各方资料,自留,待补充修改)

本文详细介绍了数据库设计中的函数依赖、完全函数依赖、部分函数依赖和传递函数依赖,以及第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF。通过实例解析了每个范式的概念和应用,展示了如何从不满足范式逐步转化为满足范式的设计过程,以减少数据冗余和提高数据一致性。
摘要由CSDN通过智能技术生成

此内容有查看借鉴于知乎、B站视频(暂时没找到具体是哪个视频了,后面附上~):

作者:知乎用户
链接:如何理解关系型数据库的常见设计范式? - 知乎
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

目录

先总结一下各种函数依赖:

函数依赖:

完全函数依赖:

部分函数依赖:

传递函数依赖:

1NF:属性都不可再分,强调列的原子性

2NF:不能存在部分依赖关系

        判断是否符合2NF,就是看数据表中是否存在非主属性对于码的部分函数依赖。若存在则数据表最高只符合1NF的要求,若不存在则符合2NF的要求。

2NF所存在的问题:

3NF:不能存在传递依赖关系

        3NF在2NF的基础之上消除了非主属性对于码的传递函数依赖。也就是说,如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。

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之后,这时候清空只需要清空第二个表,不会影响其他表。不会出现异常。

BCNF:在3NF的基础上,不存在主属性对于码的部分与传递函数依赖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值