当前位置: 首页 > article >正文

MySQL三范式

欢迎大家到我的博客浏览。MySQL三范式 | YinKai's Blog
简介

三大范式是 MySQL 数据库设计表结构所遵循的规范和指导方法,目的是为了减少冗余,建立结构合理的数据库,从而提高数据存储和使用的性能。

三大范式之间是有依赖关系的,比如第二范式是在第一范式的基础上建设的,第三范式是在第二范式的基础上建设的。

简单来说,就是原子性、唯一性、无传递性。

第一范式 - 1NF

遵循原子性。即,表中字段的数据,不可再分。例如下述表结构:

员工编号姓名年龄
001运营部小明19
002技术部小美28
003销售部小张20

上述表结构中,姓名字段是可以进行再拆分的,因此它不符合第一范式。符合第一范式的表结构如下:

员工编号部门姓名年龄
001运营部小明19
002技术部小美28
003销售部小张20

但也并不是所有情况,都需要符合第一范式,例如:

员工编码姓名
001小张江西省南昌市东湖区
002小黄广东省佛山市禅城区
003小高湖北省武汉市新洲区

所以,范式只是一个参考,更多的是需要根据实际情况设计表结构。

第二范式 - 2NF

在满足第一范式的情况下,遵循唯一性,消除部分依赖。即 表中任意一个主键或任意一组联合主键,可以确定除该主键外的所有的非主键值。

通俗一点讲就是,一个表只能描述一件事情,且由该表的主键确定

例如,主键为学号,则可以确定姓名、年龄等学生信息。

学号姓名年龄
001小美18
002小张19
003小明20

主键为课程名称,就可以确定该课程学分、成绩等信息。

课程名称成绩学分
语文903
数学902
英语903

不遵循第二范式,可能会造成下述后果:

  1. 数据冗余:将不同类型的信息存储在同一张表中可能导致数据冗余。例如,在学生表中,如果每个学生都有多个课程,将学生和课程信息合并存储可能导致数据复制。如果有两名学生,每人选修三门课程,表中会包含6条记录,其中的学生信息将重复。

  2. 更新数据不方便:当需要更新特定信息时,如果数据存储在同一张表中,更新可能变得不太方便。举例来说,如果需要更改某门课程的学分,必须在整个表中搜索相关记录并更新,这可能是一个繁琐的过程。但如果将数据拆分到不同的表中,只需在包含相关信息的表中进行更新,更加便捷。

  3. 插入数据不方便或可能导致异常情况:在某些情况下,插入数据可能变得复杂或引发异常。举例如下:

    • 假设主键是学号或课程名称,当需要插入新的课程信息时,必须精心规划哪些学生将选择该课程。这可能需要指定为哪些学生插入对应的课程信息。此外,如果还没有相关成绩信息,可能需要将成绩字段置为空,以后再进行更新。

    • 假设主键是学号和课程名称的联合主键,插入课程信息时,如果没有学生选择该课程,可能会导致学号主键字段缺失,从而无法插入相关信息。

第三范式 - 3NF

在满足第二范式的情况下, 消除传递依赖。即,在任一主键都可以确定所有非主键字段的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B。

举个例子,如下

学号姓名班级班主任
001小美一年级(3)班陈老师

这个表中,学号是主键,它可以唯一确定姓名、班级、班主任,符合第二范式,但是在非主键字段中,我们可以可以通过班级推导出该班级的班主任,所以他不符合第三范式。

上述的表要满足第三范式,可以像下面这样设计:

1.学生表

学号姓名班级
001小美一年级(3)班

2.班级表

班级班主任
一年级(3)陈老师
通过把班主任和班级的映射关系做成另一张表,就可以消除表中的传递依赖。
总结
  • 第一范式(1 NF):字段不可再拆分

  • 第二范式(2 NF):表中任意一个主键或者任意一组联合主键,可以唯一确定除该主键外的所有非主键值。

  • 第三范式(3 NF):在任一主键都可以确定所有非主键字段值的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B。


http://www.kler.cn/a/146305.html

相关文章:

  • VSCode 的部署
  • 将Docker运行中的容器保存为镜像并导出导入
  • SpringBoot+Vue小区智享物业管理系统(高质量源码,可定制,提供文档,免费部署到本地)
  • 【经济学通识——国债】
  • PHP的HMAC_SHA1和HMAC_MD5算法方法
  • 以太网实战AD采集上传上位机——FPGA学习笔记27
  • Django中间件
  • 网络安全面试经历
  • FreeImage 编译安装
  • 基于单片机寻迹巡线避障智能小车系统设计
  • Linux4.5、进程状态
  • 网络爬虫(Python:Selenium、Scrapy框架;爬虫与反爬虫笔记)
  • URL参数提取,代码复制即用
  • C++基础 -4- C/C++混合编程
  • CloudCompare 源码编译
  • 快速掌握Pyqt5的10种容器(Containers)
  • 平衡二叉树(AVL)
  • list的总结
  • 【nlp】4.4 Transformer库的使用(管道模式pipline、自动模式auto,具体模型BertModel)
  • Redis面试题:Redis的数据过期策略有哪些?
  • Centos7上面部署redis
  • 计算机组成原理-Cache替换算法
  • 【Cisco Packet Tracer】电子邮箱仿真搭建
  • python -opencv 图像锐化
  • java多线程一
  • 从Redis反序列化UserDetails对象异常后发现FastJson序列化的一些问题