mysql三范式_MySQL三大范式

第一范式(1NF)

数据表的每一列都要保持它的原子特性,也就是列不能再被分割。

4cb4da718b57d50f65646ed25092e761.png

这张表就不符合第一范式规定的原子性,不符合关系型数据库的基本要求,在关系型数据库中创建这个表的操作就不能成功。不得不将数据表设计为如下形式。

89b1a4733ead04336cfeb903e06e0c38.png

第二范式(2NF)

概率:属性必须完全依赖于主键。

下满这张表不符合第二范式的要求。

461a07421909b89df157cc372695d4af.png

缺点

表中的第一行数据都存储了系名、系主任,数据的冗余太大

如果有一个新的系还没有开始找到学生,那么不能讲该系的信息添加到数据表中去,从数据表中看不到该系的存在

如果将某个系的学生信息全部删除,那么这个系在数据表里也就不存在了,但这个系还存在。

如果某个人要转系,那么为了保证数据库中数据的一致性,需要修改三条记录中系与系主任的数据

依赖

在数据表中,属性(属性组)X确定的情况下,能完全退出来属性Y完全依赖于X。

完全依赖

完全依赖是针对于属性组来说,当一组属性X能推出来Y的时候就说Y完全依赖于X。

部分依赖

一组属性X中的其中一个或几个属性能推出Y就说Y部分依赖于X。

结论:当一个第一范式的候选码只有一个属性的时候,那它就是第二范式(2NF)

候选码

当一个属性或者属性组确定的情况下,这张表的其余所有属性就能确定下来,这个属性或者属性组就叫做或候选码。

一张表可以有多个候选码

一般只选一个候选码作为主键

从表中找到两个属性:学号和课程

学号可以推出姓名、系名、系主任。

课程可以推出成绩。

将它们两个设置为联合主键

467228182b91a05d70b717c4c001b4c9.png

存在的部分依赖

姓名对学号存在部分依赖

系名对学号存在部分依赖

系主任对学号存在部分依赖

这显然不符合第二范式的要求,做出修改:

5edc16b492b2bea1ec2259c22f1309c5.png

表一中分数完全依赖于学号和课程的属性

表二中姓名、系名、系主任完全依赖于学号的属性

第二范式消除了第一范式的部分依赖

第三范式(3NF)

概念:所有的非主属性不依赖于其他的非主属性

传递函数依赖

设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。

在改进后的学生表中:

主属性:学号

非主属性:姓名、系名、系主任

知道系名可以推出系主任,所以非主属性系主任对主属性学号存在传递函数依赖,这不符合非主属性不依赖于其它的非主属性的设计要求。将该数据表改进如下:

36f3d2d09d1a4be7ce654b4baa107f1b.png

bc852ffa094c76c57471d932b819f05f.png

第三范式消除了第二范式的传递函数依赖

BC 范式

主属性不能对候选码存在部分函数依赖或者传递函数依赖

fc659464281f513ad6ce865c56065b09.png

这张表不存在部分函数依赖于传递函数依赖,属于第三范式

表中的依赖关系

仓库名—————>管理员

管理员—————>仓库名

物品名—————>数量

主属性:仓库名、管理员、物品名

非主属性:数量

存在的问题

先新添加一个仓库,但尚未存放任何物品,不可以为该仓库指派管理员,因为物品名也是主属性,根据实体完整性的要求,主属性不能为空

某仓库被清空后,该仓库的信息也被清空

当需要更新仓库管理员,该仓库存放了多少物品,就要修改多少条信息。

在这个问题中就是存在了主属性对于候选码的部分依赖,也就是仓库名对于管理员和物品名的部分依赖。

修改为

仓库(仓库名,管理员)

库存(仓库名、物品数、数量)

范式的目的

减小数据的冗余性

提高效率

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

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值