mysql笔记:20. 什么是数据库六大范式

文章目录

  • 简介
    • 什么是范式
    • 最常用的范式
  • 第一范式 - 1NF
  • 第二范式 - 2NF
  • 第三范式 - 3NF
  • 第四范式 - 4NF
  • 第五范式 - 5NF
  • 巴斯-科德范式 - BCNF
  • 总结

简介

什么是范式

范式(Normal Form,简称NF)是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。
数据库范式是数据库设计表结构所遵循的规范和指导方法,目的是为了减少冗余,建立结构合理的数据库,从而提高数据存储和使用的性能。

最常用的范式

最常用的范式是三大范式,即第一范式、第二范式、第三范式。这三大范式之间是具有依赖关系的。每个范式都是用来规定某种结构或数据要求,后一范式都是在前一范式已经满足的情况用来“加强要求”。比如第二范式是在第一范式的基础上建设的,第三范式是在第二范式的基础上建设的。

第一范式 - 1NF

符合1NF的关系中的每个属性都不可再分。即表中字段的数据,均不可再拆分,遵循原子性。具体来说,第一范式要求数据库表的每一列都是不可分割的原子数据项,而不能是集合、数组、记录等非原子数据项。
举例,员工表信息如下:

编号姓名性别
001技术部张三
002技术部李四
003行政部王五

上表中姓名字段中的数据是可以继续拆分的,因此它不符合第一范式。那么怎么优化才符合第一范式呢?将姓名字段拆分即可,优化结果如下:

编号部门姓名性别
001技术部张三
002技术部李四
003行政部王五

那么是否遵循第一范式就更好呢?

编号姓名家庭地址
001张三江西省南昌市东湖区
002李四广东省佛山市禅城区
003王五湖北省武汉市新洲区

观察该表,我们发现家庭地址可以继续拆分,拆分结果如下:

编号姓名
001张三江西省南昌市东湖区
002李四广东省佛山市禅城区
003王五湖北省武汉市新洲区

看上去,拆分以后更符合第一范式。但如果项目中只需要使用一个完整的家庭地址呢?明显不拆分更简单好用。
所以范式只是给我们一个参考,更多的需要根据项目实际情况来进行设计。

第二范式 - 2NF

在满足第一范式的基础上,要求表中的非主键列必须安全依赖于主键,而不是依赖于主键的一部分。这有助于减少数据冗余,并确保数据的一致性。即,一张表只描述一件事情,遵循唯一性
举例,学生成绩表如下:

学号姓名年龄课程名称成绩学分
001小张28语文903
001小张28数学1002
002小黄25语文953
002小黄25数学902
003小高22数学952
  • 姓名和年龄依赖于学号
  • 学分依赖于课程名称
  • 成绩依赖于学号和课程名称,如果学号和课程名称是联合主键,那么它们可以确定联合主键以外的所有非主键值。但姓名、年龄、学分部分依赖于主键的一部分,所以该表只符合第一范式,不符合第二范式。
    那么如何调整上述表才能符合第二范式呢?基于上述三种主键可能,将表拆分成三个。
  1. 学生表
学号姓名年龄
001小张28
002小黄25
003小高22
  1. 课程表
课程名称学分
语文3
数学2
  1. 成绩表
学号课程名称成绩
001语文90
001数学100
002语文95
002数学90
003数学95

那么,为什么要遵循第二范式呢?如果不遵循第二范式,会有什么问题呢?

  1. 数据冗余过大
    如上表,学生表和课程表分别有3条数据、2条数据。如果数据都放在一张表中,姓名、年龄、课程名称、学分数据就在表中大量冗余。
  2. 插入异常
    假如学号和课程名称是主键,现在计划新开设一门科学课,暂时还没有学生,由于缺少学号主键信息,就无法正常插入数据。
  3. 更新不方便
    假如数学课程的学分发生变化,则需要把表中关于该课程的学分全部更新。如果拆分出课程表,只需要更新一条记录。
  4. 删除异常
    假如把所有学生的数学成绩删除,那么所有与数学课程相关的数据也随之消失了。学生的数学成绩没了,并不表示这门数学课也没了。

第三范式 - 3NF

在满足第二范式的基础上,要求任何非主键列不能传递依赖于主键。也就是说,非主键列必须直接依赖于主键,而不是通过其他非主键列间接依赖于主键,遵循独立性。这有助于进一步消除数据冗余和更新异常。

编号部门姓名性别部门经理
001技术部张三王经理
002技术部李四王经理
003行政部王五李经理

上表符合第二范式,但是在非主键字段中,部门经理依赖于部门,所以不符合第三范式。那怎么调整才符合第三范式呢?答案是拆成两张表,消除依赖传递。

  1. 员工表
编号部门姓名性别
001技术部张三
002技术部李四
003行政部王五
  1. 部门表
部门部门经理
技术部王经理
行政部李经理

第四范式 - 4NF

在第三范式的基础上,要求表中的列不能再有重复的元组。也就是说,表中的每一列都应该包含唯一值,没有重复的组合。它是在第三范式的基础上进一步消除多值依赖的范式。
多值依赖是指一个非主键字段依赖于另一个非主键字段的多个值。在第四范式中,这种多值依赖关系被要求被拆分为独立的关系表,以消除数据冗余和更新异常。
具体来说,如果在一个关系模式中存在多个独立的多值依赖关系,那么这些多值依赖关系应该被分解成单独的关系模式。每个模式都只包含一组相关的数据,从而避免数据的冗余和不一致性。这样的拆分使得数据库结构更加清晰,数据更加简洁,同时也提高了数据的一致性和完整性。

第五范式 - 5NF

它要求表中的每一列都是不可再分的最小单元,并且所有的函数依赖关系都已经被明确地定义。这意味着表中不会有隐含的数据依赖关系,所有的依赖关系都应该清晰地表达出来。这有助于消除所有可能的数据冗余和更新异常。

巴斯-科德范式 - BCNF

BCNF范式并不是传统意义上的第六范式,但实验室同样是数据库设计中重要的一个概念。BCNF要求所有决定因素(即能唯一确定一个元组的属性或属性组)都必须包含候选键。这有助于消除由传递函数依赖导致的冗余和更新异常。

总结

这六大范式在数据库设计中是层层递进的,满足更高层次的范式通常意味着数据库的设计更加合理、数据冗余更少、维护更加方便。但在实际应用中,并不是一定要满足所有范式,而是要根据具体的应用场景和需求进行权衡和选择。

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

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

相关文章

大模型的实践应用19-基于pytorch框架下LayoutLM模型的搭建以及原理介绍

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用19-基于pytorch框架下LayoutLM模型的搭建以及原理介绍。LayoutLM是一个基于 Transformer 的预训练模型,它专门为处理布局丰富的文档信息而设计,例如扫描的文档、PDF 文件等。这个模型由微软亚洲研究院的研究团队开发,…

医疗设备控费系统防止私收、漏收、人情费

加19339904493(康) 医院完成信息化建设,不仅是一次技术性人深过信息化技术,医院能够更好地管理病患信息,提高诊断的准确性和效率,同时优化医疗资源的配置,降低医疗成本。在信息化的推动下&#…

docker命令查询笔记

目录 loginsearchpushpullimagesrmitaghistorysaveloadrunstartrestartstopkillrmpauseunpausecreateexecpsinspectstatstoprenameattachupdatelogswaitportexportimport login login:登录到远程仓库 登录到远程仓库后可可以拉取仓库的镜像了 docker login [OPTIO…

Git概述及安装步骤

一、Git简介 Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。Git 易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CV…

Linux下的多线程编程:原理、工具及应用(1)

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:Flower of Life—陽花 0:34━━━━━━️💟──────── 4:46 🔄 ◀️ ⏸ ▶️ ☰ …

文献速递:深度学习乳腺癌诊断---使用深度学习改善乳腺癌组织学分级

Title 题目 Improved breast cancer histological grading using deep learning 使用深度学习改善乳腺癌组织学分级 01 文献速递介绍 乳腺癌组织学分级是乳腺癌中一个确立的临床变量,它包括来自三个方面的信息,即小管形成程度、核多态性和有丝分裂计…

springboot2.7使用redis的redission组件实现分布式锁

添加pom.xml引用&#xff1a; <!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--redisson--><dependency><groupId…

IP证书有什么作用?怎么申请?

关于IP地址证书&#xff0c;它的主要作用有这么几个点&#xff1a; 1.验明正身&#xff1a;就像身份证一样&#xff0c;它可以证明某个服务器的IP地址是真的、合法的&#xff0c;让咱知道咱们连接的就是正确的服务器&#xff0c;而不是冒牌货。这样一来&#xff0c;就可以降低像…

【C++设计模式】策略模式

文章目录 前言一、策略模式是什么&#xff1f;二、策略模式的实现原理三、UML图四、代码实现总结 前言 策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。通过将每个算法封装到具有共同接口的独立类中&#xff0c;客户端可以在不改变自身代码的情况下选择…

Android 14.0 SystemUI设置系统导航栏默认为系统手势导航

1.概述 在14.0的原生系统rom产品定制化开发中,系统导航栏在10.0以后可以支持手势导航,但系统导航栏默认的是三键导航,Home Back Recent键三个键显示在底部 但是对于一些全屏的app 感觉操作起来不太方便,所以产品需要要求使用导航栏设置为系统手势导航这时系统底部就不会被…

Bugku MISC做题笔记

简单套娃DX 这一题需要对png图片的结构有所了解。详细可参考https://www.w3.org/TR/png/ 幸好每一张图片只有一个错误&#xff0c;逐步调试&#xff0c;就可以发现所有错误&#xff0c;修正即可。具体错误参看python程序中的注释&#xff1a; import ossrc_dir .\\XD\\ de…

Sklearn Lasso回归

以下是一个使用Sklearn库实现Lasso回归的简单代码示例。Lasso回归是一种用于回归分析的线性模型&#xff0c;它通过正则化项来强加稀疏性&#xff0c;从而可以估计系数的非零值&#xff0c;并使得某些系数变为零。 # 导入必要的库 from sklearn.linear_model import Lasso fro…

nicetool--替代hutool和fastjson的工具库

前言 如果你被hutool坑过、被fastjson坑过&#xff0c;nicetool帮你解脱&#xff01; 如果你想用稳定、Spring原生的工具类&#xff0c;nicetool已帮你封装&#xff01; nicetool不生产工具&#xff0c;只是JDK和Spring的封装侠&#xff01; 介绍 nicetool&#xff1a;超好…

微信每天通过好友上限是多少个呢?

微信每天通过好友上限是多少个呢&#xff1f; 1、新号和不活跃的号 微信新号是指注册不满15十五天&#xff0c;或者注册超过15天&#xff0c;但是没有好好养号的的账号。&#xff08;包括很多长期不活跃的账号&#xff0c;突然使用的情况&#xff09; 2、正常帐号 &#xf…

案例分析篇06:数据库设计相关28个考点(17~22)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

Scala--01--简介、环境搭建

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. Scala简介1.1 Scala是什么&#xff1f;官网&#xff1a; [https://scala-lang.org/](https://scala-lang.org/)官方文档&#xff1a; [https://docs.scala-lang.…

在Flutter中创建自定义的左对齐TabBar组件

在Flutter应用程序中&#xff0c;TabBar是一种常见的UI模式&#xff0c;用于在不同的标签页之间进行导航。然而&#xff0c;默认情况下&#xff0c;Flutter的TabBar在水平方向上是居中对齐的。本文将介绍如何创建一个自定义的左对齐TabBar组件&#xff0c;以满足特定的布局需求…

三、贪心算法

三、贪心算法 文章目录 三、贪心算法1、找零钱2、求一个数列的极差3、将真分数用埃及分数之和表示4、找到出现最多次数的数5、将给定的整数去掉任意个数字后重新组成最小整数 1、找零钱 #include <stdio.h> int a[7]{100,50,20,10,5,2,1},ns[7]; void main() {/********…

基于springboot+vue实现的大学计算机课程管理平台的设计与实现(全套资料)

一、系统架构 前端&#xff1a;vue | antv 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk17 | mysql | maven | node | redis 二、代码及数据库 三、功能介绍 01. 登录页 02. 首页 03. 系统基础模块-用户管理 04. 系统基础模块-部门…

一个人做电商要怎么做?满足这三个条件,你也可以!

我是电商珠珠 现在电商平台很火&#xff0c;特别是短视频电商&#xff0c;很多从来没有接触过的新手会觉得自己一个人做不了&#xff0c;或者说投入成本大&#xff0c;会有很多人工费用&#xff0c;还要找货源找场地等。 其实&#xff0c;对于传统的电商来说&#xff0c;这些…