【MySQL】三大范式

文章目录

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

1. 标准化

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

2. 第一范式

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

3. 链接表

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

4. 第二范式

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

5. 第三范式

  • 表中的列不应派生自其他列。减少重复,提高数据完整性。
    • 例如,一张发票表有三列:发票总计、付款总计和结余。结余可以通过(发票总计 - 付款总计)计算获得,但如果更改了发票总计或付款总计,但忘了更改相应的结余,就出现数据不一致。因此应该删除结余列。
    • 再例如,顾客表中有:姓、名、全名三列,全名列不应出现,违反第三范式。
相关推荐
老邓计算机毕设7 小时前
SSM学生选课系统xvbna(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·学生选课系统·ssm 框架·高校教学管理
带刺的坐椅7 小时前
Solon AI Skills 会是 Agent 的未来吗?
java·agent·langchain4j·solon-ai
jacGJ7 小时前
记录学习--文件读写
java·前端·学习
花间相见7 小时前
【JAVA开发】—— Nginx服务器
java·开发语言·nginx
扶苏-su8 小时前
Java---Properties 类
java·开发语言
枷锁—sha8 小时前
【PortSwigger Academy】SQL 注入绕过登录 (Login Bypass)
数据库·sql·学习·安全·网络安全
cypking8 小时前
四、CRUD操作指南
java
东城绝神8 小时前
《Linux运维总结:基于ARM64+X86_64架构使用docker-compose一键离线部署MySQL8.0.43 NDB Cluster容器版集群》
linux·运维·mysql·架构·高可用·ndb cluster
橙子家9 小时前
WebAPI 项目通过 CI/CD 自动化部署到 Linux 服务器(docker-compose)
后端
2301_780669869 小时前
文件字节流输出、文件复制、关闭流的方法
java