#SQL:函数依赖、范式、第一范式(1NF)、第二范式(2NF)、第三范式(3NF) @FDDLC

一、函数依赖与码

X->Y,即由X能确定Y,或者说一个已知的X能确定一个唯一的Y,则称Y依赖于Y(跟初中的函数定义一致)。

一个学生只能属于一个学院,即知道学号X,就能确定对应的学院代码Y,所以学院代码Y依赖于学号X。

1、部分函数依赖

Y由X中的部分即能确定,比如(学号,姓名)->(系主任),显然,只需(学号,姓名)里的学号就能确定系主任!因此:(系主任)部分函数依赖于(学号,姓名)

2、完全函数依赖(可对比部分函数依赖)

Y由X中的全部属性确定,比如(学号,课程号)->某科成绩,显然,因为一个学号一般有多个课程的成绩,即一个所以要查某科的成绩,需要同时知道学号和课程号。即:(某科成绩)完全函数依赖于(学号,课程号)。

3、传递函数依赖

学号->系,系->系主任

从上可知,系主任函数依赖于系,系函数依赖于学号,因此系主任传递依赖于学号

4、主码(主键)

主码中的属性叫做主属性,其他属性叫做非主属性。

比如:(学号,姓名,性别)中,学号为主码(主键),因此学号为主属性,姓名和性别是非主属性。

比如:(学号,课程号,成绩)中,(学号,课程号)为主键,因此学号和课程号为主属性,成绩为非主属性。

 

二、第一范式:1NF

表中的每个属性都是不可分割的原子项。

一张Excel表:

上面的部门不是原子项,不符合1NF!

注:在数据库中创建不了具有非原子项的表!即数据库中创建的表都满足1NF。

 

三、第二范式(2NF):在1NF的基础上

在(学号,姓名,课程号,成绩,系号,系主任)中,主键至少要包含学号和课程号(成绩得由学号和课程号共同确定),因此可选(学号,课程号)为主键

因为主键是(学号,课程号),因此学号和课程号是主属性,姓名、成绩、系号和系主任是非主属性。成绩的确是完全函数依赖于主键,但系号不是(系主任和姓名同理),系号部分函数依赖于主键(由主键中的学号即可确定系号)。因此存在非主属性对主键的部分函数依赖

如果把非主属性对主键的部分函数依赖消除了,或者说如果不存在非主属性对主键的部分函数依赖,那么就满足2NF。

把上面的(学号,姓名,课程号,成绩,系号,系主任)拆成两张表即可:(学号,姓名,系号,系主任),(学号,课程号,成绩),其中红色的属性为对应表的主键。

 

四、第三范式(3NF):在2NF的基础上

在上面的【三】中,我们把(学号,姓名,课程号,成绩,系号,系主任)拆成了(学号,姓名,系号,系主任)和(学号,课程号,成绩),这样就符合第二范式。但这样就完美了吗?当然不是!

仔细分析可以发现,(学号,姓名,系号,系主任)中的非主属性系主任依赖于非主属性系号,即非主属性之间存在函数依赖!

或者换一个角度:系主任依赖于系号,系号依赖于学号,即系主任传递依赖于学号,存在传递依赖!

如果消除了传递依赖,或者说消除了非主属性之间的函数依赖,那么就符合第三范式!

把(学号,姓名,系号,系主任)继续拆分,变成(学号,姓名)和(系号,系主任),/*其中红色的为主键*/,就符合3NF了。

 

五、其他

3NF往上是BCNF,BCNF往上是4NF,4NF往上是5NF。因为一般满足3NF就够了,故本文不对更严格的范式进行介绍。

 

  • 1
    点赞
  • 19
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论

打赏作者

凡我出品,皆属精品

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值