MYSQL-设计表

一.范式

数据库的范式是⼀组规则。在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数 据库,这些不同的规范要求被称为不同的范式。 关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)、巴斯-科德 范式(BCNF)、第四范式(4NF)和第五范式(5NF,⼜称完美范式),越⾼的范式数据库冗余越 ⼩。然⽽,普遍认为范式越⾼虽然对数据关系有更好的约束性,但也可能导致数据库IO更繁忙,因此 在实际应⽤中,数据库设计通常只需满⾜第三范式即可。

数据库IO繁忙:表建的越多越繁忙

1.第一范式

定义:数据库表的每⼀列都是不可分割的原⼦数据项,⽽不能是集合,数组,对象等⾮原⼦数据。

就是说,表里的每一个数据都不能继续拆分

反例:比如说制作一张学校信息的表,里面包含学生名,性别,电话号码,班级名称,学院;但是学院能分出来学院地址,电话,名字等,所以此表不为第一范式

所以当我们将学校具体信息填在表内,是否满足第一范式? 答案是肯定的,不过会产生数据冗余

所以我们可得在 关系型数据库中,每⼀列都可以⽤基本数据类型表⽰,就天然满⾜第⼀范式

2.第二范式

定义:在满⾜第⼀范式的基础上,不存在⾮关键字段对任意候选键的部分函数依赖。存在于表中定义了复合主键的情况下

⾮关键字段:相当于非主键

任意候选键:相当于主键

复合主键:一个表只能有一个主键,但是一个主键能定义多个列,定义多个列的就是复合主键

部分函数依赖:只依赖于表中的部分字段生成,和其他字段没有关系

反例:

主键为学号和课程名

如图所示:学分只与课程相关

成绩只与学号和课程相关,

学生信息只与学号相关

也就是说学分不依赖于学号,只依赖课程名

而学生信息不依赖于课程名,只依赖于学号

这即为部分函数依赖

正例:

将有依赖关系的列单独放表,通过id来传递

由于学生信息只与学号相关,所以定义在学生表

学分只与课程名相关,所以定义课程表

成绩与学号和课程id相关,所以用复合主键定义出成绩表

解决部分函数依赖,可以通过为每个复合主键定义单独表,

再对需要多个复合主键的进行建表

不满⾜第⼆范式时可能出现的问题

1.数据冗余

在提取想要得到的信息时,有其余重复信息,其余重复信息称为冗余信息

2.更新异常

更新可能会更新错误,因为要更新很多条数据,比如要将mysql的学分改为50,可能漏掉王五的学分,导致数据不一致,引发数据不安全等问题

3.插入异常

如果需要重新插入一门新的课程,则课程必须要有成绩才能填入,不能提前填入

4.删除数据

如果只想删除毕业学生成绩,会连带吧课程和课程对应的学分删除

3.第三范式

定义:在满⾜第⼆范式的基础上,不存在**⾮关键字段** ,对任⼀候选键传递依赖

非关键字段:非主键

任一候选键:主键

反例:

如图,当一个表存在两种强相关的关系,这种关系称为传递依赖

相关推荐
码明20 分钟前
42.MySQL视图
数据库·oracle
山茶花开时。21 分钟前
[Oracle] TO_NUMBER()函数
数据库·oracle
耳东哇2 小时前
阿里云百炼平台创建智能体-上传文档
数据库·redis·阿里云
ykuaile_h83 小时前
MySQL梳理三:查询与优化
数据库·mysql
掘根4 小时前
【Redis】string字符串
数据结构·数据库·redis
越来越无动于衷4 小时前
智慧社区(八)——社区人脸识别出入管理系统设计与实现
java·开发语言·spring boot·python·mysql
春天的菠菜5 小时前
【mysql】设置mysql数据库只读权限用户
数据库·oracle
找不到、了5 小时前
Mysql使用Canal服务同步数据->ElasticSearch
数据库·mysql·elasticsearch
宋大水6 小时前
【大作业-12】草莓成熟度检测模型,YOLO+PyQt+MySQL
数据库·深度学习·mysql·yolo·目标检测·pyqt·课程设计
_代号0076 小时前
MySQL梳理四:事务日志机制和多版本并发控制(MVCC)
mysql