数据库范式详解:1NF、2NF、3NF 与反范式取舍
目录一. 设计数据表需要注意的点二. 范式2.1 范式简介2.2 范式有哪些2.3 第一范式(1NF)2.4 第二范式(2NF)2.5 第三范式(3NF)2.6 小结一. 设计数据表需要注意的点1首先要考虑设计这张表的用途这张表都要存放什么数据2还要保证数据表中数据的正确性在进行插入删除更新时应该做出哪些约束检查3要考虑如何降低数据表的数据冗余度可以允许数据量变大但要考虑数据量不会因为插入而急速增长4在设计时还要考虑日后的数据维护问题不能使表中的数据维护工作复杂二. 范式2.1 范式简介范式的英文名称位 Normal Form简称NF。在关系型数据库中关于数据表设计的基本原则规则称之为范式。可以简单的理解为一张数据表的设计结构需要满足某种设计标准的级别满足某种规则。2.2 范式有哪些目前关系型数据库的范式一共有6种按照范式的级别从低到高分别是 第一范式(1NF)第二范式(2NF)第三范式(3NF)巴斯-科德范式(BCNF)第四范式(4NF)第五范式(5NF)。范式的阶层越高数据的冗余度越低但要求也会越来越严格高范式都是在低范式的基础上推导出来的所以高范式一定满足低范式的规范要求。但在绝大多数企业设计数据表的时候一般遵循到3NF有些更为严格的表会设计到BCNF。不仅如此有些时候我们还会根据业务需要破坏范式要求适当增加表的冗余度来提高查询的性能这就是理论和实践结合的使用。2.3 第一范式(1NF)第一范式主要是确保数据表中每个字段都具有原子性每个字段都不可再进行拆分的最小单元像下面这种情况就违背了第一范式address 可以拆分为省和市除非说你的业务中只会用到查询整个地址的业务不会用到细粒度的地址查询功能可以这样设计但还是建议拆分成两个如果有需要可以在代码层再进行拼接。下面就是正确的表字段将原来的 address 拆分为 province 和 city每个字段都是最小字段不可再拆分满足了第一范式的要求。2.4 第二范式(2NF)第二范式要求在满足第一范式的基础上还要满足数据表中的每一条数据记录都是可唯一标识的。而且所有的非主键字段都须完全依赖于主键不能只依赖于主键的一部分。如果知道了主键的值就能检索到任意一行的任意一个具体字段的值。如下sid 表示学生编号cid 表示课程编号grades 表示课程成绩在这个数据表中想要查询到成绩必须知道学生号和课程号才能查询的得到一个学生会有多科成绩。如果只知道学生号将查询到多条数据如果只知道课程号将查询到所有同学当前课程的成绩只有学生号和课程号都确定才能查找到一条唯一的成绩记录所以 (学号课程)——成绩学号和课程虽然是两个字段但都是主键。我们再来看一个反例比赛表 player_game 中包含球员id比赛id球员姓名球员年龄比赛时间比赛地点比赛分数但是细细分析会发现nameage跟球员具有强关联timeaddress跟比赛具有强关联score 跟球员id和比赛id都有关联但是现在放在了一张表中是不合理的所以这种表的设计都是垃圾表。正确的做法是将上面的一张表拆分为3张表分别是球员信息表比赛信息表球员得分表。球员信息表球员id为主键通过球员id可以查询到详细的球员信息比赛信息表比赛id为主键通过比赛id可以查询到比赛的具体信息球员得分表球员id和比赛id为联合主键通过球员id和比赛id可以查询到某位球员在某场比赛的得分2.5 第三范式(3NF)第三范式是在第二范式的基础上确保数据表中每一个非主键字段都和主键字段直接相关所有的非主键字段不能依赖与其他的非主键不能存在依赖传递。比如说一张表现有三个字段 ABC且A是主键我要查询C应当通过主键A直接就可以查询到C。不能先通过A查询B再经过B才能查出C如果是这样就出现了依赖传递不符合第三范式的要求。如下设计一张关于商品的数据库表可以看到通过非主键字段商品类别id category_id 可以确定商品类别名称通过商品主键id 也可以确定商品类别名称中间具有传递性不满足第三范式的要求也商品类别名称这个字段在这张表中属于冗余字段。正确做法应该把商品类别id 和商品部类别名称单独放在另外一张表中然后把商品类别id 作为商品表的一个外键如果想要查询商品的分类名称再通过外键去另一张表中查询即可。2.6 小结第一范式确保每列的原子性。第二范式确保每列和主键完全依赖。第三范式确保每列和主键直接关联而非间接关联。范式的优点有助于消除数据库的数据冗余第三范式通常认为在性能扩展性数据完整性方面达到了最好的平衡。范式的缺点降低了查询效率其实同学们可以看出范式的等级越高拆分出来的表越多而多表查询在数据库层面是一个比较耗时的操作直接影响到了我们的业务吞吐能力因此在实际设计数据表的时候我们有时候会为了达到一种平衡违反第三范式来追求业务的性能但第一范式和第二范式都是几乎会遵守的。有些时候我们会违反第三范式的要求将一部分数据放在一张表中虽然会有一定的冗余但是能减少多表查询次数提高了数据的查询效率增大了业务吞吐能力这就是我们常说的牺牲空间换时间。对于用户而言最不喜欢的就是等待所以大多数场景下我们对于业务的响应能力和响应速度都有很高的要求对于数据库表的设计就比较严格选择合适的范式级别约束表字段。因此在实际设计数据表的时候需要根据业务需求而定如果是一个查询比较频繁的业务可以适当违反范式要求如果是一个增删改比较频繁的业务可以适当增大范式规范降低数据的冗余度提高修改数据的效率。

相关新闻

浅谈 MySQL 主从复制,优点?原理?

浅谈 MySQL 主从复制,优点?原理?

目录 一. 主从复制概述 二. 主从复制有什么优点? 三. 主从复制的原理 四. 数据一致性问题 4.1 同步复制 4.2 异步复制 4.3 半同步复制 一. 主从复制概述 既然是主从复制,那么至少就应该有两台服务器,一台作为主库(Master)&#xff0c…

2026/10/20 10:20:39 阅读更多 →
SATA控制器架构深度解析:从AHCI原理到嵌入式开发实践

SATA控制器架构深度解析:从AHCI原理到嵌入式开发实践

1. 从并行到串行:SATA控制器架构的演进与核心价值如果你拆开过一台十年前的台式机,大概率会看到一根又宽又扁的灰色排线,连接着主板和硬盘,那就是并行ATA(PATA)接口。它曾统治了PC存储接口数十年&#xff0…

2026/10/20 15:41:24 阅读更多 →
String 字符串不可变带来的好处是什么?

String 字符串不可变带来的好处是什么?

目录 一. 线程安全(数据安全) 二. 节约内存 三. 提高集合的存取效率 一. 线程安全(数据安全) 众所周知,String 字符串是默认被 final 修饰的,是不可变的,那么首先能想到的一个优点就是线程安全,String 是存放在堆中的&#xf…

2026/10/20 5:11:20 阅读更多 →

最新新闻

Vidu Q4 Preview深度评测:AI视频生成迈向生产力工具的关键一步

Vidu Q4 Preview深度评测:AI视频生成迈向生产力工具的关键一步

最近几个创作群里讨论最多的,绕不开Vidu Q4 Preview。做AI视频的同仁应该都有感觉,这个赛道现在卷到什么程度:几乎每隔几天就有新版本、新模型冒出来,但大多是“看起来厉害、一上手就露馅”。Vidu Q4 Preview这次放出的内容&#…

2026/10/21 0:33:56 阅读更多 →
AI在芯片设计中的黑盒困局:一次IR压降事故带来的反思

AI在芯片设计中的黑盒困局:一次IR压降事故带来的反思

芯片世界里,有一句话最近被工程师们重复得越来越多:AI赢了棋局,却讲不出思路。就在上个月,我拿着一个AI辅助完成的block级floorplan给物理设计团队,线长比上一版少了12%,拥塞图也干净得不像话。结果等IR压降…

2026/10/21 0:33:56 阅读更多 →
计算智能体入门:从状态机到Q-learning的决策实现

计算智能体入门:从状态机到Q-learning的决策实现

1. 从零理解计算智能体的核心骨架计算智能体这个概念,听起来像是学术论文里的术语,但把它拆开来看,其实就是一个能感知环境、做出决策、执行动作的软件实体。你可以把它想象成一个在迷宫里找路的小机器人,它能看到周围哪里有墙、哪…

2026/10/21 0:33:55 阅读更多 →
MoE混合专家模型:稀疏激活如何破解大模型容量与成本困局

MoE混合专家模型:稀疏激活如何破解大模型容量与成本困局

从Transformer诞生起,前馈网络(FFN)就是"又笨重又绕不开"的角色:它占了模型近三分之二的参数量,但每个token都得老老实实把所有参数过一遍。你扩大模型容量,推理成本就跟着线性往上涨&#xff0c…

2026/10/21 0:33:55 阅读更多 →
开源30B模型硬刚闭源旗舰:科研场景实测与本地部署指南

开源30B模型硬刚闭源旗舰:科研场景实测与本地部署指南

最近开源圈又热闹起来了,一个主打科研场景的30B级别开源模型,直接放话要跟两家头部闭源大模型掰手腕。我当时第一反应是“又来一个刷榜的”,但仔细看完技术报告和社区实测数据之后,觉得这波还真不是营销话术,确实有货。…

2026/10/21 0:33:55 阅读更多 →
LLM强化学习全解析:PPO、GRPO、DPO等五类方法选型与实践

LLM强化学习全解析:PPO、GRPO、DPO等五类方法选型与实践

做LLM训练绕不开强化学习这块,标题里这五个字看着简单,真要分类起来其实挺讲究的。我前几年刚开始接触大模型对齐时,也把PPO、DPO、GRPO这些名词搞得晕头转向,后来用了一段时间才理清楚它们之间的血缘关系和适用场景。这篇博文就把…

2026/10/21 0:32:54 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →