数据库的三大范式如何理解?

news2025/2/26 2:53:05

数据库的三大范式是指数据库设计中用来规范化表结构的规则。其目的是减少数据冗余,提高数据一致性和完整性。三大范式分别是:

第一范式(1NF)—— 原子性

第一范式要求表中的每个字段都必须是原子的,即字段中的值不可再分割。换句话说,每个字段只能包含一个值,不能是一个列表或集合。

通俗案例
假设你有一个学生信息表:

学号姓名电话号码
001小明123456789, 987654321
002小红234567890, 876543210

这里,小明和小红的电话号码字段包含了多个值,违反了第一范式。为了符合1NF,需要将电话号码字段拆分成独立的记录:

学号姓名电话号码
001小明123456789
001小明987654321
002小红234567890
002小红876543210

这样,每个字段都只有一个值,符合第一范式。


第二范式(2NF)—— 消除部分依赖

第二范式要求数据库中每个非主属性(字段)都完全依赖于主键,而不是仅依赖于主键的一部分。如果一个表有复合主键,必须确保每个非主属性依赖于整个复合主键,而不是只依赖于其中的一部分。

通俗案例
假设你有一个成绩表,复合主键是 学号课程号,包含如下数据:

学号课程号姓名成绩
001101小明95
001102小明88
002101小红92

这里,“姓名”字段依赖于“学号”字段,而不是依赖于整个复合主键“学号+课程号”。为了符合第二范式,我们可以将“姓名”从表中分离出来,建立一个独立的学生表:

  1. 学生表:

    学号姓名
    001小明
    002小红
  2. 成绩表:

    学号课程号成绩
    00110195
    00110288
    00210192

这样,非主键字段“姓名”就完全依赖于主键“学号”,符合第二范式。


第三范式(3NF)—— 消除传递依赖

第三范式要求表中的非主键字段不仅要直接依赖于主键,而且不能通过其他非主键字段间接依赖于主键。如果存在这种传递依赖,就需要将其分解成多个表。

通俗案例
假设你有一个员工表,其中有员工的 部门名称部门位置,数据如下:

员工编号姓名部门名称部门位置
001小明技术部北京
002小红销售部上海

这里,部门位置 是通过 部门名称 间接依赖于 员工编号(主键)。即:员工的 部门名称 决定了 部门位置,所以部门位置应该从这个表中提取出来,单独放在部门表中:

  1. 员工表:

    员工编号姓名部门编号
    001小明D001
    002小红D002
  2. 部门表:

    部门编号部门名称部门位置
    D001技术部北京
    D002销售部上海

这样,部门位置 不再通过 部门名称 间接依赖于主键,符合第三范式。


总结

  • 第一范式(1NF):确保每个字段的值是不可分割的。
  • 第二范式(2NF):确保每个非主键字段完全依赖于主键。
  • 第三范式(3NF):确保每个非主键字段不依赖于其他非主键字段(即消除传递依赖)。

通过这些规范化的过程,可以让数据库结构更加合理,减少冗余数据,避免数据不一致的情况发生。


高并发系统中,三大范式的缺点是啥?

在高并发系统中,三大范式的设计虽然可以保证数据一致性和减少冗余,但它们也有一些缺点,尤其是在处理大量并发请求时。这些缺点主要表现在性能、复杂性和可扩展性方面。以下是每个范式的缺点及其对高并发系统的影响:

第一范式(1NF)缺点

缺点:1NF要求每个字段都是原子的,即每个字段只能存储一个值。虽然这是数据一致性的基本要求,但在高并发系统中,这种要求可能导致频繁的表拆分和数据更新操作,增加了数据库的负担。

影响

  • 由于对数据的强约束,可能导致频繁的查询操作需要访问更多的表或记录,从而增加了数据库的查询成本。
  • 过度拆分可能导致多个查询请求必须合并数据,增加了系统的复杂性和查询响应时间。

第二范式(2NF)缺点

缺点:2NF要求消除部分依赖,确保每个非主键字段完全依赖于主键。在复杂的业务场景中,消除部分依赖可能会导致过多的表拆分。

影响

  • 在高并发的系统中,拆分表后,涉及多个表的联接查询会变得非常复杂,增加了数据库的负担,可能导致查询性能下降。
  • 由于每个非主键字段需要完全依赖于主键,可能导致数据模型过于复杂,查询时需要访问更多的表,影响系统的响应速度。

第三范式(3NF)缺点

缺点:3NF消除了传递依赖,使得所有非主键字段都不依赖于其他非主键字段。这个原则可能导致数据库过度规范化,使得数据存储非常分散。

影响

  • 查询效率低:在高并发系统中,过多的表拆分和复杂的表之间的关系会导致频繁的联接(JOIN)操作,特别是在需要获取多表数据时,可能会显著增加查询的时间。
  • 事务和一致性问题:频繁的表拆分和数据分布可能会引入更多的事务操作,导致锁的竞争和性能瓶颈。在高并发场景下,过度的表分解可能导致更频繁的锁竞争和事务冲突。
  • 更高的写入成本:每次更新或插入数据时,可能需要更新多个表。这会导致更高的写入延迟,尤其是在事务涉及多个表的情况下。对于高并发写入的系统,这可能会成为瓶颈。

高并发环境下的折中与解决方案

在高并发的环境下,严格遵循三大范式可能会导致性能瓶颈,尤其是在查询和写入操作上。为了提高系统的性能和可扩展性,通常会采取以下策略:

  1. 去规范化(Denormalization)

    • 去规范化是指在数据库中故意增加冗余数据,减少表的拆分,以降低复杂查询的成本。
    • 虽然去规范化会引入一定的数据冗余,但它能够显著提升查询性能,尤其是在高并发读操作中。
  2. 缓存

    • 高并发系统中,缓存是提高性能的常用方案。通过使用缓存(如Redis、Memcached)来缓存频繁查询的数据,可以减少数据库的查询负载,提升响应速度。
  3. 分库分表

    • 对于大量数据,可以使用分库分表技术将数据分散存储,从而提高查询效率,并减少单一数据库的压力。
  4. CQRS(命令查询分离)

    • 将读和写操作分离,分别采用不同的优化策略。例如,写操作使用事务和高一致性保证,而读操作则采用缓存、去规范化等方式来提升性能。
  5. 数据库索引

    • 对常用的查询字段添加索引,可以显著提高查询效率,但需要注意索引会增加写操作的成本。

总结

  • 第一范式(1NF):可能导致频繁的表拆分,增加查询的复杂性。
  • 第二范式(2NF):可能导致表的过度拆分,查询性能下降。
  • 第三范式(3NF):虽然消除了数据冗余,但可能会导致查询性能下降,增加了数据库复杂度,特别是在高并发写入的情况下。

因此,在高并发系统中,往往需要在规范化和性能之间找到平衡点,采用去规范化、缓存、分库分表等技术来优化性能。

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

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

相关文章

Python Seaborn库使用指南:从入门到精通

1. 引言 Seaborn 是基于 Matplotlib 的高级数据可视化库,专为统计图表设计。它提供了更简洁的 API 和更美观的默认样式,能够轻松生成复杂的统计图表。Seaborn 在数据分析、机器学习和科学计算领域中被广泛使用。 本文将详细介绍 Seaborn 的基本概念、常用功能以及高级用法,…

Android之APP更新(通过接口更新)

文章目录 前言一、效果图二、实现步骤1.AndroidManifest权限申请2.activity实现3.有版本更新弹框UpdateappUtilDialog4.下载弹框DownloadAppUtils5.弹框背景图 总结 前言 对于做Android的朋友来说,APP更新功能再常见不过了,因为平台更新审核时间较长&am…

JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用

生产问题定位指南:几款必备的可视化工具 引言 在上一篇文章中,详细的介绍了JDK自带的一系列命令行工具,,如jps、jmap、jstat、jstack以及jcmd等,这些工具为排查和诊断Java虚拟机(JVM)问题提供…

力扣3102.最小化曼哈顿距离

力扣3102.最小化曼哈顿距离 题目 题目解析及思路 题目要求返回移除一个点后的最小的最大曼哈顿距离 最大最小值的题一般直接想到二分 本题有一个简单办法就是利用切比雪夫距离 当正方形转45,即边上点**( x , y ) -> (x y , y - x)时,两点间max(…

国标28181协议在智联视频超融合平台中的接入方法

一. 国标28181介绍 国标 28181 协议全称是《安全防范视频监控联网系统信息传输、交换、控制技术要求》,是国内视频行业最重要的国家标准,目前有三个版本: 2011 年:推出 GB/T 28181-2011 版本,为安防行业的前端设备、平…

【学习笔记】LLM+RL

文章目录 1 合成数据与模型坍缩(model collapse),1.1 递归生成数据与模型坍缩1.2 三种错误1.3 理论直觉1.4 PPL指标 2 基于开源 LLM 实现 O1-like step by step 慢思考(slow thinking),ollama,streamlit2.1…

【论文精读】YOLO-World:实时开放词汇目标检测

论文地址: YOLO-World: Real-Time Open-Vocabulary Object Detection 源代码:YOLO-World 摘要 YOLO系列检测器因其高效性和实用性而被广泛认可。然而,它们依赖于预定义和训练过的物体类别,这限制了其在开放场景中的适用性。为了…

【AI时代】可视化训练模型工具LLaMA-Factory安装与使用

文章目录 安装训练使用 安装 官方地址:https://github.com/hiyouga/LLaMA-Factory 创建虚拟环境 conda create -n llama-factory conda activate llama-factory安装 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip in…

将产品照片(form.productPhotos)转为 JSON 字符串发送给后端

文章目录 1. 前端 form.productPhotos 的当前处理a. 组件绑定b. 当前发送逻辑 2. 如何将 form.productPhotos 转为 JSON 字符串发送给后端a. 修改前端 save() 方法b. 确保 esave API 支持接收字符串 基于你提供的 identify-form.vue 代码,我将分析如何将产品照片&a…

【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin scatter plot Venn)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载画图1画图2画图3画图4画图5画图6画图7参考介绍 【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin & scatter plot & Venn) 加载R包 library…

kotlin 知识点一 变量和函数

在Kotlin中定义变量的方式和Java 区别很大,在Java 中如果想要定义一个变 量,需要在变量前面声明这个变量的类型,比如说int a表示a是一个整型变量,String b表 示b是一个字符串变量。而Kotlin中定义一个变量,只允许在变量…

solidity之Foundry安装配置(一)

一门面向合约的高级编程语言,主要用来编写以太坊只能合约。 Solidity受C语言,Python和js影响,但为编译成为以太坊虚拟机字节码在EVM上执行,很多特性和限制都和EVM相关。 Solidity 是静态类型语言,支持继承、库、自定义…

PHP-create_function

[题目信息]: 题目名称题目难度PHP-create_function2 [题目考点]: create_function ( string args , string args , string code )[Flag格式]: SangFor{wWx5dEGHHhDUwmST4bpXwfjSzq43I6cz}[环境部署]: docker-compose.yml文件或者docker …

FFmpeg 是什么?为什么?怎么用?

摘要:本文介绍了 FFmpeg,一个功能强大的开源多媒体处理工具,广泛应用于视频和音频文件的处理。FFmpeg 支持多种多媒体格式,能够实现视频编码/解码、格式转换、裁剪、合并、音频提取、流媒体处理等功能。本文详细阐述了 FFmpeg 的主…

云计算及其他计算

云计算知识思维导图:https://kdocs.cn/l/cpl2Kizx7IyC 云计算的核心判断标准通常基于美国国家标准与技术研究院(NIST)的定义,并结合实际应用场景。以下是判断一个服务是否为云计算的关键标准,以及对应的服务类型&#…

前端Toast提示快速入门

White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🐹今日诗词:十年一觉扬州梦,赢得青楼薄幸名🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏 ⛳️点赞 ☀️收藏⭐️关注&#x1f4…

垂类大模型微调(一):认识LLaMA-Factory

LlamaFactory 是一个专注于 高效微调大型语言模型(LLMs) 的开源工具框架,尤其以支持 LLaMA(Meta 的大型语言模型系列)及其衍生模型(如 Chinese-LLaMA、Alpaca 等)而闻名。它的目标是简化模型微调流程,降低用户使用门槛; 官方文档 一、介绍 高效微调支持 支持多种微调…

Pytorch实现论文:基于多尺度融合生成对抗网络的水下图像增强

简介 简介:提出了一种新型的水下图像增强算法,基于多尺度融合生成对抗网络,名为UMSGAN,以解决低对比度和颜色失真的问题。首先经过亮度的处理,将处理后的图像输入设计的MFFEM模块和RM模块生成图像。该算法旨在适应各种水下场景,提供颜色校正和细节增强。 论文题目:Und…

从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯

目录 前言 HAL库对GPIO的抽象 核心分析:HAL_GPIO_Init 前言 我们终于到达了熟悉的地方,对GPIO的初始化。经过漫长的铺垫,我们终于历经千辛万苦,来到了这里。关于GPIO的八种模式等更加详细的细节,由于只是点个灯&am…

基于大语言模型的推荐系统(1)

推荐系统(recommendation system)非常重要。事实上,搜索引擎,电子商务,视频,音乐平台,社交网络等等,几乎所有互联网应用的核心就是向用户推荐内容,商品,电影&…