sql专题 之 三大范式

ops/2024/11/14 10:31:11/

文章目录

  • 背景
  • 范式介绍
    • 第一范式:属性不可再分
    • 第二范式
    • 第三范式
    • 注意事项
  • 为什么不遵循后续的范式
  • 数据库范式在实际应用中会遇到哪些挑战?

背景

  • 数据库的范式(Normal Form)是一组规则,用于设计数据库表结构以 减少数据冗余提高数据完整性
  • 范式的概念最早由埃德加·科德(Edgar F. Codd)提出,他是关系型数据库之父。
  • 范式是一系列的 设计规则

    从第一范式到更高的范式(如第二范式2NF、第三范式3NF、Boyce-Codd范式(BCNF)、第四范式4NF、第五范式NF等)。
    每个层次都建立在前一个层次的基础上,进一步消除数据冗余和依赖关系。

  • 范式虽然分为多个级别,但最常用的是前三个范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)

范式介绍

接下来我们会用一个学生信息存储表来举例来了解一下三大范式的规则。
这张表需存储:学生学号学生姓名考试分数分数等级考试科目手机号码 信息。

  • 初始表格 【表_0】 如下:
    在这里插入图片描述

第一范式:属性不可再分

First Normal Form,但是通常我们用“1NF”来表示

  • 定义

    如果一个表符合第一范式,么这个表中的每个字段都必须包含单一值,而不能是数组或者集合。
    即表中的每个属性都是原子的,不可再分割

  • 特点
    • 所有列的值都不可再分割,且没有重复的列
    • 每行都是唯一的
  • 示例解析

    【表_0】中,score列存储了分数和分数等级两个数据。

  • 缺点:
    • (1)如果需要求学生的总分时,还需要对数据进行切割,损耗了性能
    • (2)如果需要等级A的学生的总数时,只能进行模糊查询,损耗率性能
    • (3)不能按照分数或者分数等级进行分组排序
  • 优化:
    • 将分数和等级拆分成 score 和 score_level 两个字段。优化结果如下【表_1】
      在这里插入图片描述

第二范式

Second Normal Form,但是通常我们用“2NF”来表示

  • 定义

    在满足第一范式的基础上,消除部分依赖
    即,每个非主属性必须依赖于整个主键,而不能仅依赖于部分主键

  • 特点

    1、第二范式一定是第一范式,第一范式是基础
    2、非主属性不能依赖部分属性(没懂不要急,马上就要解释了)

  • 示例解释
    • 【表_1】中,学号(sno)+学科(subject)可以唯一的确定一列。所以【sno+subject】为主键。
      但是学生姓名(sname) 和 电话号码(phone)确是只依赖于sno存在的。
  • 缺点:
    • 数据产生了大量的冗余数据,会增加查询的耗时,也会增加数据一致性的维护成本

      假如学生有十门考试成绩,那么就会存储十份电话号码。
      如果某一个数据出现了不一致的情况,就会不确定正确的数据是哪个了

  • 优化:我们对表进行拆分成【个人信息表】 和【考试成绩表】
    在这里插入图片描述
    在这里插入图片描述

第三范式

Thrid Normal Form,但是通常我们用“3NF”来表示

  • 定义

    在满足第二范式的基础上,消除传递依赖,即非主属性不能依赖于其他非主属性

  • 特点

    所有非主属性都直接依赖于主键,而不能依赖于其他非主属性

  • 示例解释

    在上边的学生信息表中,score_level的取值依赖于score的值。
    如果 score >= 90,那么 score_level=“A”;
    如果71<= score <= 89,那么 score_level=“B”;
    如果 score <= 70,那么 score_level=“C”;

  • 优化:将score_level拆分出来成一个等级表,且该等级表不会改变
    (这里数字太多,我们就只写上边出现的数字吧)
    在这里插入图片描述
    在这里插入图片描述

    这里举例用分数不太恰当,感受不出第三范式的简洁来。
    我们可以这么理解,在公司中的员工考核,评价A+\A\A-,等级均为A;评价B+\B\B-,等级均为B;
    评价C+\C\C-,等级均为C;
    然后我们在等级表中,就只需要存储9条信息就可以了。对比与将考核等级仅满足第二范式,这样可以更清楚的了解等级的划分标准。

注意事项

  • 虽然三大范式是数据库的基本原则,但是在实际情况中也需要根据实际项目情况进行取舍,不要过度追求规范化

    过度规范化可能会导致数据表数量增多、关系变得更加复杂,从而增加查询和维护的难度

  • 如果是大数据量,如表里数据有2000w+,查询时需要关联多张表才能取到完整的数据,造成性能瓶颈。这时候我们可以在表中适当的冗余(用空间换时间~)
  • 所以,在设计数据库需要根据实际需求进行灵活调整

为什么不遵循后续的范式

  • 在实际应用中,数据库的设计并不需要达到BCNF级别,更不用说4NF\5NF。
    • 1、随着范式的提高,数据库的设计变得更复杂也更难维护
    • 2、高范式可能导致更多的连表查询,影响数据库的性能
    • 3、虽然存在更多范式,但实际中1NF、2NF、3NF常被提及和使用
      (虽然我们大学也学高数,但实际生活中买东西,我们并不需要去求导~😏😏😏)

数据库范式在实际应用中会遇到哪些挑战?

  • 1、设计复杂度高

    高范式的设计意味着更多的表和更复杂的表关系,增加了数据库的设计和理解难度

  • 2、性能下降

    高范式下查询因为要多表连接,会导效率下降,尤其在大数据和高并发访问的场景下尤为明显。

  • 3、存储空间更大

    因为数据不断拆分为多个表,会占用更多的存储空间

  • 4、数据一致性的维护

    在更改一个数据时,需要确保相关表中的数据都得更新

  • 5、插入、更新、删除异常

    在非常严格范式的要求下,如果要增加一条数据,需要先检查多个表。在更新或者删除时,也可能因为依赖关系而更新或者删除不成功

  • 6、数据冗余

    有时为了提升效率而故意引入冗余数据


http://www.ppmy.cn/ops/132704.html

相关文章

利用RANSAC算法拟合平面并生成包围框的点云处理方法,点云聚类、质心坐标、倾斜角度、点云最小外接矩形

该代码用于分析和处理点云数据&#xff0c;通过对点云数据进行裁剪、平面拟合和生成包围框来提取特定区域的特征并发布结果。主要使用了RANSAC算法来识别并拟合平面&#xff0c;从而提取平面的法向量&#xff0c;接着根据该平面计算出该区域的最小矩形包围框&#xff08;Boundi…

微信小程序——用户隐私保护指引填写(详细版)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

苍穹外卖 新订单提醒

通过WebSocket技术实现新订单提醒功能&#xff0c;每当有新的订单&#xff0c;就在商家管理端发送消息提示。 WebSocketServer package com.sky.Websocket;import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.PathVariable;im…

vue/react做多语言国际化的时候,在语言配置中不同的语言配置不同的字体,动态引入scss里面

如果想直接在vue文件的css里面使用&#xff0c;就可以使用i18n的t函数&#xff0c;注意t外层也有引号&#xff1a; font-size: v-bind("t(style.teamCurModelFontSize)"); 前提是要引入t函数&#xff1a;

性能调优专题(7)之Innodb底层原理与Mysql日志机制深入剖析

一、MYSQL的内部组件结构 大体来说&#xff0c;Mysql可以分为Server层和存储引擎层两部分。 1.1 Server层 Server层主要包括连接器、查询缓存、词法分析器、优化器等。涵盖MYSQL的大多数核心服务功能&#xff0c;以及所有的内置函数(如日期、时间、数学和加密函数等)&#x…

Webserver(4.4)多进程/多线程实现并发服务器

目录 多进程实现并发服务器多线程实现并发服务器TCP状态转换 多进程实现并发服务器 要实现TCP服务器处理并发的任务&#xff0c;使用多线程或者多进程来解决 一个父进程&#xff0c;多个子进程 父进程负责等待并接受客户端的连接 子进程&#xff1a;完成通信&#xff0c;接收一…

qt配合映美精取图开发

最近开发一个项目&#xff0c;用映美精相机配合halcon做取图开发&#xff0c;由于网上资料小特意写个记录。到映美精官网下载驱动&#xff0c;映美精官网&#xff0c;下载映美精的工具开发包SDK 映美精的SDK下载SDK后找到classlib文件夹 里面就是SDK新建一个qt程序&#xff0c…

安全编码实践:反射API的“间谍游戏”

在编程的世界里&#xff0c;反射API就像是一把双刃剑&#xff0c;它既强大又危险。它能让你的代码像007一样灵活多变&#xff0c;但稍不留神&#xff0c;就可能引发安全危机。今天&#xff0c;我们就来聊聊如何在这场“间谍游戏”中&#xff0c;安全地使用反射API进行数据操作。…