【MySQL】三大范式

范式简介:

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

第一范式:

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

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

反例:

正例:

第二范式:

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

反例:

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

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

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

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

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

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

正例:

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

第三范式:

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

反例:

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

正例:

实际应用建议:

  • 范式并非绝对标准,需根据实际场景权衡。过度范式化可能导致查询性能下降。
  • 反范式设计(如适当冗余)常用于数据仓库或高频查询场景以提高性能。
相关推荐
小白男神5 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶5 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G5 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备5 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远5 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
kybs19915 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
2601_962218615 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
程序猿_极客5 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
张洛闻Eren5 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安5 天前
MySQL-触发器
数据库·mysql