【MySQL】三大范式

范式简介:

MySQL中的三大范式是数据库设计的基本原则,旨在减少数据冗余、提高数据一致性和完整性。

第一范式:

第一范式要求数据库表的每一列都是不可分割的基本数据项,确保每一列都具有原子性。

在关系型数据库的设计中,满足第一范式是对关系模式的基本要求。不满足第一范式的数据库就不能被称为关系型数据库

反例:

正例:

第二范式:

第二范式在满足第一范式的基础上,要求非主键字段必须完全依赖于主键,而不是部分依赖。

反例:

不满足第二范式时可能出现的问题:

  1. 数据冗余:一个学生参加了多名考试,姓名、年龄、性别等就会在每行记录中重复出现
  2. 更新异常:如果需要调整学分,就要更新表中所有关于学分的记录,一旦执行中断到时更新失败就会出现数据不一致问题
  3. 插入异常:如果有一个新课还没有学生参加考试取得成绩,那么新课在数据库中是不存在的,因为成绩为空没有意义
  4. 删除异常:当学生毕业时需要删除考试数据,就有可能删除某一课程和学分,导致数据库里没有某一课程和学分的信息

当我们要做一个学生考试成绩表时,要先明确一点,我们要记录的是某个学生参加了某门考试之后得到的分数。

  • 候选键:可以唯一标识一行数据的列或列的组合,可以从候选键中选一个或多个当做表的主键

像上图中的表,我们以学号为主键,其余列就为候选键;

在这个表中用学号作为这个表的主键来表示一个学生信息,那么姓名、年龄、性别都是学生信息中的一部分,所以这些列对于主键就是完全依赖 。学分、成绩并不和学生信息直接相关,所以是**部分依赖。**如果我们要让上表满足第二范式通常需要将部分依赖的字段拆分到新表中。

正例:

把 学生ID 和 课程ID 作为一个复合主键,值用来记录成绩,没有部分函数依赖,也就非常的高效

第三范式:

第三范式在满足第二范式的基础上,要求非主键字段之间不能存在传递依赖

反例:

在这个表中,用ID、学号、姓名、年龄来表示一个学生的信息,学院名、学院电话等都是关于学院的信息,同时也是这个学生的学生的信息,但是学院名等数据与学生信息一起存储时就会发生冗余,这里这样的关系就称作传递依赖

正例:

实际应用建议:

  • 范式并非绝对标准,需根据实际场景权衡。过度范式化可能导致查询性能下降。
  • 反范式设计(如适当冗余)常用于数据仓库或高频查询场景以提高性能。
相关推荐
AllData公司负责人几秒前
AllData数据中台通过集成DolphinScheduler+Seatunnel实现SAP HANA数据库同步到Doris数据仓库
数据库·数据仓库·sap hana
2401_84634165几秒前
使用Python进行网络设备自动配置
jvm·数据库·python
执笔画情ora14 分钟前
Postgresql管理-杀会话还是取消会话?
数据库·oracle
清风徐来QCQ22 分钟前
redis 面试可能会问的问题
数据库·redis·面试
这辈子谁会真的心疼你22 分钟前
如何修改照片定位信息?详细介绍两个方法
数据库
Oueii25 分钟前
构建一个基于命令行的待办事项应用
jvm·数据库·python
小瓦码J码36 分钟前
PostgreSQL pg_stat_statements 性能分析利器(二)全表扫描导致物理IO爆炸
数据库·postgresql
2501_9454235442 分钟前
如何为开源Python项目做贡献?
jvm·数据库·python
2401_8845632443 分钟前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python
清风徐来QCQ44 分钟前
Redis以及如何在springboot中使用
数据库·redis·缓存