数据库范式及其示例,看完这一篇足够

news2024/11/24 16:31:47

在这里插入图片描述

1. 什么是数据库规范化?

1.1 规范化概念

规范化是一种数据库设计技术,可减少数据冗余并消除插入、更新和删除异常等不良特征。规范化规则将较大的表划分为较小的表使用关系链接它们。SQL 中的规范化的目的是消除冗余(重复)数据并确保数据以逻辑方式存储。

关系模型的发明者Edgar Codd 提出了数据规范化的理论,引入了第一范式,并继续扩展理论,提出了第二范式和第三范式。后来他与 Raymond F. Boyce 合作发展了Boyce-Codd 范式巴斯范式/鲍依斯-科得范式)理论。

1.2 继续之前先了解下相关基础概念

1.2.1 什么是主键?

在这里插入图片描述
主值是用于唯一标识数据库记录的单列值
它具有以下特性

  1. 主键不能为 NULL
  2. 主键值必须是唯一的
  3. 主键值很少应该改变
  4. 插入新记录时必须给主键赋值。

1.2.2 什么是外键?

在这里插入图片描述

外键引用另一个表的主键!它具备如下特性:

  1. 外键可以与其主键有不同的名称。
  2. 确保一个表中的行在另一个表中有对应的行。
  3. 与主键不同,它们不必是唯一的。
  4. 外键可以为空,而主键不能为空。

1.2.3 什么是复合键?

复合键是由多个列组成的主键,用于唯一地标识一条记录
在我们的数据库中,有两个同名的人,分别是 Robert Phil,但他们住在不同的地方。
在这里插入图片描述
数据库中的复合键

在这里插入图片描述

2. DBMS 中的范式类型

以下是 SQL 中的范式列表,共7种,前三种尤为主要。

2.1 1NF(第一范式)

  • 消除单个表中的重复组
  • 为每组相关数据创建一个单独的表
  • 使用主键标识每组相关数据

确保数据库表的组织方式使得每列包含原子(不可分割)值,并且每条记录都是唯一的。这消除了重复组,从而将数据结构化为表和列。

2.2 2NF(第二范式)

  • 为适用于多条记录的值集创建单独的表
  • 将这些表与外键关联起来

建立在 1NF 的基础上,我们需要从应用于多行的表中删除冗余数据。并将它们放在单独的表中。它要求所有非键属性在主键上完全发挥作用。

记录不应依赖于表的主键(必要时为复合键)以外的任何内容。例如,考虑会计系统中的客户地址。客户表需要该地址,订单、发货、发票、应收账款和收款表也需要该地址。不要将客户地址作为单独的条目存储在每个表中,而是将其存储在一个地方,即客户表或单独的地址表中。

2.3 3NF(第三范式)

  • 消除不依赖于键的字段

通过确保所有非键属性不仅在主键上完全发挥作用,而且彼此独立,扩展了 2NF。这消除了传递依赖性。

2.4 BCNF(博伊斯-科德范式)

3NF 的改进,解决了 3NF 无法处理的异常。它要求每个决定因素都是候选键,确保更严格地遵守规范化规则。

2.5 4NF(第四范式)

解决多值依赖关系。它确保记录中不存在关于实体的多个独立多值事实。

2.6 5NF(第五范式)

也称为“投影连接范式”(PJNF),它涉及从较小的、不同排列的数据片段重建信息。

2.7 6NF(第六范式)

理论性的,并未得到广泛实施。它通过进一步分解表格来消除所有非时间冗余,从而处理时间数据(处理随时间而发生的变化)。

MySQL 服务器中的数据规范化理论仍在进一步发展。例如,甚至有关于第六范式的讨论。然而,在大多数实际应用中,规范化在第三范式中达到最佳效果。SQL 理论中规范化的演变如下所示:

在这里插入图片描述
数据库范式演变过程

在这里插入图片描述

3. 数据库规范化示例

借助案例研究,可以轻松理解数据库规范化示例假设一个视频库维护着一个出租电影的数据库。如果数据库中没有任何规范化,则所有信息都存储在一个表中,如下所示。让我们通过带解决方案的规范化示例来了解规范化数据库:

在这里插入图片描述
这里你可以看到电影租赁列有多个值。现在让我们进入第一范式:

3.1 第一范式(1NF)

  • 每个表格单元格应包含一个值。
  • 每条记录都必须是唯一的。

上表符合 1NF 规范
在这里插入图片描述
DBMS 中的 1NF 示例

3.2 第二范式(2NF)

  • 规则 1- 符合 1NF
  • 规则 2- 单列主键在功能上不依赖于任何候选键关系的子集
    很明显,除非我们对上面的表进行分区,否则我们无法继续将我们的简单数据库创建为第二范式形式。
    在这里插入图片描述
    在这里插入图片描述
    我们将范式一( 1NF) 表分为两个表,即表 1 和表 2。表 1 包含会员信息。表 2 包含租借电影的信息。
    我们引入了一个名为 Membership_id 的新列,它是表 1 的主键。可以使用会员 ID 在表 1 中唯一地标识记录。

3.2.1 数据库 — 外键

在表 2 中,Membership_ID 是外键
在这里插入图片描述

3.2.2 为什么需要外键?

假设一个新手在表 B 中插入一条记录,例如:
在这里插入图片描述
您只能将父表中唯一键中存在的值插入外键中。这有助于实现引用完整性
可以通过将表 2 中的成员 ID 声明为表 1 中成员 ID 的外键来解决上述问题,现在,如果有人尝试在会员 ID 字段中插入父表中不存在的值,则会显示错误!这起到减少脏数据的作用

3.3 第三范式(3NF)

  • 规则 1- 符合 2NF
  • 规则 2- 没有传递函数依赖

3.3.1 什么是传递函数依赖?

传递函数依赖是指更改非关键列时,可能导致任何其他非关键列发生更改,考虑表 1,更改非键列“全名”可能会更改“称呼”,如下所示:
在这里插入图片描述
好,理解这个后,让我们进入 3NF!

3.3.2 3NF 示例

为了将我们的 2NF 表移到 3NF,我们需要再次划分我们的表。下面是 SQL 数据库中的 3NF 示例
在这里插入图片描述
表1,成员表
在这里插入图片描述
表2,成员电影租借表
在这里插入图片描述
表3,称呼表

我们再次划分了表格并创建了一个存储称呼的新表。
没有传递函数依赖关系,因此我们的表符合 3NF。
在表 3 中,称呼 ID 是主键,而在表 1 中,称呼 ID 与表 3 中的主键无关。

现在,我们的小示例处于无法进一步分解的级别,无法在 DBMS 中获得更高范式类型的规范化。事实上,它已经处于更高的规范化形式。在复杂的数据库中,通常需要单独努力才能进入下一个规范化数据级别。但是,我们将在下文中简要讨论 DBMS 中的下一个规范化级别。

3.4 Boyce-Codd 范式 (BCNF)

即使数据库符合第三范式,如果它有多个候选键,仍然会导致异常。

有时 BCNF 也称为3.5 范式

3.5 第四范式(4NF)

如果没有任何数据库表实例包含两个或多个描述相关实体的独立多值数据,则它属于第四范式。

3.6 第五范式(5NF)

仅当表符合 4NF 时,它才符合第五范式,并且它不能在不丢失数据的情况下分解为任意数量的较小表。

3.7 第六范式(6NF)

第六范式目前尚未标准化,但数据库专家已经讨论了一段时间。希望在不久的将来,我们能对第六范式有一个清晰而标准化的定义……

4. 范式的优点

4.1 提高数据一致性

规范化确保每条数据只存储在一个地方,减少数据不一致的机会。当数据更新时,只需在一个地方更新,确保一致性。

4.2 减少数据冗余

规范化通过将数据分成多个相关表来帮助消除重复数据。这可以节省存储空间,同时提高数据库的效率。

4.3 提高查询性能

规范化数据库通常更易于查询。由于数据按逻辑组织,因此可以优化查询以加快运行速度。

4.4 使数据更有意义

规范化涉及以合理且直观的方式对数据进行分组。这可以使数据库更易于理解和使用,尤其是对于没有设计数据库的人来说。

4.5 降低异常发生的可能性

异常是添加、更新或删除数据时可能发生的问题。规范化可以通过确保数据按逻辑方式组织来降低这些异常发生的可能性。

5. 规范化的缺点

5.1 复杂性增加

规范化会导致关系复杂。大量带有外键的表可能难以管理,从而导致混乱。

5.2 灵活性降低

由于规范化规则严格,存储不遵守这些规则的数据可能会缺乏灵活性。

5.3 增加的存储要求

虽然规范化可以减少冗余,但可能需要分配更多的存储空间来容纳额外的表和索引。

5.4 性能开销

连接多个表可能会对性能造成很大影响。数据越规范化,需要的连接就越多,这会减慢数据检索时间。

5.5 数据上下文丢失

规范化将数据分解为单独的表,这可能导致业务上下文丢失。检查相关表对于了解数据上下文是必不可少的。

5.5 需要专业知识

实施规范化数据库需要深入了解数据、数据之间的关系以及规范化规则。这需要专业知识,而且可能非常耗时。

6.全篇总结

在这里插入图片描述

以上就是 SQL 规范化的全部内容!!!我们概括为以下6点:

  1. 数据库设计对于成功实施满足企业系统数据要求的数据库管理系统至关重要。
  2. DBMS 中的规范化是一个有助于生成具有更好的安全模型的数据库系统的过程
  3. 函数依赖性是规范化数据过程中非常重要的组成部分
  4. 大多数数据库系统都是符合 DBMS 中的第三范式的规范化数据库。
  5. 主键唯一地标识表中的记录,并且不能为空。
  6. 外键帮助连接表并引用主键。

感谢大家拜读本文!!关注我,下期会有更好的干货学习分享!

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

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

相关文章

Java面试题:Spring循环引用(循环依赖)

Spring中的循环引用 在创建A时需要B,创建B时需要A 三级缓存解决循环依赖问题 在Spring中定义了一个类 DefaultSingletonBeanRegistry 中定义了三个map singletonObjects 一级缓存 单例池,存放完整初始化的bean对象 earlySingletonObjects 二级缓存 缓存早期的bean对象…

【JavaEE初阶】CAS(比较和交换)

目录 🌲 什么是 CAS 🌳 CAS的应用 🚩 实现原子类 🚩 实现自旋锁 🎄 CAS 的 ABA 问题 🚩 什么是 ABA 问题 🚩 ABA 问题引来的 BUG 🚩 解决方案 🍀CAS相关面试题 …

自动化测试客户端程序 时,选择使用什么自动化测试工具?

自动化测试客户端程序时,可以选择多种自动化测试工具,这些工具根据测试的具体需求、目标平台以及开发语言等因素有所不同。以下是一些常用的自动化测试工具,它们分别适用于不同的测试场景: 1. Appium 简介:Appium是一…

你要动态建表,还要动态导入Excel?

背景 ⭐⭐⭐⭐⭐转载请注明出处:https://juejin.cn/post/7400945359192866828 前几天和公司的小伙伴聊天的时候,得知他们的项目里正要做一个功能。大概就是每家公司都会建一张表,这张表会有什么字段不确定,可能有的表10个字段,有的8个字段。然后会有导入的功能,就是给这张…

java实现解析pdf格式发票

为了减少用户工作量及误操作的可能性&#xff0c;需要实现用户上传PDF格式的发票&#xff0c;系统通过解析PDF文件获取发票内容&#xff0c;并直接将其写入表单。以下文章记录了功能实现的代码。 发票样式 发票内容解析 引用Maven 使用pdfbox <dependency><groupI…

API可观察性对于现代应用程序的最大好处

API可观察性是提升性能、加速问题诊断和增强安全的关键。它在理解和管理错综复杂的API交互方面发挥着至关重要的作用。利用API可观察性&#xff0c;您可以深入洞察API的工作状态&#xff0c;保障服务的可靠性&#xff0c;并优化用户体验。 在当今的数字环境中&#xff0c;API …

kubernetes集群部署sql server数据库服务

背景&#xff1a; 因业务上线需要&#xff0c;研发中心要求在kubernetes测试集群部署一个sql server 2017的数据库&#xff0c;用于业务功能调试。 一、实施部署sql server数据库&#xff1a; 1、拉取sql server 2017的镜像&#xff1a; [rootharbor-02 ~]# docker pull mcr…

POI导出复杂Excel表格

记录在遇到复杂统计报表业务时&#xff0c;无法使用Excel模板生成对应报表&#xff0c;则采用最原始poi方式进行创建生成 业务所需统计报表如下图 麻烦所在各类型订单下方餐别为动态数据&#xff0c;废话不多说直接上代码 new CellRangeAddress(起始行号, 终止行号, 起始列号,…

Android Studio 设置打开layout.xml文件的默认视图split

Android Studio 设置打开layout.xml文件的默认视图 Android Studio 设置打开layout.xml文件的默认视图 androd studio 在使用的时候打开我们自己的布局文件默认展示的视图为Design,我们想要编辑的时候还有手动切换成splite 视图或者Code视图&#xff0c;不上很方便&#xff0c…

CA证书和openssl介绍

文章目录 一、加密和算法常见的安全攻击加密算法和协议对称加密非对称加密算法 二、CA和证书中间人攻击CA和证书安全协议SSL/TLS协议介绍HTTPS 三、opensslopenssl介绍使用openssl实现对称加密使用openssl命令生成加密密码生成随机密码建立私有CA证书申请颁发建立私有CA实际例子…

Java-数据库基本概念

数据库DataBase 定义: 保存一组数据的仓库就是数据库 例 BirdBoot项目中&#xff0c;我们为了保存一组用户信息&#xff0c;创建了一个目录users。里面用若干个文件保存每一个用户信息 此时users目录就可以称为是一个数据库 只不过对于这些数据的维护操作&#xff0c;要么…

【最多可以参加的会议数目】python刷题记录

R4-贪心篇 结束时间升序排列优先队列 class Solution:def maxEvents(self, events: List[List[int]]) -> int:dictdefaultdict(list)for i,val in enumerate(events):dict[val[0]].append(val[1])#优先队列&#xff08;小根堆&#xff09;h[]ret0for i in range(1,100001)…

C语言求平方和倒数

文章目录 1. 代码实现float类型数据double类型数据使用 double 类型的调整 2. 魔数与位级别操作浮点数表示位级别魔数操作 3. 牛顿迭代4. 复杂代码具体解释具体解释&#xff1a;目的&#xff1a;举例&#xff1a; 5.感谢 平方和倒数 广泛用于计算机图形学中&#xff0c;尤其是在…

Qt实现类似淘宝商品展示看板功能简版

前一篇文章的简化版本只有浏览功能&#xff0c;前一篇文章链接如下&#xff1a; Qt实现类似淘宝商品看板的界面&#xff0c;带有循环翻页以及点击某页跳转的功能 效果如下&#xff1a; 代码留给有需要的人。 #ifndef ModelDashboardGroup_h__ #define ModelDashboardGroup_…

DC-DC PCB 布线参考

在DC-DC芯片的应用设计中&#xff0c;PCB布板是否合理对于芯片能否表现出其最优性能有着至关重要的影响。不合理的PCB布板会造成芯片性能变差如线性度下降&#xff08;包括输入线性度以及输出线性度&#xff09;、带载能力下降、工作不稳定、EMI辐射增加、输出噪声增加等&#…

容量 动效 仪表盘 Canvas 2D API

容量动效 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Canvas 内部圆形波浪</title><…

【区块链+乡村振兴】基于区块链的农权抵押贷款平台 | FISCO BCOS应用案例

当前两权抵押贷款业务逐渐活跃&#xff0c;但因参与两权抵押的相关方独立运营各自的管理系统&#xff0c;办理农权抵押贷款业务时&#xff0c; 存在多方信息不对称、业务办理过程繁琐、低效等问题&#xff0c;且不利于相关部门对农权抵押情况进行监督管理。具体表现在&#xff…

《数据资产管理核心技术与应用》相关分享章节

【图书推荐】《数据资产管理核心技术与应用》-CSDN博客 图书《数据资产管理核心技术与应用》介绍-CSDN博客 本文用于快速了解数据资产管理的概念及其技术范围。 数据资产通常是指那些可以通过分析来揭示价值、支持企业决策制定、优化企业流程、预测行业的未来趋势或产生更大…

dhcp+checkkickstar的实验理解

文章目录 实验介绍使用的服务介绍PXE服务dhcp服务Kickstart 服务tftp服务 第一部分&#xff08;基础部分&#xff09;代码展示注意点第一点![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/13c0f4aabb664655a4dd285dd8e5527a.png)第二点 结果展示 第二部分&#xff08…

元岳食堂采购供应链系统-智慧食堂数据化解决方案

随着社会的发展和科技的进步&#xff0c;在数字化浪潮的推动下&#xff0c;智慧食堂供应链系统逐渐成为食堂管理的重要工具。在此背景下&#xff0c;元岳食堂采购供应链系统应运而生&#xff0c;该系统通过其独特的数字化和自动化功能&#xff0c;能够对食堂的采购、储存、配送…