【Java 进阶篇】MySQL数据库范式详解

news2024/11/25 12:35:26

在这里插入图片描述

范式是数据库设计中的一种理论方法,旨在通过减少数据冗余来提高数据存储的有效性和完整性。在MySQL数据库中,范式设计是一个重要的概念,它有助于组织和管理数据,确保数据的一致性和可靠性。本文将深入探讨数据库范式,包括不同范式的概念、优缺点以及示例代码。

什么是数据库范式?

数据库范式是一种规范化数据库设计的方法,旨在最小化数据冗余并提高数据存储的一致性。它将数据组织成多个关联的表,每个表都有一个特定的目的和结构。数据库范式通常分为一到六个不同的级别,称为第一范式(1NF)到第六范式(6NF)。每个级别都有一组规则,定义了表的结构和数据的关系。

第一范式(1NF)

第一范式要求表中的每一列都是不可分割的原子值,即每个单元格中只包含一个值。这是最基本的范式级别,确保数据的原子性。

示例

假设我们有一个存储学生信息的表:

学生ID学生姓名课程
1小明数学,英语
2小红物理,化学
3小刚英语,历史

这个表不符合1NF,因为课程列包含多个值,应该将其拆分为单独的表。

第二范式(2NF)

第二范式要求表中的每一列都与主键直接相关,消除了部分依赖。通常,这意味着将数据分解为多个表,以确保每个表的每一列都与主键相关。

示例

假设我们有一个订单和订单项的表:

订单表:

订单ID顾客ID订单日期
11012023-01-15
21022023-01-16

订单项表:

订单ID产品ID数量
12012
12021
22033

订单项表中的订单ID和产品ID列组合起来形成了复合主键,因为它们一起唯一标识了每个订单项。

第三范式(3NF)

第三范式要求表中的每一列都与主键直接相关,同时消除了传递依赖。这意味着表中的每一列都应该只与主键相关,而不与其他非主键列相关。

示例

假设我们有一个包含员工信息和他们所在部门的表:

员工表:

员工ID姓名部门ID部门名称
1小明101开发部
2小红102销售部
3小刚101开发部

在这个表中,部门名称与部门ID相关,但也与员工表中的姓名相关。要符合3NF,我们需要创建一个单独的部门表,以消除传递依赖。

部门表:

部门ID部门名称
101开发部
102销售部

其他范式

除了1NF、2NF和3NF之外,还有更高级的范式,如BCNF(Boyce-Codd范式)和4NF。这些范式进一步减少了数据冗余,并提高了数据库的性能和一致性。但是,通常情况下,范式的级别越高,维护和查询数据的复杂度就越高。因此,在设计数据库时,需要根据实际需求和性能考虑来选择合适的范式级别。

数据库范式的优点和缺点

优点:

  1. 数据一致性:范式设计有助于确保数据一致性,因为数据只存储一次,减少了数据的冗余。

  2. 数据更新和维护:范式设计使数据的更新和维护更加容易,因为数据只需在一个地方进行更改。

  3. 查询性能:某些情况下,范式设计可以提高查询性能,因为它可以减少数据量。

缺点:

  1. 复杂性:较高级别的范式设计通常更复杂,难以理解和维护。

  2. 查询性能:在某些情况下,范式设计可能导致查询性能下降,因为需要进行多个表的连接操作。

  3. 存储空间:范式设计可能占用更多的存储空间,因为数据不断分解为多个表。

  4. 数据一致性维护:有时需要额外的工作来维护数据的一致性,例如使用触发器或存储过程。

案例讲解

当谈到数据库范式时,最常用的范例之一是学生信息管理系统。这个系统包含学生、课程和成绩的信息,让我们来看看如何将它规范化。

原始数据表设计

首先,我们创建了三个原始数据表:学生表(Students)、课程表(Courses)和成绩表(Grades)。

学生表(Students)

StudentIDFirstNameLastNameDOBAddress
1AliceSmith1990-01-15123 Main St
2BobJohnson1989-05-22456 Elm St
3CarolDavis1992-11-10789 Oak St

课程表(Courses)

CourseIDCourseName
101Mathematics
102English
103History

成绩表(Grades)

StudentIDCourseIDGrade
1101A
1102B
1103A
2101C
2102A
2103B
3101B
3102B
3103A

第一范式(1NF)

首先,让我们将这些表规范化到第一范式(1NF)。第一范式要求每个表的每一列都包含原子值,不可再分。在原始设计中,学生表的Address列包含非原子值(Street、City、State、Zip等)。为了符合1NF,我们将其分解为独立的列。

学生表(Students)(1NF版本):

StudentIDFirstNameLastNameDOBStreetCityStateZip
1AliceSmith1990-01-15123 Main StAnytownCA12345
2BobJohnson1989-05-22456 Elm StOthertownNY54321
3CarolDavis1992-11-10789 Oak StAnotherTX67890

第二范式(2NF)

第二范式要求表中的非主键列完全依赖于主键列。在学生表中,主键是StudentID,非主键列包括FirstName、LastName、DOB以及Address相关的所有列。这是因为DOB只与学生有关,而不与课程或成绩有关。因此,学生表已经符合了第二范式。

**课程表(Courses)成绩表(Grades)**已经符合第二范式,因为它们的每一列都完全依赖于主键列。

第三范式(3NF)

第三范式要求表中的非主键列不依赖于其他非主键列。在学生表中,Street、City、State和Zip都依赖于Street,而Street又依赖于Address。这违反了第三范式。

为了符合第三范式,我们将Address分离出来,并创建一个新的表。

地址表(Addresses)

AddressIDStreetCityStateZip
1123 Main StAnytownCA12345
2456 Elm StOthertownNY54321
3789 Oak StAnotherTX67890

然后,我们更新学生表,将AddressID作为外键引用。

学生表(Students)(3NF版本):

StudentIDFirstNameLastNameDOBAddressID
1AliceSmith1990-01-151
2BobJohnson1989-05-222
3CarolDavis1992-11-103

现在,我们的学生信息管理系统已经规范化到第三范式,数据存储更加高效、可维护性更好。

结论

数据库范式是一种有助于维护数据一致性和完整性的重要设计概念。在数据库设计过程中,根据实际需求和性能要求,选择合适的范式级别非常重要。高级别的范式设计通常可以减少数据冗余,提高数据一致性,但也可能增加复杂性和查询性能的开销。因此,在设计数据库时,需要权衡这些因素,选择最合适的范式级别。

在接下来的博客中,我们将深入探讨数据库的其他方面,包括SQL查询、索引、存储过程等内容,以帮助您更好地理解和管理数据库。如果您对特定主题有任何疑问或需求,请随时提出,我们将竭诚为您提供帮助。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

必备基础算法

目录 一、双指针 双指针与链表双指针与链表 二、前缀和 一维二维 三、差分 一维二维 四、深度搜索,dfs dfs数组排列dfs岛屿问题dfs染色法(二分图判定)dfs路径规划dfs拓扑排序 五、广度搜索,bfs bfs最优路径规划bfsdijkstra 六、单…

Python与数据分析--Pandas操作进阶

目录 1.文件读取方式 1.1.绝对路径读取文件 1.2.相对路径读取文件 2.列表数据操作 2.1.列索引指定 2.2.代码数据对齐 3.创建新CSV文件 4.缺失值处理 4.1.缺失值创建 4.2.缺失值检索 4.3.缺失值查询 4.3.1.isnull()函数判断 4.3.2.notnull()函数判断 4.3.3.any()函数…

数据集笔记:2015上海地铁一卡通数据

数据地址:上海地铁数据_免费高速下载|百度网盘-分享无限制 (baidu.com) 数据介绍 上海2015年几天的地铁一卡通出入站信息 卡号、交易日期、交易时间、公交线路/地铁站点中文名称、行业名称(公交、地铁、出租、轮渡、PR停车场)、交易金额、交易性质(非优惠、优惠、…

3种Renko图表形态FPmarkets3秒轻松判断价格走势

Renko图表形态在交易中的应用并不逊色于其他技术分析方法。相较于普通的烛台图表,使用Renko图表时,有些经典模式更容易被发现和识别,FPmarkets总结这些模式包括: 首先是头和肩膀形态。这是一种价格反转形态,由两个较小…

【软件测试】软件缺陷报告如何编写

废话不多说,三张图说明 软件缺陷报告如何编写 以及 报告的跟踪流程 软件缺陷报告格式 软件缺陷报告内容说明 缺陷状态 - 分为 新建、打开、修复、关闭 - 新建 - 测试人员第一次发现缺陷 - 打开 - 测试将报告交给开发,开发确认缺陷,准备动手…

threejs中模型自定义路线移动

threejs中模型自定义路线移动 生命不息,学习不止 基于r95Threejs版本 此例子中:包括背景设置:天空之盒。 模型的引用:小车和整体 glb模型引用 路线设置(因线line2无法设置宽度,所以选择了用管道,当然也可用点成面&…

MySQL 索引介绍和最佳实践

目录 一、前言二、索引类型1.1 主键索引(PRIMARY KEY)1.2 唯一索引(UNIQUE)1.3 普通索引(NORMAL)1.3.1 单列普通索引1.3.2 单列前缀普通索引1.3.3 多列普通索引1.3.4 多列前缀普通索引 1.4 空间索引&#x…

商场做小程序商城的作用是什么?

商场是众多商家聚集在一起的购物公共场所,大商场也往往入驻着众多行业商家,是每个城市重要的组成部分。 随着互联网电商深入及客户消费行为改变,不少商场如今的客流量非常有限,甚至可以说是员工比客人多,这就导致撤店…

三相Vienna整流器电流畸变的抑制方法

该博客参考丁文龙的博士论文《低成本充电系统高性能多端口Vienna整流器关键控制策略研究》,他的博士论文深入浅出,分析透彻。感谢师妹Miss Young提供的技术指导,她是一位优秀的电力电子工程师,祝她事业顺利,身体健康。…

【教学类-06-06】20230905数字题目随便玩( 加减法、分合、比大小,纸张消耗)

背景需求: 3年前第一次设计加减法题目时,打印了一大堆加减法、数字分合、比大小的纸张。太多了,以至于三年后整理素材库,发现还有很多这样的纸片。这些20以内、50以内的题目难度大、题量多,完全不适合幼儿园孩子做&am…

Linux基础命令汇总

用户管理 su 切换用户:su 用户名 logname 显示当前用户的登录用户名:logname useradd 创建用户:useradd 用户名创建用户时指定用户的主组:useradd -g 组名 用户名 usermod 添加附属组:usermod -G 组…

基于 Python+DenseNet121 算法模型实现一个图像分类识别系统

项目展示 一、介绍 DenseNet(Densely Connected Convolutional Networks)是一种卷积神经网络(CNN)架构,2017年由Gao Huang等人提出。该网络的核心思想是密集连接,即每一层都接收其前面所有层的输出作为输…

CISSP学习笔记:安全脆弱性、威胁和对策

第九章 安全脆弱性、威胁和对策 9.1 评估和缓解安全脆弱性 9.1 硬件 处理器执行类型 多任务处理: 同时处理两个或更多任务多处理: 利用多个处理器完成一个应用程序的处理能力多程序设计:通过操作系统对单个处理器上的两个任务进行协调&…

AHH HackerHouse @Move大理站完美谢幕

Antalpha HackerHouse Move 大理站于2023年9月23日在面包树举办了Final DemoDay,这也代表着为期21天的 HackerHouse 活动完美谢幕。 自从9月3日开始,整整21天的共居时间里,我们从个体逐渐融汇成小团队,最终成为了一个紧密团结的大…

新手教程,蛋糕小程序的搭建流程一网打尽

作为一名新手,想要搭建一个蛋糕小程序可能会觉得有些困惑。但是,不用担心!今天我将为大家详细介绍蛋糕小程序的搭建流程,并带大家一步步完成。 首先,我们需要登录乔拓云网的后台。在登录成功后,点击进入商城…

OCI 发布了容器运行时和镜像规范!

7 月 19 日是开放容器计划Open Container Initiative(OCI)的一个重要里程碑,OCI 发布了容器运行时和镜像规范的 1.0 版本,而 Docker 在这过去两年中一直充当着推动和引领的核心角色。 我们的目标是为社区、客户以及更广泛的容器行…

医疗小程序开发:技术门槛高?

随着移动互联网的普及,医疗行业也逐渐转向线上。医疗小程序开发成为了很多企业和医疗机构关注的焦点。但是,对于一些技术小白来说,可能会觉得医疗小程序开发技术门槛高,无从下手。实际上,使用乔拓云平台进入后台&#…

《Python趣味工具》——ppt的操作(刷题版)

前面我们对PPT进行了一定的操作,并将其中的文字提取到了word文档中。现在就让我们来刷几道题巩固巩固吧! 文章目录 1. 查看PPT(上)2. 查看PPT(中)3. 查看PPT(下)4. PPT的页码5. 大学…

KUKA机器人通过3点法设置工作台基坐标系的具体方法

KUKA机器人通过3点法设置工作台基坐标系的具体方法 具体方法和步骤可参考以下内容: 进入主菜单界面,依次选择“投入运行”—“测量”—基坐标,选择“3点法”, 在系统弹出的基坐标编辑界面,给基座标编号为3,命名为table1,然后单击“继续”按钮,进行下一步操作, 在弹出的…

【论文极速读】Prompt Tuning——一种高效的LLM模型下游任务适配方式

【论文极速读】Prompt Tuning——一种高效的LLM模型下游任务适配方式 FesianXu 20230928 at Baidu Search Team 前言 Prompt Tuning是一种PEFT方法(Parameter-Efficient FineTune),旨在以高效的方式对LLM模型进行下游任务适配,本…