【MySQL】三大范式

范式简介:

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

第一范式:

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

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

反例:

正例:

第二范式:

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

反例:

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

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

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

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

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

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

正例:

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

第三范式:

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

反例:

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

正例:

实际应用建议:

  • 范式并非绝对标准,需根据实际场景权衡。过度范式化可能导致查询性能下降。
  • 反范式设计(如适当冗余)常用于数据仓库或高频查询场景以提高性能。
相关推荐
陌上丨8 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
AI_56788 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ccecw9 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH30739 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道9 小时前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据10 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务10 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考
Goat恶霸詹姆斯12 小时前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七12 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草12 小时前
redis-9-哨兵
数据库·redis·bootstrap