【MySQL】三大范式

文章目录

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

1. 标准化

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

2. 第一范式

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

3. 链接表

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

4. 第二范式

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

5. 第三范式

  • 表中的列不应派生自其他列。减少重复,提高数据完整性。
    • 例如,一张发票表有三列:发票总计、付款总计和结余。结余可以通过(发票总计 - 付款总计)计算获得,但如果更改了发票总计或付款总计,但忘了更改相应的结余,就出现数据不一致。因此应该删除结余列。
    • 再例如,顾客表中有:姓、名、全名三列,全名列不应出现,违反第三范式。
相关推荐
SelectDB5 分钟前
高并发 BI 看板怎么撑住:隔离与加速配置速查
大数据·数据库·数据分析
杨杨杨大侠13 分钟前
DeepSeek Harness:连 Agent Loop 都能替换的插件架构
java·人工智能·agent
SL_staff13 分钟前
私有化低代码运维三重雷区:JVS开源栈中的Kafka/ES/RabbitMQ治理实践
java·低代码·全栈
yuniko-n14 分钟前
【算法】约瑟夫环问题
java·算法
郝亚军24 分钟前
manifest 中 `sha256` 与 `signValue` 的作用
java·开发语言·数据结构
ServBay29 分钟前
DeepSeek 又出王炸,用 DeepInfer 搭建自己的服务是不是很容易?
后端·ai编程·deepseek
l1t38 分钟前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
譕痕38 分钟前
stripe 实例
java·开发语言·stripe·checksession
墨子夕1 小时前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(前言篇)
java·开发语言·设计模式
骇客野人1 小时前
Linux 全套实操方案(含目录详解、文件传输、日志、文件规范、环境变量、Java 应用部署运维)
java·linux·运维