MySQL之数据库三大范式

一、什么是范式?

范式是数据库遵循设计时遵循的一种规范,不同的规范要求遵循不同的范式。

(范式是具有最小冗余的表结构)

范式可以 提高数据的一致性减少数据冗余更新异常的问题

数据库有六种范式(1NF/2NF/3NF/BCNF/4NF/5NF

标题为什么是三大范式呢??

首先我们最常用的就是第一范式第二范式第三范式

并且数据库设计时只需遵循这三个范式即可。

二、  三大范式

第一范式(1NF)

-列都是不可再分
第一范式的目标是确保每列的原子性:如果每列都是不可再分 的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)

 

第二范式(2NF)

-每个表只描述一件事情

首先满足第一范式,并且表中非主键列不存在对主键的部分依赖
第二范式要求每个表只描述一件事情

 

第三范式(3NF)

- 不存在对非主键列的传递依赖

第三范式定义是,满足第二范式,并且表中的列不存在对非主键列的传递依赖。
也就是(要求每一列数据都和主键直接相关而不能间接相关)
优点:
  1. 减少数据冗余:避免相同数据在多个地方重复存储,减少存储空间需求。
  2. 确保数据一致性:通过消除传递依赖,减少因数据更新不一致导致的错误。
  3. 简化数据管理:使数据库结构更清晰,便于维护和扩展。

primary key(id) 

idnamesex_codesex_descphoneaddress
001张三017835201234山西省运城市xx村
002李四017735204567山西省吕梁市yy村
003王五118835207890山西省太原市zz村

 表中sex_desc依赖于sex_code,而sex_code依赖于id(主键),从而推出sex_desc依赖于id(主键);sex_desc不直接依赖于主键,而是通过依赖于非主键列而依赖于主键,属于传递依赖,不符合3NF。

修改表使满足3NF后:

学生表(student)   primary key(id)

idnamesex_codephoneaddress
001张三017835201234山西省运城市xx村
002李四017735204567山西省吕梁市yy村
003王五118835207890山西省太原市zz村

性别代码表(sexcode)   primary key(sex_code)

sex_codesex_desc
0
1

 将原来的student表进行拆分后,两个表都满足3NF

三、三大范式的缺点

  1. 数据冗余消除过度:三大范式的设计原则是尽量消除数据冗余,使每个数据项只在数据库中存储一次。然而,过度消除冗余可能导致数据库的关系复杂化,增加了查询和维护的复杂性。有时候,在某些情况下,一些冗余数据可能会提高查询性能或简化数据处理逻辑,但三大范式的设计原则不允许这种冗余存在。

  2. 查询性能受影响:三大范式的设计原则使得数据库中的数据被分解为多个关系表,这样在进行复杂查询时需要进行多个表的连接操作。这样的查询操作可能会增加数据库的负载,导致查询性能下降。尤其是在大型数据库中,复杂的查询可能需要花费大量的时间来执行。

  3. 数据更新复杂:三大范式的设计原则使得数据库中的数据被分解为多个关系表,这样在进行数据的插入、更新和删除操作时需要同时更新多个表。这样的操作可能会增加数据更新的复杂性,容易出现数据不一致的问题。同时,由于多表更新的复杂性,可能需要使用事务来保证数据的一致性,进一步增加了数据库的负载和复杂性。

  4. 数据完整性限制:三大范式的设计原则强调数据的一致性和完整性,要求每个关系表中的数据项必须符合某种规范或约束条件。这些约束条件可能会限制某些特殊情况下的数据录入,使得数据库的灵活性受到了一定的限制。有时候,为了满足特定的需求,可能需要违反某些范式的设计原则。

  5. 难以理解和维护:三大范式的设计原则使得数据库中的数据被分解为多个关系表,这样数据库的结构变得更加复杂。这对于数据库管理员和开发人员来说可能会增加理解和维护的难度。尤其是在数据库规模较大、关系较复杂的情况下,可能需要更多的时间和精力来理解和维护数据库的结构。

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

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

相关文章

使用 mkcert 工具自签发 https 证书并进行本地受信

介绍 mkcert 是一个用于创建本地受信任的 SSL/TLS 证书的简单工具,特别适合开发者在本地环境中使用。它解决了为开发和测试目的创建自签名证书时遇到的信任问题。以下是关于 mkcert 的详细介绍: 特点 易用性:只需一条命令即可生成证书&…

【Swift】集合类型 - 数组、集合、字典

文章目录 集合的可变性数组数组类型简写语法创建空数组使用默认值创建数组通过合并两个数组创建一个新数组使用数组字面量创建数组访问和修改数组 Swift 提供了三种主要的 集合类型,分别是数组、集合和字典,用于存储值集合。数组是有序的值集合。集合是无…

探索 Janus-1.3B:一个统一的 Any-to-Any 多模态理解与生成模型

随着多模态技术的不断发展,越来越多的模型被提出以解决跨文本与图像等多种数据类型的任务。Janus-1.3B 是由 DeepSeek 推出的一个革命性的模型,它通过解耦视觉编码并采用统一的 Transformer 架构,带来了一个高度灵活的 any-to-any 多模态框架…

C# 中的闭包

文章目录 前言一、闭包的基本概念二、匿名函数中的闭包1、定义和使用匿名函数2、匿名函数捕获外部变量3、闭包的生命周期 三、Lambda 表达式中的闭包1、定义和使用 Lambda 表达式2、Lambda 表达式捕获外部变量3、闭包的作用域 四、闭包的应用场景1、事件处理2、异步编程3、迭代…

圣诞树.HTML

一&#xff08;1圣诞树&#xff09;代码 <!--* Author: Tina Huang* Date: 2022-12-09 21:29:19* LastEditors: Tina Huang* LastEditTime: 2022-12-10 15:35:42* Description: --> <!DOCTYPE html> <html lang"en"><head><meta charse…

Cesium进阶教程——自定义图形、外观、绘图基础、现有着色器移植至Cesium、ShadowMapping、视频GIS、模型压平、卷帘

基础必看 WEBGL基础&#xff08;从渲染管线角度解读&#xff09; 参考路线 http://www.xt3d.online/tutorial/further/article.html 自定义图形 https://blog.csdn.net/m0_55049655/article/details/138908327 https://blog.csdn.net/m0_55049655/article/details/140306837 …

ElementPlus Table 表格实现可编辑单元格

通过基础的Table表格来实现单元格内容的可编辑 1.首先定位到需要编辑的列&#xff0c;替换el-table-column <el-table-column label"Editable Column" width"300"><template #default"{ row, column, $index }"><el-inputsize&qu…

如何建设金融数据中心

目录 总则 概述 要求 基本原则 数据中心治理 概述 战略管控 战略规划 战略实施 延伸阅读 总则 概述 本文以描述金融数据中心的治理域内容为基础,从金融数据中心建设、运营及安全保障的角度出 发,逐一描述场地环境、网络通信、运行管理和风险管控等能力域的具体…

AI Weekly『12月9-15日』:OpenAI发布Sora,谷歌发布Gemini 2.0,xAI免费开放使用!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

Ubuntu 18.04无有线图表且无法设置有线网络

问题背景&#xff1a; 今天在登陆自己的虚拟机Ubuntu系统的时候突然出现 有线连接无法连接的问题&#xff0c;有线连接的图标变为没有了&#xff0c;无法点击网络菜单的Setting模块选项。我的虚拟机有线网络连接方式是NAT方式。 没有如下有线连接图标 解决方法&#xff1a; …

Maven插件打包发布远程Docker镜像

dockerfile-maven-plugin插件的介绍 dockerfile-maven-plugin目前这款插件非常成熟&#xff0c;它集成了Maven和Docker&#xff0c;该插件的官方文档地址如下&#xff1a; 地址&#xff1a;https://github.com/spotify/dockerfile-maven 其他说明&#xff1a; dockerfile是用…

Dart 3.6 发布,workspace 和 Digit separators

workspace 之前我们就聊过 Flutter 正在切换成 Monorepo 和支持 workspaces &#xff0c;Dart 3.6 开始&#xff0c;Pub 现在正式支持 monorepo 或 workspace 中 package 之间的共享解析。 pub workspaces 功能可确保 monorepo 中的 package 共享一组一致的依赖项&#xff0c…

c#笔记2024

Application.Updatescreen刷新整个屏幕 Ctrl r e自动添加get和set CompositeCurve3d 复合曲线 List<Entity> entS listline.Cast<Entity>().ToList();//list类型强转 前面拼上\u0003&#xff0c;就可以实现&#xff0c;不管有没有命令都能打断当前命令的效果 取…

【C++】sophus : interpolate_details interpolate 两李群元素之间平滑插值 (十一)

interpolate_details 这段代码为 Sophus 库的插值模块提供了一组工具&#xff0c;用于处理各种 Lie 群&#xff08;如 SO(2)、SE(3)、Sim(3) 等&#xff09;的特性查询&#xff0c;特别是关于路径歧义的检查。这些工具定义在 interp_details 命名空间中&#xff0c;通过模板化…

C 进阶 — 动态内存管理

C 进阶 — 动态内存管理 主要内容 动态内存函数 mallocfreecallocrealloc 常见动态内存错误 经典练习 柔性数组 一 动态内存函数 之前已介绍的内存开辟方式有 int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间上述开辟空间…

Ubuntu K8s

https://serious-lose.notion.site/Ubuntu-K8s-d8d6a978ad784c1baa2fc8c531fbce68?pvs74 2 核 2G Ubuntu 20.4 IP 172.24.53.10 kubeadmkubeletkubectl版本1.23.01.23.01.23.0 kubeadm、kubelet 和 kubectl 是 Kubernetes 生态系统中的三个重要组件 kubeadm&#xff1a; 主…

Java中的自定义异常

引言 Java编程中&#xff0c;异常处理是很关键的一步操作&#xff0c;它可以帮助我们更好的管理程序中的错误问题&#xff0c;Java本身内置了许多异常&#xff0c;但项目中我们需要自定义异常来提升错误问题的可读性和用户的产品体验&#xff0c;本文将深入探讨Java中的自定义异…

【深度学习项目】目标检测之YOLO系列详解(一)

介绍 YOLO&#xff08;You Only Look Once&#xff09;是一种实时目标检测算法&#xff0c;由Joseph Redmon等人提出。与传统的基于滑动窗口和区域提案的目标检测方法不同&#xff0c;YOLO将目标检测问题框架化为一个单一的回归问题&#xff0c;直接从图像像素预测边界框和类别…

C# 位运算

一、数据大小对应关系 说明&#xff1a; 将一个数据每左移一位&#xff0c;相当于乘以2。因此&#xff0c;左移8位就是乘以2的8次方&#xff0c;即256。 二、转换 1、 10进制转2进制字符串 #region 10进制转2进制字符串int number1 10;string binary Convert.ToString(num…

计算机视觉单阶段实例分割实践指南与综述

概述 原文地址&#xff1a;https://towardsdatascience.com/single-stage-instance-segmentation-a-review-1eeb66e0cc49 实例分割是一项具有挑战性的计算机视觉任务&#xff0c;需要预测对象实例及其每像素分割掩码。这使其成为语义分割和目标检测的混合体。 自 Mask R-CNN …