【MySQL】三大范式

文章目录

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

1. 标准化

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

2. 第一范式

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

3. 链接表

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

4. 第二范式

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

5. 第三范式

  • 表中的列不应派生自其他列。减少重复,提高数据完整性。
    • 例如,一张发票表有三列:发票总计、付款总计和结余。结余可以通过(发票总计 - 付款总计)计算获得,但如果更改了发票总计或付款总计,但忘了更改相应的结余,就出现数据不一致。因此应该删除结余列。
    • 再例如,顾客表中有:姓、名、全名三列,全名列不应出现,违反第三范式。
相关推荐
二月夜33 分钟前
剖析Java正则表达式回溯问题
java·正则表达式
cui_ruicheng34 分钟前
MySQL(四):数据类型与字段设计
数据库·mysql
xuhaoyu_cpp_java1 小时前
项目学习(三)分页查询
java·经验分享·笔记·学习
皮皮学姐分享-ppx1 小时前
政府绿色采购数据库(2015-2024.3)
大数据·网络·数据库·人工智能·制造
程序员二叉1 小时前
【Java】集合面试全套精讲|HashMap/ArrayList高频考点完整版
java·面试·哈希算法
cfm_29142 小时前
JVM GC垃圾回收初步了解
java·开发语言·jvm
心之伊始2 小时前
LangChain4j RAG 实战:Java 后端如何把本地文档接入 Embedding 检索链路
java·架构·源码分析·csdn
许彰午2 小时前
17_synchronized关键字深度解析
java·开发语言
阿正的梦工坊3 小时前
【Rust】02-变量、不可变性与基础类型
开发语言·后端·rust
闪电悠米3 小时前
黑马点评-Redis 消息队列-03_stream_consumer_group
开发语言·数据库·redis·分布式·缓存·junit·lua