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

在这里插入图片描述

🏆作者简介,黑夜开发者,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.hqwc.cn/news/84181.html

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

相关文章

leetcode:只出现一次的数字Ⅲ(详解)

题目: 给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 示例 1&…

Python框架【自定义过滤器、自定义数据替换过滤器 、自定义时间过滤器、选择结构、选择练习、循环结构、循环练习、导入宏方式 】(三)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…

Wireshark数据抓包分析之ARP协议

一、实验目的: 通过wireshark的数据抓包了解这个ARP协议的具体内容 二、预备知识: 1.Address Resolution Protocol协议,就是通过目标IP的值,获取到目标的mac地址的一个协议 2.ARP协议的详细工作过程,下面描述得非常清晰&#xff…

【安卓】自定义View实现画板涂鸦等功能

一、实现效果 二、代码 1、MainActivity.class package com.lsl.mydrawingboarddemo;import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat;import android.os.Bundle; import android.os.Handler; import android.view.View; impo…

redis实战-项目集成git及redis实现短信验证码登录

目录 IDEA集成git 传统session存在的问题 redis方案 业务流程 选用的数据结构 整体访问流程 发送短信验证码 获取校验验证码 配置登录拦截器 拦截器注册配置类 拦截器 用户状态刷新问题 刷新问题解决方案 IDEA集成git 远程仓库采用码云,创建好仓库&…

RH1288V3 - 初识物理服务器

如果你拥有一台物理服务器(不是云服务器) 个人比较推荐你用物理服务器,虽然性能会比云要来的差,但是不用每月交钱上。云服务固然方便,但是几个核的性能和一点存储,想做一个动漫网站固然要很多mp4这种影视资源,云服务器…

UG\NX二次开发 使用录制功能录制操作记录时,如何设置默认的开发语言?

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C,Qt-CSDN博客 简介: NX二次开发使用BlockUI设计对话框时,如何设置默认的代码语言? 效果: 方法: 依次打开“文件”->“实用…

数据库结构差异对比工具

简介 前几年写了一个数据库对比工具,但是由于实现方式的原因,数据库支持有限,所以重新设计了一下,便于支持多种数据库,并且更新了UI。 新版地址:https://gitee.com/xgpxg/db-diff 旧版地址:h…

Hightopo 使用心得(6)- 3D场景环境配置(天空球,雾化,辉光,景深)

在前一篇文章《Hightopo 使用心得(5)- 动画的实现》中,我们将一个直升机模型放到了3D场景中。同时,还利用动画实现了让该直升机围绕山体巡逻。在这篇文章中,我们将对上一篇的场景进行一些环境上的丰富与美化。让场景更…

SpringCloud学习笔记(三)_服务提供者集群与服务发现Discovery

服务提供者集群 既然SpringCloud的是微服务结构,那么对于同一种服务,当然不可能只有一个节点,需要部署多个节点 架构图如下: 由上可以看出存在多个同一种服务提供者(Service Provider) 搭建服务提供者集…

picGo+gitee+typora设置图床

picGogiteetypora设置图床 picGogitee设置图床下载picGo软件安装picGo软件gitee操作在gitee中创建仓库在gitee中配置私人令牌 配置picGo在插件设置中搜索gitee插件并进行下载 TyporapicGo设置Typora 下载Typora进行图像设置 picGogitee设置图床 当我了解picGogitee可以设置图床…

Cpp学习——编译链接

目录 ​编辑 一,两种环境 二,编译环境下四个部分的 1.预处理 2.编译 3.汇编 4.链接 三,执行环境 一,两种环境 在程序运行时会有两种环境。第一种便是编译环境,第二种则是执行环境。如下图: 在程序运…

Win11安装VMware中的镜像的下载

首先,下载好VMware之后需要许可证,在VMware选择许可证填上即可(可以解决一部分VMware创建虚拟机过程中出现的问题)。 百度网盘自取: 链接:https://pan.baidu.com/s/17gBySqoPi2HeGJJlalp-VQ 提取码&…

opencv 案例实战01-停车场车牌识别实战

需求分析: 车牌识别技术主要应用领域有停车场收费管理,交通流量控制指标测量,车辆定位,汽车防盗,高速公路超速自动化监管、闯红灯电子警察、公路收费站等等功能。对于维护交通安全和城市治安,防止交通堵塞…

list使用

list的使用于string的使用都类似,首先通过查阅来看list有哪些函数: 可以看到函数还是蛮多的,我们值重点一些常用的和常见的: 1.关于push_back,push_front,和对应迭代器的使用 //关于push_back和push_front void test_list1() {l…

G. The Morning Star - 思维

分析: 直接暴力就会tle,不知道怎么下手,可以统计八个方向一条线上的所有坐标,这些坐标一定可以放在一起满足,分析都有哪些线,当横坐标相同时会有竖着的一条线都可以,也就是x c,当纵…

sql server 、mysql CTE 公用表表达式

sql server 详细 mysql CTE CTE 是一个命名的临时结果集,作用范围是当前语句。CTE可以理解成一个可以复用的子查询,当然跟子查询还是有点区别的,CTE可以引用其他CTE,但子查询不能引用其它子查询。所以,开发中建议…

mysql 、sql server 游标 cursor

游标 声明的位置 游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明 游标的使用步骤 声明游标打开游标使用游标关闭游标 (sql server 关闭游标和释放游标) sql server 游标 declare my_cursor curs…

Java10(异常处理)

0.复习面向对象 1.异常的体系结构 异常:在Java语言中,将程序执行中发生的不正常情况.(开发中的语法错误和逻辑错误不是异常) 异常事件分两类(它们上一级为java.lang.Throwable): Error Java虚拟机无法解决的严重问…

MyBatis与Spring整合以及AOP和PageHelper分页插件整合

目录 前言 一、MyBatis与Spring整合的好处以及两者之间的关系 1.好处 2.关系 二、MyBatis和Spring集成 1.导入pom.xml 2.编写配置文件 3.利用mybatis逆向工程生成模型层代码 三、常用注解 四、AOP整合pageHelper分页插件 创建一个切面 测试 前言 MyBatis是一个开源的…