数据库三大范式是什么,又为什么要反范式?

在这里插入图片描述

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。
🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。
🏆本文已收录于PHP专栏:MySQL的100个知识点。
🎉欢迎 👍点赞✍评论⭐收藏

文章目录

  • 🚀一、前言
  • 🚀二、三大范式
    • 🔎2.1 第一范式
    • 🔎2.2 第二范式
    • 🔎2.3 第三范式
  • 🚀三、反范式
    • 🔎3.1 数据冗余
    • 🔎3.2 性能问题
    • 🔎3.3 设计复杂度
  • 🚀四、总结


🚀一、前言

数据库三大范式是指关系型数据库设计中的三个基本规范,分别为第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。

在这里插入图片描述

🚀二、三大范式

🔎2.1 第一范式

第一范式(1NF)要求表中的每个字段都不可再分,即每个字段只能保存单一值。同时,每个字段必须有一个唯一的名称,并且在表中的每一行中都必须有一个唯一标识字段(主键)。1NF的核心概念是原子性。

以订单表为例,我们可以设计如下的表结构:

订单编号客户编号订单日期
00110012021-01-01
00210022021-02-05
00310012021-03-10

在这个表中,每一列都是原子的,符合第一范式。

🔎2.2 第二范式

第二范式(2NF)对于满足1NF的表,要求所有非主键字段必须完全依赖于主键。也就是说,如果一个表中存在复合主键,那么每个非主键字段必须依赖于全部的主键,而不能只依赖于部分主键。2NF的核心概念是函数依赖。

我们继续以订单表为例,再设计一个商品表:

商品编号商品名称商品价格
P001商品A10.00
P002商品B20.00
P003商品C15.50

在商品表中,商品编号是主键,商品名称和商品价格完全依赖于商品编号,符合第二范式。

接下来,我们设计一个订单详情表来记录订单中的商品信息:

订单编号商品编号数量
001P0015
002P0022
003P0013

在订单详情表中,订单编号和商品编号作为联合主键,而数量列只依赖于订单编号和商品编号,而不是部分依赖。因此,订单详情表符合第二范式。

🔎2.3 第三范式

第三范式(3NF)在满足2NF的基础上,要求所有非主键字段之间不能存在传递依赖关系。也就是说,如果一个非主键字段依赖于另一个非主键字段,那么这两个字段应该拆分成两个独立的表。3NF的核心概念是消除传递依赖。

学生表(students)
字段数据类型约束
学生IDint主键
姓名varchar非空
年龄int非空
性别varchar非空
课程表(courses)
字段数据类型约束
课程IDint主键
课程名称varchar非空
学分int非空
成绩表(grades)
字段数据类型约束
学生IDint外键(学生表)
课程IDint外键(课程表)
分数int非空

上述表结构设计就是符合第三范式的。

在这里插入图片描述

🚀三、反范式

实际使用过程中,需要注意以下几个问题:

🔎3.1 数据冗余

范式化的数据库设计,可以尽可能地减少数据冗余,避免了数据的不一致和更新异常。但范式化的设计也可能导致查询时需要进行多表连接,影响查询性能。

🔎3.2 性能问题

范式化的数据库设计可能导致复杂的查询语句,对于大量数据的查询和处理可能性能较差。在实际应用中,需要根据具体情况进行性能优化,可以考虑使用反范式化来提高查询性能。

🔎3.3 设计复杂度

范式化的数据库设计可能会增加数据表的数量,使数据库结构变得复杂。在设计过程中需要权衡范式化的好处和复杂性,并根据实际需求做出适当的选择。

为了解决上述问题,有时候需要采用反范式化的设计方法。反范式化是指有意地将数据冗余存储在数据库中,以提高查询性能或简化数据模型。以下是一个反范式化设计的例子:

假设有一个订单管理系统,包括订单表(Order)和产品表(Product)。原始的范式化设计如下:

Order表:

订单ID(主键)订单日期产品ID(外键)数量
12020-01-01110
22020-01-0225

Product表:

产品ID(主键)产品名称
1电视
2冰箱

在这种设计中,每个订单记录只存储了产品ID,需要通过外键关联到产品表来获取产品名称。当进行查询时,可能需要进行多表连接,影响查询性能。

为了提高查询性能,在反范式化设计中可以将产品名称冗余存储在订单表中:

Order表:

订单ID(主键)订单日期产品ID(外键)产品名称数量
12020-01-011电视10
22020-01-022冰箱5

这样,在查询订单时不再需要进行多表连接,可以直接从订单表中获取产品名称,提高查询性能。但同时也增加了数据冗余,需要在更新订单时保持冗余数据的一致性。

🚀四、总结

总结起来,数据库的三大范式是关系型数据库设计中的基本规范,用于避免数据冗余、更新异常和数据不一致。在实际应用中,需要根据具体情况进行范式化或反范式化的设计,权衡范式化的好处和复杂性,以及考虑查询性能和数据一致性的需求。

在这里插入图片描述

推荐您阅读本专栏其他内容,MySQL的100个知识点,相信不会让您失望。如果你对上面的功能有疑问,随时欢迎与我交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/54105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“分布式”与“集群”初学者的技术总结

一、“分布式”与“集群”的解释: 分布式:把一个囊肿的系统分成无数个单独可运行的功能模块 集群: 把相同的项目复制进行多次部署(可以是一台服务器多次部署,例如使用8080部署一个,8081部署一个&#xff0c…

使用cgroup工具对服务器某些/全部用户进行计算资源限制

使用cgroup工具对服务器某些/全部用户进行计算资源限制 主要介绍,如何对指定/所有用户进行资源限定(这里主要介绍cpu和内存占用限制),防止某些用户大量占用服务器计算资源,影响和挤占他人正常使用服务器。 安装cgrou…

【目标检测】理论篇(2)YOLOv3网络构架及其代码实现

网络构架图: 代码实现: import math from collections import OrderedDictimport torch.nn as nn#---------------------------------------------------------------------# # 残差结构 # 利用一个1x1卷积下降通道数,然后利用一个3x3卷…

设计模式概述

文章目录 设计模式概述创建型模式:结构型模式:行为型模式: 设计模式概述 设计模式是什么? 设计模式的一般定义为: 设计模式(Design Pattern)是一套反复使用、多人知晓的,经过分类…

机器学习在大数据分析中的应用

文章目录 机器学习在大数据分析中的原理机器学习在大数据分析中的应用示例预测销售趋势客户细分和个性化营销 机器学习在大数据分析中的前景和挑战前景挑战 总结 🎉欢迎来到AIGC人工智能专栏~探索机器学习在大数据分析中的应用 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&…

Kubernetes(K8S)简介

Kubernetes (K8S) 是什么 它是一个为 容器化 应用提供集群部署和管理的开源工具,由 Google 开发。Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项…

【Unity小技巧】unity2d平台制作一根三七调的鱼竿效果(附git源码)

文章目录 前言素材开始源码参考完结 前言 今天我们做一个2d鱼竿的效果,先看一下效果成品效果 素材 鱼竿 开始 首先创建一个2D URP项目 ,创建一个空物体作为鱼竿,并创建两个子物体作为开始和结束点 配置层级如下 鱼竿和鱼线加Line Ren…

为什么网络互联地址设置为30位地址

对于点对点链路,为了节约IPv4地址,一般为其分配/30地址块,这样包含4个地址:最小地址作为网络地址,最大地址作为广播地址,剩余两个可分配地址,分配给链路两端的接口,这是最普遍的方法…

大语言模型之六- LLM之企业私有化部署

数据安全是每个公司不得不慎重对待的,为了提高生产力,降本增效又不得不接受新技术带来的工具,私有化部署对于公司还是非常有吸引力的。大语言模型这一工具结合公司的数据可以大大提高公司生产率。 私有化LLM需要处理的问题 企业内私有化LLM…

【Axure原型分享】能统计中英文字数的多行输入框

今天和大家分享能统计中英文字数的多行输入框的原型模板,在输入框里输入内容后,能够动态根据输入框的内容,统计出字符数量,包括总字数、中文字数、英文字数、数字字数、其他标点符号的字数,具体效果可以观看下方视频或…

系统架构设计高级技能 · 安全架构设计理论与实践

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

【C++】AVL树(高度平衡二叉树)

AVL树 概念AVL树节点定义AVL树节点插入AVL树四种旋转情况左单旋右单旋先左单旋再右单旋先右单旋后左单旋 元素的插入及控制平衡判断最后节点是否平衡 概念 二叉搜索树虽然可以缩短查找的效率,但如果数据有序或者接近有序二叉搜索树将退化为单支树,查找元…

copy is all you need前向绘图 和疑惑标记

疑惑的起因 简化前向图 GPT4解释 这段代码实现了一个神经网络模型,包含了BERT、GPT-2和MLP等模块。主要功能是给定一个文本序列和一个查询序列,预测查询序列中的起始和结束位置,使其对应文本序列中的一个短语。具体实现细节如下&#xff1a…

Win系统设置开机自启项及自定义自启程序

Win系统设置开机自启项及自定义自启程序 分用户自启动和系统自启动两种形式: 1. 用户自启动目录:C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 用快速键打开: Win键R键,输入shell:…

sql server 快速安装

目录标题 一、下载二、直接选择基本安装二、下载ssms(数据库图形化操作页面)三、开启sa账号认证(一)第一步:更改身份验证模式(二)第二步:启用 sa 登录四、开启tcp/ip 一、下载 下载…

低通滤波器和高通滤波器

应用于图像低通滤波器和高通滤波器的实现 需要用到傅里叶变换 #include <opencv2/opencv.hpp> #include <Eigen> #include <iostream> #include <vector> #include <cmath> #include <complex>#define M_PI 3.14159265358979323846…

QT5.12.12通过ODBC连接到GBase 8s数据库(CentOS)

本示例使用的环境如下&#xff1a; 硬件平台&#xff1a;x86_64&#xff08;amd64&#xff09;操作系统&#xff1a;CentOS 7.8 2003数据库版本&#xff08;含CSDK&#xff09;&#xff1a;GBase 8s V8.8 3.0.0_1 为什么使用QT 5.12.10&#xff1f;该版本包含QODBC。 1&#…

ES6中promise的使用

ES6中promise的使用 本文目录 ES6中promise的使用基础介绍箭头函数function函数状态 原型方法Promise.prototype.then()Promise.prototype.catch() 静态方法Promise.all()Promise.race()Promise.any() 链式回调 基础介绍 官网&#xff1a;https://promisesaplus.com/ window.…

最新docker多系统安装技术

在Ubuntu操作系统中安装Docker 在Ubuntu操作系统中安装Docker的步骤如下。 1&#xff0e;卸载旧版本Docker 卸载旧版本Docker的命令如下&#xff1a; $ sudo apt-get remove docker docker-engine docker.io 2&#xff0e;使用脚本自动安装 在测试或开发环境中&#xff0…

STM32 进不了main 函数

1. 我用的是STM32L151C8T6 的芯片&#xff0c;在github 上找了个别人的例程&#xff0c;拿来当模板改&#xff0c;由于他用的是HSE 外部晶振&#xff0c;我用的是内部晶振HSI&#xff0c;所以需要改系统时钟&#xff0c;改完后debug&#xff0c; 一直进不了main 函数&#xff0…