MySQL--三大范式(超详解)

目录

一、前言

复制代码
                      欢迎大家来到权权的博客~
        欢迎大家对我的博客进行指导,有什么不对的地方,我会及时改进哦~      

博客主页链接点这里-->:权权的博客主页链接

二、三大范式

设计数据库的时候需要遵从的一些规范,目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

一般情况下满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般来说,数据库只需满足第三范式(3NF)就行了。

2.1概念

范式描述的是数据关系模型,一对一关系。一对多关系,多对多关系

2.2第一范式(1NF)

关系型数据库的一个基本的要求,不满足第一范式就不可以被称为关系型数据库

表里的字段不可再分

举例:设置一个学生表:

2.3第二范式(2NF)

在满足第一范式的基础上,不存在非主键字段对任意候选键的部分函数依赖。(存在于复合主键的情况下)

即在满足第一范式的基础上,还要满足数据表里的每一条数据记录,都是可唯一标识的,而且所有非主键字段,都必须完全依赖主键,不能只依赖主键的一部分。

正例:

反例

学生选修课的成绩表:

学号 学生姓名 课程 学分 成绩
3 小肖 MySQL 3 100

上面这个表可以用学号跟课程作为复合主键来确定同学当前选修课的成绩。

学生的姓名跟课程没有关系 ,也就是说学生的姓名只依赖于学号,不依赖于课程。

学分与学号没有关系 ,也就是说学分依赖于课程,不依赖于学号。

对于由两个或者多个关键字段决定一条记录的情况,如果一行数据中有些字段只与关键字段中的一个有关系,那么这种就说她存在部分函数依赖

如果有这样子的情况就说明这个表不满足第二范式。

学生选修课的成绩表:

学号 学生姓名 课程 学分 成绩
1 小肖 MySQL 3 100
2 小王 MySQL 3 90
3 小强 JAVA 2 80
4 小苏 JAVA 2 85

不满足第二范式会出现的问题(看上表):

1.数据冗余:

学生姓名、课程、学分都重复出现,造成了大量的数据冗余。

2.更新异常:

如果需要调整JAVA的学分,那么就需要更新所有记录关于JAVA的记录,如果一旦某些记录更新成功,某些更新失败,就会造成数据中某一课程学分不一致的情况,表现为数据不一致。

3.插入异常:

(学校新开了一门课,已经定义好了学分,但是学校里面没有任何关于这门课的记录)目前这样的设计,每一门课与同学的考试是对应关系,只有同学进行考试之后才会生成一条关于这门课的成绩记录,这条记录保存了课程的学分,也就是说在学生考试之前在数据库中是没有相应记录的,因为插入的课程信息如果学生的成绩记录为空,没有学生会愿意看到他的成绩是空的,所以是没有意义的,这就是插入异常。

4.删除异常

学生毕业之后,把毕业的同学考试记录全部都删除之后,删除记录的同时,也可能把课程对应的学分全部删除,导致一段时间内,数据库中没有课程和学分的相关信息。

2.3第三范式(3NF)

在第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖。

两个强相关关系存在传递现象,这种传递关系称为传递依赖。比如学生表中拿到学号,可以根据学号拿到学校,根据学校又可以拿到学院等信息。

反例:

学生表:

学号 学生姓名 学院 学院地址 学院电话
2023 小肖 信科院 中国 1069

因为现在要描述的是一个学生表,所以可以看出来学号是一个主键。

在这个表中学生姓名跟学号具有强关系,学院地址跟学院电话是与学院强相关的。

可以看出来,这条记录中出现了两种强相关关系,这两个强相关关系存在传递现象

学生姓名-->学号-->学院-->学院地址-->学院电话

这样的一个传递关系,称为传递依赖 ,这种设置不满足第三范式,因为存在传递依赖。
正例

根据学生与与学院的关系,拆分成两个表即可。

学生表:

学号 学生姓名 学生年龄 学院编号
2023 小肖 20 0052

学院表:

学院编号 学院地址 学院电话
0052 长沙 0735

两张表都依赖于自己表中的主键,学生表可以通过外键与学院之间建立关联关系,第三范式可以解决数据冗余,更新异常,插入异常,删除异常的问题。

欧耶!!!我学会啦!!!

相关推荐
安当加密38 分钟前
MySQL数据库透明加密(TDE)解决方案:基于国密SM4的合规与性能优化实践
数据库·mysql·性能优化
异次元的星星1 小时前
智慧新零售时代:施易德系统平衡技术与人力,赋能门店运营
大数据·零售
007php0071 小时前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
JH30731 小时前
第七篇:Buffer Pool 与 InnoDB 其他组件的协作
java·数据库·mysql·oracle
板凳坐着晒太阳1 小时前
ClickHouse 配置优化与问题解决
数据库·clickhouse
数据库生产实战1 小时前
解析Oracle 19C中并行INSERT SELECT的工作原理
数据库·oracle
深思慎考2 小时前
ElasticSearch与Kibana 入门指南(7.x版本)
大数据·elasticsearch·jenkins
AAA修煤气灶刘哥2 小时前
服务器指标多到“洪水泛滥”?试试InfluxDB?
数据库·后端·面试
银行数字化转型导师坚鹏3 小时前
如何设计优秀的企业微信私域运营实战培训方案
大数据·python·企业微信
阿沁QWQ3 小时前
MySQL服务器配置与管理
服务器·数据库·mysql