【数据库范式】实际案例分析

前言
在日常业务研发过程中,我们常常需要与数据库表打交道。设计范式是数据表设计的基本原则,对于数据表的设计范式,我们特别容易忽略它的存在。很多时候,当数据库运行了一段时间之后,我们才发现数据表设计上有问题。然后重新调整数据表的结构,需要做数据迁移,还有可能影响程序处理的业务逻辑,甚至系统的正常服务运行。
其实在数据库表结构设计的初期时候,我们就需要重视数据表的设计。

什么是设计范式

关系型数据库模型的时候,需要对关系内部各个属性之间联系的合理化程度进行定义,这就有了不同等级的规范要求,这些规范要求被称为范式(NF)。
范式简单理解即为:一张数据表的设计结构需要满足的某种设计标准的级别。

目前关系型数据库一共有 6 种范式,按照范式级别,从低到高分别是:1NF(第一范式)、2NF(第二范式)、3NF(第三范式)、BCNF(巴斯 - 科德范式)、4NF(第四范式)和 5NF(第五范式,又叫做完美范式)。

数据库的范式设计越高阶,冗余度就越低,同时高阶的范式一定符合低阶范式的要求,比如满足 2NF 的一定满足 1NF,满足 3NF 的一定满足 2NF,依次类推。

这么多的范式级别,那是不是都要符合呢?

一般来说只要符合前 3 个范式,就足够了但也不绝对,有时候为了提高某些查询性能,我们还需要破坏范式规则,也就是反规范化。

第一范式

数据库表中的所有字段都是原子性的,不可再分。

案例一:用户表中的联系方式

在这里插入图片描述
上面的:联系方式是一个复合属性,这是在数据库中无法创建出来的。可以进行拆分。

姓名 |  性别	|	 手机		| 固话		| 邮箱
这样拆分后,每一列都无法再分了,满足了第一范式的要求。通常来讲,第一范式的表都是标准的【二维表】。
下面我们讲讲第二范式,它是在第一范式的基础上定义的。

第二范式

第二范式:表中必须存在业务主键,并且非主键的所有列 全部依赖于 业务主键。
理解第二范式可以从以下两个关键点入手:

  • 业务主键:每个表必须有一个业务主键,它是用来唯一标识表中的每一行数据的。通过业务主键,我们可以定位到唯一的一行数据。例如,在一个学生表中,学生的学号可以作为业务主键。

  • 非主键依赖:除了业务主键之外的所有列都必须完全依赖于业务主键。这意味着,表中的每个非主键列的值都必须由业务主键来决定,而不能只依赖于其他非主键列。这样可以确保数据的一致性和完整性。例如,在学生表中,学生的姓名、年龄、性别等信息都应该完全依赖于学生的学号。

如果表中使用的是复合主键,即由多个列组成的主键,那么除了这些列之外的所有列都必须完全依赖于这些复合主键的所有列。这样可以确保表中的数据不会出现冗余和不一致的情况。

订单表为例来详细说明

让我们以一个订单表为例来详细说明第二范式的要求。

假设我们有一个订单表,其中包含以下列:订单号(OrderID)、产品ID(ProductID)、产品名称(ProductName)、客户ID(CustomerID)、客户姓名(CustomerName)、订单日期(OrderDate)、订单金额(OrderAmount)。

在这个例子中,我们可以将订单号和产品ID作为复合主键,因为一个订单可以包含多个产品,而每个产品在同一个订单中的位置是唯一的。

根据第二范式的要求,除了订单号和产品ID之外的所有列都必须完全依赖于这两个复合主键的所有列。

在这个例子中,订单号和产品ID决定了订单中的每个产品的唯一性。因此,订单表中的其他列,如产品名称、客户ID、客户姓名、订单日期和订单金额,都必须完全依赖于订单号和产品ID。

换句话说,如果我们知道订单号和产品ID,我们就能确定产品名称、客户ID、客户姓名、订单日期和订单金额。但是,如果我们只知道其中一部分信息,比如只知道订单号,那么我们无法确定产品名称或其他列的值。

这样设计的好处是,避免了数据冗余和不一致性。如果某个非主键列只依赖于复合主键的一部分,那么在更新数据时可能会导致数据不一致。而且,如果数据冗余,会增加数据存储的开销和维护的复杂性。

因此,根据第二范式的要求,我们应该将订单表拆分为两个表:一个是订单表,包含订单号和产品ID作为复合主键;另一个是产品表,包含产品ID和其他与产品相关的信息。这样可以确保数据的一致性和完整性,并提高数据库的性能和可维护性。

第三范式

什么是第三范式

表中的非主键列之间不能相互依赖

课程案例

在这里插入图片描述

理解第三范式可以从以下几个关键点入手:

  • 主键:每个表必须有一个主键,它是用来唯一标识表中的每一行数据的。主键可以由一个或多个列组成。在上述例子中,【主标题】可以作为主键。

  • 非主键列之间的依赖:根据第三范式的要求,非主键列之间不能相互依赖。这意味着,表中的每个非主键列的值都应该独立于其他非主键列的值。在上述例子中,【讲师职位】依赖于【讲师名称】,毕竟先有讲师,才能给讲师对应的职位,他们之间有了相互依赖。这违反了第三范式的要求。

解决方案

要解决这个问题,就是将有冲突的列独立出去,比如这里独立为一个( 讲师表 )
在这里插入图片描述

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

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

相关文章

linux常见命令-文件目录类

9.4 文件目录类 (1)pwd 指令:显示当前工作目录的绝对路径 (2)Is指令:查看当前目录的所有内容信息 基本语法: ls [选项,可选多个] [目录或是文件] 常用选项:-a:显示当前目录所有的文件和目录,包括隐藏的…

钢铁异常分类 few-shot 问题 小陈读paper 钢铁2

很清爽的 abstract 给出链接 前面的背景意义 其实 是通用的 这里替大家 整理一吓吓 1 缺陷分类在钢铁表面缺陷检测中 有 意义。 2 大多数缺陷分类模型都是基于完全监督的学习, 这需要大量带有图像标签的训练数据。 在工业场景中收集有缺陷的图像是非常困难…

C++入门(c++历史篇)

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 重点 1. 什么是C2. C的发展…

RTOS(6)任务管理

任务状态理论 我们是怎么实现,两个同优先级的任务之间交替执行的呢? 任务切换的基础:tick中断! tick为1ms一个周期,可以通过修改时钟配置修改; running:正在进行的任务3为running&#xff…

`SQL`编写判断是否为工作日函数编写

SQL编写判断是否为工作日函数编写 最近的自己在写一些功能,遇到了对于工作日的判断,我就看了看sql,来吧!~(最近就是好疲惫) 我们一起看看(针对ORACLE) 1.声明: CREATE OR REPLACE PACKAGE GZYW_2109_1214.PKG_FUN_GETDAY_HDAY AS /** * 通过节假日代码获取指定的日期[查找基…

drawio简介以及下载安装

drawio简介以及下载安装 drawio是一款非常强大的开源在线的流程图编辑器,支持绘制各种形式的图表,提供了 Web端与客户端支持,同时也支持多种资源类型的导出。 访问网址:draw.io或者直接使用app.diagrams.net直接打开可以使用在线版…

STM32 裸机编程 03

MCU 启动和向量表 当 STM32F429 MCU 启动时,它会从 flash 存储区最前面的位置读取一个叫作“向量表”的东西。“向量表”的概念所有 ARM MCU 都通用,它是一个包含 32 位中断处理程序地址的数组。对于所有 ARM MCU,向量表前 16 个地址由 ARM …

VSCode搭建ESP32 ESP-IDF开发环境-Windows

陈拓 2023/10/09-2023/10/14 1. 安装Windows系统下的ESP32 ESP-IDF开发环境 见《Windows系统安装ESP32 ESP-IDF开发环境》 Windows系统安装ESP32 ESP-IDF开发环境-CSDN博客Windows系统安装ESP32 ESP-IDF开发环境。https://blog.csdn.net/chentuo2000/article/details/1339225…

迅为RK3588开发板使用RKNN-Toolkit-lite2运行测试程序

1 首先也需要部署运行环境,将库文件放入 RK3588 开发板上,我们将网盘资料“iTOP-3588 开发 板 \02_ 【 iTOP-RK3588 开 发 板 】 开 发 资 料 \12_NPU 使 用 配 套 资 料 \05_Linux_librknn_api\librknn_api\aarch64”路径下的文件通过U盘拷贝到开发板的…

AI AIgents时代-(五.)Autogen

由微软开发的 Autogen 是一个新的 Agents 项目,刚一上线就登上GitHub热榜,狂揽11k星✨✨✨ 项目地址:https://github.com/microsoft/autogen Autogen 允许你根据需要创建任意数量的Agents,并让它们协同工作以执行任务。它的独特之…

stable-diffusion-webui sdxl模型代码分析

采样器这块基本都是用的k-diffusion,模型用的是stability的原生项目generative-models中的sgm,这点和fooocus不同,fooocus底层依赖comfyui中的models,comfy是用load_state_dict的方式解析的,用的load_checkpoint_guess…

实时精准 自我防护 | 开源网安RASP平台能力获客户认可!

近日,开源网安收到了一封来自华润数科的感谢信,表达了对开源网安团队在网络安全工作中给予大力支持的衷心感谢。开源网安十分注重客户的需求和信任,客户的满意和认可是开源网安最大的追求。 在助力华润数科网络安全工作开展过程中&#xff0c…

nextjs-一个基于React的全栈框架

一、nextjs基本介绍 Next.js是一个基于React的轻量级框架,用于构建React应用程序。它在React的基础上提供了一些增强功能,包括服务器渲染(SSR)、静态生成(SSG)、路由等。Next.js的目标是简化React应用程序…

十八、字符串(1)

本章概要 字符串的不可变 的重载与 StringBuilder 意外递归字符串操作 字符串操作毫无疑问是计算机程序设计中最常见的行为之一。 在 Java 大展拳脚的 Web 系统中更是如此。在本章中,我们将深入学习在 Java 语言中应用最广泛的 String 类,并研究与之相关…

pymysql连接Mariadb/Mysql出现错误(配置正确情况下)解决办法

场景:在kali中使用python中pymysql对Mariadb进行连接,在整个过程中配置全部正确,但是就是无法进行连接,提示结果如下: Access denied for user rootlocalhost解决办法:进入数据库中,将默认密码…

实验室烧杯可以用超声波清洗机吗

实验室烧杯可以用超声波清洗机吗?答案是可以的!超声波清洗机不仅可以清洗实验烧杯,还可以用于清洗实验室中的试管、培养皿、移液管、载玻片、容量瓶、锥形瓶等各类实验器皿。在实验中,如果烧杯清洁不到位,会使得实验数…

分布式存储 vs. 全闪集中式存储:金融数据仓库场景下的性能对比

作者:深耕行业的 SmartX 金融团队 张德敏 近年来随着金融行业的高速发展,经营决策者及监管机构对信息时效性的要求越来越高,科技部门面临诸多挑战。例如,不少金融机构使用数仓业务系统,为公司高层提供日常经营报表&am…

CSV文件新增数据知多少

CSV文件编辑数据时 一、如果数据的长度不超过11位,直接正常输入 二、如果数据的长度大于等于11位,新增数据时,将列格式改为文本,并且输入数字,数字使用文本格式保存 如果数字长度超过11位,则展示为E科学…

seq“ 和 “time“ 字段

在RTP(Real-time Transport Protocol)报文中,"seq" 和 "time" 字段分别表示以下内容: 1. **Seq(Sequence Number)字段**:Seq字段是RTP头部中的一个16位字段,用…

​iOS上架App Store的全攻略

第一步:申请开发者账号 在开始将应用上架到App Store之前,你需要申请一个开发者账号。 1.1 打开苹果开发者中心网站:Apple Developer 1.2 使用Apple ID和密码登录(如果没有账号则需要注册),要确保使用与公…