【MySQL】三大范式

文章目录

  • [1. 标准化](#1. 标准化)
  • [2. 第一范式](#2. 第一范式)
  • [3. 链接表](#3. 链接表)
  • [4. 第二范式](#4. 第二范式)
  • [5. 第三范式](#5. 第三范式)

1. 标准化

  • 在生成数据库表格之前,需要确保设计是最优的,不允许存在冗余或重复的数据。冗余会增加数据库的大小,使插入、更新和删除操作复杂化。
  • 标准化:审查数据库的设计,确保数据遵循一些防止数据重复的预定义规则的过程。
    • 基本上有7条规则,也被称为七范式。每条规则都假设已经采用了前面几条规则。
    • 对于几乎99%的应用场景,只需应用前三条范式即可。
  • 实际工作中,专注于消除冗余和重复,而不需要对每张表和每列逐个应用标准化规则或执着于没有满足第几范式。

2. 第一范式

  • 要求一行中的每个单元格都应该有单一值 ,且不能出现重复列
    • 例如,课程表中有一列为标签,标签列中不一定是单一值,这不符合第一范式的规则。
    • 如果把每个标签都单独设置为一列,如标签1、标签2等,这就属于有重复列,如果后续增加标签,就需要修改表,也不符合第一范式的要求。
    • 因此,需要把标签这一列单独拿出建一个标签表。在课程表和标签表中添加"多对多"的关系。

3. 链接表

  • 多对多关系:关系型数据库中没有"多对多"关系,只有"一对一 "和"一对多"的关系。
  • 链接表:为了实现两表"多对多 "关系,需要引入一张新的链接表。链接表中有两段 "一对多 "关系。
    • 例如,课程表和标签表是多对多的关系,此时引入链接表。链接表名为"课程_标签",此表确定了每门课程的标签。课程表中只有课程,标签表中只有标签,链接表中知道每门课程的标签。
  • 链接表在关系型数据库中常见。

4. 第二范式

  • 要求每张表都应该有一个单一目的。应该只能代表有且仅有一种实体类型,且表中的每一列都用于描述此实体。
    • 例如, 课程表中有课程id、课程名和价格这些列,所以此表有单一目的,即存储课程记录,此表中的每一列都是课程的一种属性。
    • 如果有一列描述了其他东西,就应该将其放入一张单独表中。如注册日期不属于课程的某种属性,而是注册表的一种属性,所以应该放到注册表中。
    • 再例如,订单表中有一列是客户名字,这一列是描述的客户,而不是订单。因此应将客户名这列单独拿出去,放在客户表中,对应有客户id。而订单表中使用客户id。

5. 第三范式

  • 表中的列不应派生自其他列。减少重复,提高数据完整性。
    • 例如,一张发票表有三列:发票总计、付款总计和结余。结余可以通过(发票总计 - 付款总计)计算获得,但如果更改了发票总计或付款总计,但忘了更改相应的结余,就出现数据不一致。因此应该删除结余列。
    • 再例如,顾客表中有:姓、名、全名三列,全名列不应出现,违反第三范式。
相关推荐
哈哈哼嘿4 分钟前
C语言:函数 指针
后端
NightDW4 分钟前
连续周更任务模块的设计与实现
java·后端·mysql
华仔啊5 分钟前
什么情况下用线程池,怎么用?看完就会
java·后端
程序员爱钓鱼6 分钟前
Go语言实战案例-使用SQLite实现本地存储
后端·google·go
_風箏8 分钟前
Nessus【部署 01】Linux环境部署漏洞扫描工具Nessus最新版详细过程分享(下载+安装+注册+激活)
后端
xcya8 分钟前
MySQL深分页慢问题及性能优化
后端
灵魂猎手8 分钟前
8. Mybatis插件体系
java·后端·源码
SimonKing8 分钟前
布隆过滤器:用微小的空间代价换取高效的“可能存在”判定
java·后端·程序员
张同学的IT技术日记9 分钟前
必看!用示例代码学C++类与对象,快速掌握基础知识,高效提升编程能力
后端
阿冲Runner10 分钟前
Lombok的@Builder与Mybatis-Plus配合使用踩坑
java·后端·mybatis