MYSQL-设计表

一.范式

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

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

1.第一范式

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

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

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

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

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

2.第二范式

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

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

任意候选键:相当于主键

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

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

反例:

主键为学号和课程名

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

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

学生信息只与学号相关

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

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

这即为部分函数依赖

正例:

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

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

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

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

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

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

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

1.数据冗余

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

2.更新异常

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

3.插入异常

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

4.删除数据

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

3.第三范式

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

非关键字段:非主键

任一候选键:主键

反例:

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

相关推荐
Coder_Boy_29 分钟前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance35 分钟前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋1 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.1 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
天天爱吃肉82182 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车
大巨头2 小时前
sql2008 数据库分页语句
数据库
m0_715575342 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
老邓计算机毕设2 小时前
SSM智慧社区家政服务系统80q7o(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架
松涛和鸣3 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
likangbinlxa4 小时前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql