【MySQL】三大范式

范式简介:

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

第一范式:

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

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

反例:

正例:

第二范式:

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

反例:

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

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

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

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

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

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

正例:

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

第三范式:

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

反例:

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

正例:

实际应用建议:

  • 范式并非绝对标准,需根据实际场景权衡。过度范式化可能导致查询性能下降。
  • 反范式设计(如适当冗余)常用于数据仓库或高频查询场景以提高性能。
相关推荐
IvorySQL6 小时前
PostgreSQL 日报 | JOIN 与外键优化(8 月 9 日)
数据库·postgresql
ltl6 小时前
自治数据库十年回顾:Peloton、NoisePage、OtterTune 到云原生 auto-tuning
数据库
灯澜忆梦8 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
C++ 老炮儿的技术栈10 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
MC皮蛋侠客10 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
zt1985q11 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
IvorySQL12 小时前
PostgreSQL 日报| PostgreSQL 19 默认 WAL 压缩算法(8 月 8 日)
数据库·postgresql·区块链
油丶酸萝卜别吃13 小时前
MySQL B+ 树查询全过程详解
数据库·mysql
leisoo809713 小时前
股票数据本地化存储实战:JSON、数据库与列式存储的方案对比
jvm·数据库·json
Exclusive_Cat13 小时前
MySQL回表机制解析与优化策略
数据库·sql