MYSQL-设计表

一.范式

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

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

1.第一范式

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

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

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

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

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

2.第二范式

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

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

任意候选键:相当于主键

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

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

反例:

主键为学号和课程名

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

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

学生信息只与学号相关

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

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

这即为部分函数依赖

正例:

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

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

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

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

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

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

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

1.数据冗余

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

2.更新异常

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

3.插入异常

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

4.删除数据

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

3.第三范式

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

非关键字段:非主键

任一候选键:主键

反例:

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

相关推荐
luckyext3 小时前
SQL的RAND用法和指定生成随机数的范围
运维·服务器·数据库·sql·sqlserver·运维开发·mssql
文牧之3 小时前
Oracle 的 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH 命令
运维·数据库·oracle
数据库幼崽4 小时前
MySQL 8.0 OCP 1Z0-908 191-200题
数据库·mysql·ocp
萤火夜4 小时前
MYSQL之复合查询
数据库·mysql
JWenzz14 小时前
Redis删除策略
java·数据库·redis·缓存
江畔柳前堤5 小时前
PyQt学习系列07-数据库操作与ORM集成
数据库·学习·算法·机器学习·架构·pyqt
观无5 小时前
腾讯云Mysql实现远程链接
数据库·mysql
SmartSoftHelp开发辅助优化6 小时前
SmartSoftHelp 之 SQL Server 数据库安全备份与安全还原详解---深度优化版:SmartSoftHelp DeepCore XSuite
数据库·安全·oracle
朝新_7 小时前
【MySQL】第九弹——索引(下)
数据库·mysql
数据要素X7 小时前
【数据架构03】数据治理架构篇
大数据·数据库·数据仓库·架构