数据库范式详解: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/7/22 15:53:11 阅读更多 →
SATA控制器架构深度解析:从AHCI原理到嵌入式开发实践

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

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

2026/7/22 15:53:11 阅读更多 →
String 字符串不可变带来的好处是什么?

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

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

2026/7/22 15:53:11 阅读更多 →

最新新闻

掌握libcurl:从GET请求到HTTPS验证全解析

掌握libcurl:从GET请求到HTTPS验证全解析

1. 初始化 libcurl 在程序开始时调用一次&#xff1a; #include <stdio.h> #include <curl/curl.h>int main(void) {CURLcode res;res curl_global_init(CURL_GLOBAL_DEFAULT);if (res ! CURLE_OK) {fprintf(stderr, "curl_global_init failed: %s\n",c…

2026/7/22 16:35:43 阅读更多 →
基于二阶锥规划的主动配电网最优潮流求解(Matlab代码实现)

基于二阶锥规划的主动配电网最优潮流求解(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页 &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&#xff1a;行百里者&#xff0c;半于九十。 &#x1f4cb;&#x1f4…

2026/7/22 16:35:43 阅读更多 →
深入解析TI HDVPSS intc_intr1中断控制器:原理、配置与实战优化

深入解析TI HDVPSS intc_intr1中断控制器:原理、配置与实战优化

1. 项目概述在嵌入式视频处理系统的开发中&#xff0c;中断控制器就像是整个系统的“神经中枢”&#xff0c;它负责接收来自各个外设的“紧急呼叫”&#xff0c;并决定是否、以及何时通知CPU这个“大脑”去处理。今天&#xff0c;我们就来深入拆解德州仪器高清视频处理子系统中…

2026/7/22 16:35:43 阅读更多 →
中国电子多项AI创新成果入选国资央企人工智能典型案例

中国电子多项AI创新成果入选国资央企人工智能典型案例

2026世界人工智能大会&#xff08;WAIC&#xff09;期间&#xff0c;国务院国资委在“智赋新质 全域焕新”企业人工智能高质量发展论坛上正式启动“国资央企智能软件工厂联合筑基工程”&#xff0c;包括中国电子在内的首批13家中央企业研发力量参与共建。第二批央企人工智能战略…

2026/7/22 16:35:43 阅读更多 →
LocalAI语音识别教程:在本地设备上部署Whisper模型的完整指南

LocalAI语音识别教程:在本地设备上部署Whisper模型的完整指南

LocalAI语音识别教程&#xff1a;在本地设备上部署Whisper模型的完整指南 【免费下载链接】LocalAI LocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required. 项目地址: https://gitcode.com/GitHub_…

2026/7/22 16:35:43 阅读更多 →
【2027最新】基于SpringBoot+Vue的校园失物招领网站管理系统源码+MyBatis+MySQL

【2027最新】基于SpringBoot+Vue的校园失物招领网站管理系统源码+MyBatis+MySQL

&#x1f4a1;实话实说&#xff1a;有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。博主介绍&#xff1a;在校期间积极参与实验室项目研发&#xff0c;现为CSDN特邀作者、掘金优质创作者。专注于Java开发、Spring Boot框架、前后端分离技…

2026/7/22 16:34:42 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统&#xff0c;尤其是像TI C6000系列这样的高性能DSP开发中&#xff0c;我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动&#xff0c;但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案&#xff1f; 在数字化协作环境中&#xff0c;消息通知系统的重要性不言而喻明。但现实情况是&#xff0c;企业级通知方案往往需要复杂的API对接&#xff08;如企业微信、钉钉、飞书&#xff09;&#xff0c;个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点"&#xff0c;乙方听到的是"少做几页"。甲方说"不要太复杂"&#xff0c;乙方理解成"别放图表了"。结果交过去&#xff0c;甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里&#xff0c;是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻