当前位置: 首页 > news >正文

Mysql技术文档--设计表规范式-一次性扫盲

阿丹:

        在设计表的时候经常出现一些问题,其实自己很清楚就是因为在设计表的时候没有规范。导致后期加表的时候出现了问题。所以趁着这个假期卷一卷。同时只有在开始的时候

几大范式

在关系型数据库中,数据表设计的基本原则、规则就称为范式。

第一范式(1NF)

原文:

第一范式(1NF)数据库规范化的一种级别,它要求每个属性都是不可分的原子值,即每个属性都必须是不可分的最小数据单元。

解释/理解:

第一范式(1NF)是数据库设计的基础,它确保了每个数据表中的每个列都有唯一的含义,并且每个列都不能可分。这意味着每个字段都是最小的数据单元,不能包含其他的数据单元。例如,如果一个表中的“地址”列包含了省份、城市、街道等多个信息,那么这个表就不符合第一范式。为了满足第一范式,需要将这种多信息列拆分为多个独立的列,每个列表示一个最小、不可分的数据单元。

举例:

假设有一个名为“用户信息”的表,其中包含用户的姓名、年龄、性别、地址等信息。如果该表中的“地址”列包含了省份、城市、街道等多个信息,那么这个表就不符合第一范式。为了满足第一范式,需要将“地址”列拆分为“省份”、“城市”和“街道”三个独立的列,每个列表示一个最小、不可分的数据单元。拆分后的表如下:

用户信息表:

列名类型
姓名字符串
年龄整数
性别字符串
省份字符串
城市字符串
街道字符串

这个例子中,“地址”列被拆分为三个独立的列:“省份”、“城市”和“街道”,每个列都表示一个最小、不可分的数据单元。这样的表就满足了第一范式的要求。

第二范式(2NF)

原文:

第二范式(2NF)是数据库规范化的一种级别,它建立在第一范式的基础上,要求非主键列之间必须完全依赖于主键,而不是部分依赖。

解释/理解:

第二范式(2NF)是在第一范式的基础上进行的规范化,它要求非主键列之间必须完全依赖于主键,而不是部分依赖。在第一范式中,表中的每个列都是不可分的最小数据单元,而在第二范式中,非主键列之间必须是相互独立的,不能存在依赖关系。

举例:

假设有一个名为“订单”的表,其中包含订单号、客户号、日期、商品数量等信息。该表中有一个主键为订单号和客户号,即每个订单都有一个唯一的订单号和客户号。现在考虑一个场景,需要查询某个客户的所有订单信息。在第二范式之前的设计中,我们可能需要一个单独的“订单”表来存储订单信息,然后使用一个外键来关联“订单”表和“客户”表。这样做的缺点是会产生大量的数据冗余,因为每个订单都需要在“订单”表中单独存储一份数据,而且如果某个客户的订单数量很大,那么“客户”表中就会包含很多冗余数据。

为了解决这个问题,我们可以将“订单”表拆分为两个表:“订单信息”表和“订单详情”表,“订单信息”表中包含订单号、客户号和日期等基本信息,而“订单详情”表中则包含每个订单的商品数量等信息。这样设计的好处是避免了数据冗余,同时也能更好地满足查询需求。

通过将表拆分为两个表,我们可以更好地组织数据,减少数据冗余并提高查询效率。同时,由于每个表中的列都是不可分的最小数据单元,因此也避免了数据不一致性的问题。

第三范式(3NF)

原文:

第三范式(3NF)是数据库规范化的一种级别,它建立在第二范式的基础上,要求非主键列之间必须相互独立,不存在传递依赖关系。

解释/理解:

第三范式(3NF)是在第二范式的基础上进行的规范化,它要求非主键列之间必须相互独立,不存在传递依赖关系。在第二范式中,非主键列之间必须是相互独立的,不能存在依赖关系,而第三范式则更进一步,要求非主键列之间不能存在传递依赖关系。

举例:

假设有一个名为“员工薪资”的表,其中包含员工号、姓名、薪资、所属部门等信息。该表的主键为员工号和姓名,即每个员工都有一个唯一的员工号和姓名。现在考虑一个场景,需要查询某个部门的所有员工的薪资情况。在第二范式之前的设计中,我们可能需要一个单独的“员工薪资”表来存储员工薪资信息,然后使用一个外键来关联“员工薪资”表和“员工”表。这样做的话,会产生大量的数据冗余,因为每个员工都需要在“员工薪资”表中单独存储一份数据。而且如果某个部门的员工数量很大,那么“员工薪资”表中就会包含很多冗余数据。

为了解决这个问题,我们可以将“员工薪资”表拆分为两个表:“员工信息”表和“薪资信息”表,“员工信息”表中包含员工号、姓名和所属部门等基本信息,而“薪资信息”表中则包含每个员工的薪资信息。这样设计的好处是避免了数据冗余,同时也能更好地满足查询需求。

通过将表拆分为两个表,我们可以更好地组织数据,减少数据冗余并提高查询效率。同时,由于每个表中的列都是不可分的最小数据单元,因此也避免了数据不一致性的问题。

巴斯-科德范式(BCNF)

原文:

巴斯-科德范式(BCNF)是数据库规范化的一种级别,它要求每个非主键子集必须完全依赖于主键,而不是部分依赖。

解释/理解:

巴斯-科德范式(BCNF)是在第三范式的基础上进行的规范化,它要求每个非主键子集必须完全依赖于主键,而不是部分依赖。在第三范式中,非主键列之间不能存在传递依赖关系,而巴斯-科德范式则更加强调非主键子集与主键之间的依赖关系。

举例:

假设有一个名为“商品订单”的表,其中包含订单号、商品号、数量、客户号等信息。该表的主键为订单号和商品号,即每个订单都有一个唯一的订单号和商品号。现在考虑一个场景,需要查询某个客户的所有订单信息。在第三范式之前的设计中,我们可能需要一个单独的“商品订单”表来存储商品订单信息,然后使用一个外键来关联“商品订单”表和“客户”表。这样做的话,会产生大量的数据冗余,因为每个订单都需要在“商品订单”表中单独存储一份数据。而且如果某个客户的订单数量很大,那么“商品订单”表中就会包含很多冗余数据。

为了解决这个问题,我们可以将“商品订单”表拆分为两个表:“订单信息”表和“订单详情”表,“订单信息”表中包含订单号、客户号等基本信息,而“订单详情”表中则包含每个订单的商品号、数量等信息。这样设计的好处是避免了数据冗余,同时也能更好地满足查询需求。

通过将表拆分为两个表,我们可以更好地组织数据,减少数据冗余并提高查询效率。同时,由于每个表中的列都是不可分的最小数据单元,因此也避免了数据不一致性的问题。

第四范式(4NF)

原文:

第四范式(4NF)是数据库规范化的一种级别,它要求非主键子集之间不存在依赖关系,或者说每个非主键子集必须独立于其他非主键子集。

解释/理解:

第四范式(4NF)在巴斯-科德范式的基础上进一步强调非主键子集之间的相互独立性。在巴斯-科德范式中,每个非主键子集必须完全依赖于主键,而且相互之间没有依赖关系。而在第四范式中,进一步要求每个非主键子集之间不存在任何依赖关系,或者说每个非主键子集都是独立的,不依赖于其他非主键子集。

举例:

假设有一个名为“客户订单”的表,其中包含客户号、订单号、日期、商品号、数量等信息。该表的主键为客户号和订单号,即每个订单都有一个唯一的客户号和订单号。现在考虑一个场景,需要查询某个客户的所有订单信息,并显示每个订单的商品号和数量。在第四范式之前的设计中,我们可能需要在“客户订单”表中存储每个订单的商品号和数量,然后使用客户号和订单号作为主键来关联该表和其他表。这样做的话,会产生大量的数据冗余,因为每个订单都需要在“客户订单”表中单独存储一份数据。而且如果某个客户的订单数量很大,那么“客户订单”表中就会包含很多冗余数据。

为了解决这个问题,我们可以将“客户订单”表拆分为两个表:“订单信息”表和“订单详情”表,“订单信息”表中包含客户号、订单号、日期等基本信息,而“订单详情”表中则包含每个订单的商品号、数量等信息。这样设计的好处是避免了数据冗余,同时也能更好地满足查询需求。

通过将表拆分为两个表,我们可以更好地组织数据,减少数据冗余并提高查询效率。同时,由于每个表中的列都是不可分的最小数据单元,因此也避免了数据不一致性的问题。

第五范式(5NF,又称完美范式)

原文:

第五范式(5NF,又称完美范式)是数据库规范化的一种级别,它要求在第四范式的基础上,非主键子集之间不存在任何依赖关系,或者说每个非主键子集必须独立于其他所有非主键子集。

解释/理解:

第五范式(5NF)在第四范式的基础上进一步强调非主键子集之间的相互独立性。在第四范式中,每个非主键子集必须独立于其他非主键子集,不依赖于其他非主键子集。而在第五范式中,要求每个非主键子集之间不存在任何依赖关系,或者说每个非主键子集都是完全独立的,不依赖于其他任何非主键子集。

举例: 考虑一个订单管理系统的数据库设计。假设有一个名为“订单详情”的表,其中包含订单号、商品号、数量等信息。该表的主键为订单号和商品号,即每个订单详情都有一个唯一的订单号和商品号。现在考虑一个场景,需要查询某个客户的所有订单信息,并显示每个订单的商品号和数量。在第五范式之前的设计中,我们可能需要在“订单详情”表中存储每个订单的商品号和数量,然后使用订单号作为主键来关联该表和其他表。这样做的话,会产生大量的数据冗余,因为每个订单详情都需要在“订单详情”表中单独存储一份数据。而且如果某个客户的订单数量很大,那么“订单详情”表中就会包含很多冗余数据。

为了解决这个问题,我们可以将“订单详情”表拆分为两个表:“订单信息”表和“订单明细”表,“订单信息”表中包含订单号、日期等基本信息,而“订单明细”表中则包含每个订单的商品号、数量等信息。这样设计的好处是避免了数据冗余,同时也能更好地满足查询需求。

通过将表拆分为两个表,我们可以更好地组织数据,减少数据冗余并提高查询效率。同时,由于每个表中的列都是不可分的最小数据单元,因此也避免了数据不一致性的问题。

相关文章:

Mysql技术文档--设计表规范式-一次性扫盲

阿丹: 在设计表的时候经常出现一些问题,其实自己很清楚就是因为在设计表的时候没有规范。导致后期加表的时候出现了问题。所以趁着这个假期卷一卷。同时只有在开始的时候 几大范式 在关系型数据库中,数据表设计的基本原则、规则就称为范式。…...

python socket 传输opencv读取的图像

python socket网络编程 将ros机器人摄像头捕捉的画面在上位机实时显示,需要用到socket网络编程,提供了TCP和UDP两种方式 TCP服务器端代码: 创建TCP套接字: s socket(AF_INET, SOCK_STREAM) 创建了一个TCP套接字。SOCK_STREAM 表示这是一个TCP套接字&…...

APACHE NIFI学习之—UpdateAttribute

UpdateAttribute 描述: 通过设置属性表达式来更新属性,也可以基于属性正则匹配来删除属性 标签: attributes, modification, update, delete, Attribute Expression Language, state, 属性, 修改, 更新, 删除, 表达式 参数: 如下列表中,必填参数则…...

BIT-7文件操作和程序环境(16000字详解)

一:文件 1.1 文件指针 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明…...

冥想第九百二十八天

1.今天周三,今天晚上日语课上了好久,天气也不好, 2.项目上全力以赴的一天。 3.感谢父母,感谢朋友感谢家人,感谢不断进步的自己。...

深入浅出,SpringBoot整合Quartz实现定时任务与Redis健康检测(一)

目录 前言 环境配置 Quartz 什么是Quartz? 应用场景 核心组件 Job JobDetail Trigger CronTrigger SimpleTrigger Scheduler 任务存储 RAM JDBC 导入依赖 定时任务 销量统计 Redis检测 使用 ​编辑 注意事项 前言 在悦享校园1.0中引入了Quart…...

Lucene-MergePolicy详解

简介 该文章基于业务需求背景,因场景需求进行参数调优,下文会尽可能针对段合并策略(SegmentMergePolicy)的全参数进行说明。 主要介绍TieredMergePolicy,它是Lucene4以后的默认段的合并策略,之前采用的合并…...

数据的加解密

文章目录 分类特点业务的使用补充 分类 对称加密算法非对称加密算法 特点 对称加密算法 : 加密效率高 !加密和解密都使用同一款密钥 但是有一个问题 : 密钥如何从服务端发给客户端? (假如你直接先将密钥发给对方,要是在过程中被黑客技术破解了,那后面的消息也就泄漏了) (后…...

【Spring】更简单的读取和存储对象

更简单的读取和存储对象 一. 存储 Bean 对象1. 前置工作:配置扫描路径2. 添加注解存储 Bean 对象Controller(控制器存储)Service(服务存储)Repository(仓库存储)Component(组件存储&…...

【LeetCode热题100】--108.将有序数组转换为二叉搜索树

108.将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 二叉搜索树的中序遍历是升序…...

Redis学习笔记(下):持久化RDB、AOF+主从复制(薪火相传,反客为主,一主多从,哨兵模式)+Redis集群

十一、持久化RDB和AOF 持久化:将数据存入硬盘 11.1 RDB(Redis Database) RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。 备份…...

【智能家居项目】裸机版本——设备子系统(LED Display 风扇)

🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言:你只管努力,剩下的交给时间! 输入子系统中目前仅实现了按键输入,剩下的网络输入和标准输入在以后会逐步实现&am…...

[Linux]记录plasma-wayland下无法找到HDMI接口显示器的问题解决方案

内核:Linux 6.5.5-arch1-1 Plasma 版本:5.27.8 窗口系统:Wayland 1 问题 在前些时候置入了一块显示器,接口较多,有 HDMI 接口,type-C 接口。在 X11 中可以找到外接显示器,但是卡顿明显&#xf…...

【计算机网络】高级IO之select

文章目录 1. 什么是IO?什么是高效 IO? 2. IO的五种模型五种IO模型的概念理解同步IO与异步IO整体理解 3. 阻塞IO4. 非阻塞IOsetnonblock函数为什么非阻塞IO会读取错误?对错误码的进一步判断检测数据没有就绪时,返回做一些其他事情完整代码myt…...

如何设计一个高效的应用缓冲区【一个动态扩容的buffer类】

文章目录 前言一、为什么需要设计应用层缓冲区必须要有 output buffer目的问题output buffer的解决方案: 必须要有 input buffer总结 二、设计要点三、buffer设计思路基础函数关于iovec与readv readfd如何实现动态扩容 问题 前言 在上一个博客,我们介绍…...

图像处理初学者导引---OpenCV 方法演示项目

OpenCV 方法演示项目 项目地址:https://github.com/WangQvQ/opencv-tutorial 项目简介 这个开源项目是一个用于演示 OpenCV 方法的工具,旨在帮助初学者快速理解和掌握 OpenCV 图像处理技术。通过这个项目,你可以轻松地对图像进行各种处理&a…...

管道-匿名管道

一、管道介绍 管道(Pipe)是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入,从而实现数据的流动。管道是一种轻量级的通信方式,用于协调不同进程的工作。 1. 创建和使用管道&#…...

【JavaEE基础学习打卡08】JSP之初次认识say hello!

目录 前言一、JSP技术初识1.动态页面2.JSP是什么3.JSP特点有哪些 二、JSP运行环境配置1.JDK安装2.Tomcat安装 三、编写JSP1.我的第一个JSP2.JSP执行过程3.在IDEA中开发JSP 总结 前言 📜 本系列教程适用于JavaWeb初学者、爱好者,小白白。我们的天赋并不高…...

使用序列到序列深度学习方法自动睡眠阶段评分

深度学习方法,用于使用单通道脑电图进行自动睡眠阶段评分。 def build_firstPart_model(input_var,keep_prob_0.5):# List to store the output of each CNNsoutput_conns []######### CNNs with small filter size at the first layer ########## Convolutionnetw…...

【算法】排序——选择排序和交换排序(快速排序)

主页点击直达:个人主页 我的小仓库:代码仓库 C语言偷着笑:C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法头疼记:算法专栏…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...