MYSQL-设计表

一.范式

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

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

1.第一范式

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

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

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

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

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

2.第二范式

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

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

任意候选键:相当于主键

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

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

反例:

主键为学号和课程名

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

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

学生信息只与学号相关

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

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

这即为部分函数依赖

正例:

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

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

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

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

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

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

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

1.数据冗余

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

2.更新异常

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

3.插入异常

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

4.删除数据

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

3.第三范式

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

非关键字段:非主键

任一候选键:主键

反例:

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

相关推荐
计算机毕设VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue医院设备管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
Mr__Miss3 小时前
保持redis和数据库一致性(双写一致性)
数据库·redis·spring
Knight_AL4 小时前
Spring 事务传播行为 + 事务失效原因 + 传播行为为什么不用其他模式
数据库·sql·spring
倔强的石头_5 小时前
时序数据时代的“存储与分析困局”解析及金仓解决方案
数据库
计算机毕设VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
倔强的石头_6 小时前
场景化落地指南——金仓时序数据库在关键行业的应用实践
数据库
SelectDB6 小时前
驾驭 CPU 与编译器:Apache Doris 实现极致性能的底层逻辑
运维·数据库·apache
刀法如飞6 小时前
开箱即用的 DDD(领域驱动设计)工程脚手架,基于 Spring Boot 4.0.1 和 Java 21
java·spring boot·mysql·spring·设计模式·intellij-idea
zbguolei6 小时前
MySQL根据身份证号码计算出生日期和年龄
数据库·mysql
马克学长7 小时前
SSM校园图书借阅服务系统jd2z8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·图书管理系统·ssm 框架·ssm 校园图书借阅系统