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

news2024/9/23 23:32:53

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

什么是设计范式

关系型数据库模型的时候,需要对关系内部各个属性之间联系的合理化程度进行定义,这就有了不同等级的规范要求,这些规范要求被称为范式(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.coloradmin.cn/o/1110872.html

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

相关文章

2023年中国润滑油分散剂市场需求量及行业竞争现状分析[图]

润滑油分散剂是一种两亲性化学品,可以增加油性部分以及水性部分在同一体系中的相容性,能降低分散体系中固体或液体粒子聚集的物质。换油时,可将有害的悬浮物从油中清除。 国内从60年代末开始试制丁二酰亚胺型分散剂,并于80年代初在…

93. 递归实现组合型枚举

题目: 93. 递归实现组合型枚举 - AcWing题库 思路: 1.从n个数中选择m个数,问有多少种选法。---->抽象为有m个坑位(设置kenway[N]表示),其中填入编号为1~n的萝卜,问有几种填法。这里我们可…

二叉树题目:从中序与后序遍历序列构造二叉树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:从中序与后序遍历序列构造二叉树 出处:106. 从中序与后序遍历序列构造二叉树 难度 5 级 题目描述 要…

互联网行业汇总

互联网行业汇总,全网最全!选行业不愁 从事互联网选什么行业?这似乎是很多朋友的困惑。 所以这里给大家把互联网行业做个细致的汇总,每个行业列举几个典型的APP,简单拆解下各自的盈利模式,希望能给大家提供参…

了解Netty,从IO开始

java程序员要想升级高级工程师或者成为架构师,绕不开Netty的学习,就算你不做IM即时通信,也不是网络编程的工作岗位,仅仅只是CRUD程序员,当你想要了解一下Dubbo、Redis、kafka、rabbitMQ、ES、zookeeper、nginx等等的底…

群硕与Microsoft Dynamics全球团队密切协作,加速ERP产品迭代

群硕具备强大的软件研发能力,搭建自动化测试平台,保证高质量交付。 ERP系统的引入被视为企业走向数字化转型的关键一步。 此系统有助于实现企业内部资源与外部资源的整合,通过软件把人、财、物、产、供、销及相应的物流、信息流、资金流、管…

大数据之LibrA数据库系统部署方案

组网方案 基本概念 FusionInsight LibrA集群的组网方案中包含如下节点,如表1所示。 网络平面类型 FusionInsight LibrA整个系统网络划分为2个平面,即业务平面和管理平面,两个平面之间采用物理隔离的方式进行部署,保证业务、管理…

Lua快速入门教程

文章目录 1、Linux安装Lua2、语法练习2.1、变量2.2、循环2.3、函数2.4、数组2.5、迭代器2.6、Table操作2.7、Lua 模块与包2.8、加载机制2.9、Lua 元表(Metatable) 3、Lua 协同程序(coroutine)4、文件IO操作4.1、简单模式4.2、完全模式 5、错误处理 内容来源菜鸟教程&#xff0c…

软考-访问控制技术原理与应用

本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 by 2023年10月 访问控制概念 访问控制是计算机安全的一个重要组成部分,用于控制用户或程序如…

Linux | gdb的基本使用

目录 前言 一、调试文件的生成 二、调试指令 1、选择调试文件 2、查看代码 3、运行代码 4、断点 5、打印与常显示 6、其他 总结 前言 前面我们学习了如何使用gcc/g来进行对代码进行编译,本章我们将使用gdb来对代码进行调试,学习本章的前提是有…

实验室用超声波清洗机哪家好

随着超声波清洗机在实验室得到广泛应用,超声波清洗机厂家也随之增多,品牌、型号更是数不胜数,价格相差也是十分悬殊。那么面对纷繁复杂的实验室超声波清洗机市场,实验室用超声波清洗机哪家好?小编推荐国内知名超声波清…

《动手学深度学习 Pytorch版》 9.3 深度循环神经网络

将多层循环神经网络堆叠在一起,通过对几个简单层的组合,产生一个灵活的机制。其中的数据可能与不同层的堆叠有关。 9.3.1 函数依赖关系 将深度架构中的函数依赖关系形式化,第 l l l 个隐藏层的隐状态表达式为: H t ( l ) ϕ l …

用宝塔部署静态html页面

云服务器安装宝塔面板搭建LNMP环境,可以看另一文零基础搭建个人网站详细流程。 本文主要介绍用宝塔部署静态页面,比较简单,以部署一个用户协议为例。 首先,去“网站”中“添加站点”。有域名用域名,没域名用IP。 然后…

NSSCTF做题(10)

叫10好听一点,就是补9的 第7页的内容 [SWPUCTF 2022 新生赛]ez_sql get传参说是不安全,那就只能用post了 有回显了,两个假的flag 发现万能密码 1 or 11#变成了 11# 11# 1 11#1# 11# 11# 发现or和空格都无了,union也过滤 …

零基础Linux_19(进程信号)产生信号+Core_Dump+保存信号

目录 1. 信号前期知识 1.1 生活中的信号 1.2 Linux中的信号 1.3 信号概念 1.4 信号处理方法的注册 2. 产生信号 2.1 通过终端按键产生信号 2.2 调用系统调用向进程发信号 2.3 软件条件产生信号 2.4 硬件异常产生信号 3. 核心转储Core Dump 4. 保存信号 4.1 信号在…

day08_面向对象_封装_继承_this_super_访问修饰符

今日内容 1.作业 2.封装 3.继承 4.this和super 5.访问修饰符 零、复习 成员变量和局部变量(画表格) this的作用 this是当前对象,当前方法的调用者this可以调用属性和方法this.属性, this.方法名(),this() 构造方法的作用和语法特征 作用: 创建对象,属性初始化特征: 没有返回值,…

数据结构和算法(13):优先级队列

概述 按照事先约定的优先级,可以始终高效查找并访问优先级最高数据项的数据结构,也统称作优先级队列 优先级队列将操作对象限定于当前的全局极值者。 根据数据对象之间相对优先级对其进行访问的方式,与此前的访问方式有着本质区别&#xf…

PostgreSQL与MySQL数据库对比:适用场景和选择指南

数据库是现代应用程序的基石之一,而在选择合适的数据库管理系统(DBMS)时,开发者常常会面临着许多选择。在这方面,PostgreSQL和MySQL是两个备受瞩目的选项。本文将深入研究这两者之间的异同,并为您提供适用场…

疯狂星期四的营销策略是什么?如何复制?

你知道疯狂星期四吗?它的策略是什么?如何对标它写一个类似的方案呢? 1、消费者心理 KFC疯狂星期四的核心目标消费者是对价格敏感的年轻人和家庭消费者。他们寻求物有所值的美食体验,希望在合理的价格范围内享受到美味的食物。通过…

Unity之ShaderGraph如何实现UV抖动

前言 今天我们通过噪波图来实现一个UV抖动的效果。 如下图所示: 关键节点 Time:提供对着色器中各种时间参数的访问 UV:提供对网格顶点或片段的UV坐标的访问。可以使用通道下拉参数选择输出值的坐标通道。 SimpleNoise:根据…