【MySQL】三大范式

文章目录

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

1. 标准化

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

2. 第一范式

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

3. 链接表

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

4. 第二范式

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

5. 第三范式

  • 表中的列不应派生自其他列。减少重复,提高数据完整性。
    • 例如,一张发票表有三列:发票总计、付款总计和结余。结余可以通过(发票总计 - 付款总计)计算获得,但如果更改了发票总计或付款总计,但忘了更改相应的结余,就出现数据不一致。因此应该删除结余列。
    • 再例如,顾客表中有:姓、名、全名三列,全名列不应出现,违反第三范式。
相关推荐
Bonne journée8 分钟前
‌在Python中,print(f‘‘)是什么?
java·开发语言·python
潘多编程24 分钟前
Spring Boot微服务架构设计与实战
spring boot·后端·微服务
2402_8575893629 分钟前
新闻推荐系统:Spring Boot框架详解
java·spring boot·后端
2401_8576226630 分钟前
新闻推荐系统:Spring Boot的可扩展性
java·spring boot·后端
小懒编程日记35 分钟前
【数据结构与算法】B树
java·数据结构·b树·算法
Y_3_71 小时前
【回溯数独】有效的数独(medium)& 解数独(hard)
java·数据结构·windows·算法·dfs·回溯
读心悦1 小时前
修改 MySQL 数据库中的唯一键
数据库·mysql
RangoLei_Lzs1 小时前
C++模版SFIANE应用踩的一个小坑
java·开发语言·ui
卓琢1 小时前
(九)Shell 脚本(四):正则表达式、sed 和 awk 详解
linux·mysql·正则表达式
qq_213157891 小时前
(c#)unity中sqlite多线程同时开启事务会导致非常慢
数据库·sqlite·c#