数据库设计三范式

简介: 本文介绍了数据库设计中的三大范式:第一范式要求字段原子性,不可再分;第二范式要求消除部分依赖,确保主键唯一决定非主键属性;第三范式要求消除传递依赖。通过实例解析,说明范式旨在减少数据冗余与操作异常,但实际设计应结合项目需求灵活应用。

第一范式 - 1NF

遵循原子性。即,表中字段的数据,不可以再拆分。先看一个不符合第一范式的表结构,如下:

员工编码

姓名

年龄

001

销售部小张

28

002

运营部小黄

25

003

技术部小高

22

在这一个表中的,姓名 字段下的数据是可以再进行拆分的,因此它不符合第一范式,那怎么样才符合第一范式呢?如下:

员工编码

部门

姓名

年龄

001

销售部

小张

28

002

运营部

小黄

25

003

技术部

小高

22

那是否遵循第一范式就一定是好的呢?如下:

员工编码

姓名

地址

001

小张

江西省南昌市东湖区

002

小黄

广东省佛山市禅城区

003

小高

湖北省武汉市新洲区

通过观察上述表结构,我们发现,地址是可以再进一步拆分的,比如:

员工编码

姓名

001

小张

江西省

南昌市

东湖区

002

小黄

广东省

佛山市

禅城区

003

小高

湖北省

武汉市

新洲区

虽然拆分后,看上去更符合第一范式了,但是如果项目就只需要我们输出一个完整地址呢?那明显是表在没拆分的时候会更好用。所以范式只是给了我们一个参考,我们更多的是要根据项目实际情况设计表结构。

第二范式 - 2NF

在满足第一范式的情况下,遵循唯一性,消除部分依赖。即,表中任意一个主键或任意一组联合主键,可以确定除该主键外的所有的非主键值。再通俗点讲就是,一个表只能描述一件事情。我们用一个经典案例进行解析。

学号

姓名

年龄

课程名称

成绩

学分

001

小张

28

语文

90

3

001

小张

28

数学

90

2

002

小黄

25

语文

90

3

002

小黄

25

语文

90

3

003

小高

22

数学

90

2

我们先分析一下表结构。

1. 假设学号是表中的唯一主键,那由学号就可以确定姓名和年龄了,但是却不能确定课程名称和成绩

2. 假设课程名称是表中的唯一主键,那由课程名称就可以确定学分了,但是却不能确定姓名、年龄和成绩。

3. 虽然通过学号和课程名称的联合主键,可以确定除联合主键外的所有的非主键值,但是基于上述两个假设,也不符合第二范式的要求。

那我们应该如何调整表结构,让它能复合第二范式的要求呢?

我们可以基于上述的三种主键的可能,拆分成 3 张表,保证一张表只描述一件事情

1. 学生表 - 学号做主键

学号

姓名

年龄

001

小张

28

002

小黄

25

003

小高

22

2. 课程表 - 课程名称做主键

课程名称

学分

语文

3

数学

2

3. 成绩表 - 学号和课程名称做联合主键

学号

课程名称

成绩

001

语文

90

001

数学

90

002

语文

90

002

语文

90

003

数学

90

这时候我们可能会想,为什么我们就要遵循第二范式呢?不遵循第二范式会造成什么样的后果呢

1. 造成整表的数据冗余。

如学生表,可能我就只有2个学生,每个学生都有许多的信息,比如,年龄、性别、身高、住址......如果与课程信息放到同一张表中,可能每个学生有3门课程,那数据总条数就会变成6条了。但是通过拆分,学生表我们只需要存储 2 条学生信息,课程表只需要存储 3 条课程信息,成绩表就只需保留学号、课程名称和成绩字段。

2. 更新数据不方便。

假设,课程的学分发生了变更,那我们就需要把整表关于该课程的学分都要更新一次,但如果我们拆分出课程表,那我们就只需要把课程表中的课程信息更新就行。

3. 插入数据不方便或产生异常。

① 假设主键是学号或课程名称,我们新增了某个课程,需要把数据插入到表中,这时,可能只有部分人有选修这门课程,那我们插入数据的时候还要规定给哪些人插入对应的课程信息,同时可能由于成绩还没有,我们需要对成绩置空,后续有成绩后还得重新更新一遍。

② 假设主键是学号和课程名称的联合主键。同样也是新增了某课程,但是暂时没有人选修这门课,缺少了学号主键字段数据,会导致课程信息无法插入。

第三范式 - 3NF

在满足第二范式的情况下,消除传递依赖。即,在任一主键都可以确定所有非主键字段值的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B

仍然用一个经典例子来解析

学号

姓名

班级

班主任

001

小黄

一年级(1)班

高老师

这个表中,学号是主键,它可以唯一确定姓名、班级、班主任,符合了第二范式,但是在非主键字段中,我们也可以通过班级推导出该班级的班主任,所以它是不符合第三范式的。

那怎么设计表结构,才是符合第三范式的呢?

1. 学生表

学号

姓名

班级

001

小黄

一年级(1)班

2. 班级表

班级

班主任

一年级(1)班

高老师

通过把班级与班主任的映射关系另外做成一张映射表,我们就成功地消除了表中的传递依赖了。

总结

不知道读者们有没有发现,以上所介绍的范式的最终目的都是为了减少我们的工作量呢?所以说,尽管范式是一种很好的指导规范,但在实际应用中,我们也不需要太局限在范式中,更多的是应该从项目中出发,设计出合理的表结构。

以下是本篇三范式的简单总结:

  • 第一范式(1 NF):字段不可再拆分。
  • 第二范式(2 NF):表中任意一个主键或任意一组联合主键,可以确定除该主键外的所有的非主键值。
  • 第三范式(3 NF):在任一主键都可以确定所有非主键字段值的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B。
相关文章
|
2月前
|
JSON 自然语言处理 数据库
索引库、文档操作
本文介绍了Elasticsearch(ES)的核心概念及其与MySQL的对比,阐述了ES作为分布式搜索引擎,在海量数据搜索、分析方面的优势,并详细讲解了索引库、映射(Mapping)、文档等核心概念的创建与操作方法。同时,结合Kibana和RestClient演示了索引与文档的CRUD操作,帮助读者掌握ES在实际项目中的应用。
索引库、文档操作
|
2月前
|
存储 负载均衡 算法
负载均衡算法
本文介绍了五种负载均衡算法:随机、轮询、最小活跃数、源地址哈希与一致性哈希,涵盖适用场景及核心实现逻辑,结合代码与图示解析其工作原理与优化策略。
 负载均衡算法
|
2月前
|
Java 测试技术 API
从Google线上故障,谈灰度发布的重要性
2025年6月12日,Google Cloud因未灰度发布的新功能引发空指针异常,导致全球服务中断超7小时。本文剖析故障根源,详解配置灰度发布策略,并以Nacos为例,介绍基于IP和标签的灰度实现方案,强调灰度发布对系统稳定性的重要意义。
从Google线上故障,谈灰度发布的重要性
|
2月前
|
SQL 人工智能 数据库
你的数据库不是性能差,是你的SQL在“烧钱”:用这条指令让AI化身资深DBA
硬件升配解决不了烂SQL!本文提供一套经过验证的AI指令,将大模型转化为资深DBA,通过深度诊断、索引优化和执行计划分析,帮助开发者从根源解决慢查询问题,实现数据库性能的降本增效。
278 19
|
2月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
本文详细讲解了Nacos作为配置中心的核心功能与实践应用,涵盖配置管理、热更新、共享配置及优先级规则,并通过搭建Nacos集群实现高可用部署,帮助开发者掌握微服务环境下配置的集中化管理方案。
 Nacos配置中心
|
2月前
|
SpringCloudAlibaba Java Nacos
SpringCloud概述
Spring Cloud是微服务架构的综合解决方案,由Spring团队推出,具备约定大于配置、组件丰富、开箱即用等特点。为解决Netflix组件停更问题,阿里推出Spring Cloud Alibaba,集成Nacos、Sentinel、Seata等高性能中间件,成为主流技术栈选择。
|
4月前
|
存储 监控 NoSQL
140_异步推理:队列管理框架 - 使用Celery处理高并发请求的独特设计
在大型语言模型(LLM)部署的实际场景中,推理服务的并发处理能力直接影响用户体验和系统稳定性。随着LLM应用的普及,如何高效处理大量并发请求成为部署优化中的关键挑战。传统的同步请求处理方式在面对突发流量时容易导致系统过载,响应延迟增加,甚至服务崩溃。异步推理通过引入队列管理机制,能够有效缓冲请求峰值,平滑系统负载,提高资源利用率,从而为LLM服务提供更稳定、更高效的并发处理能力。
|
4月前
|
人工智能 程序员 开发者
「超级开发个体」在诞生:一份白皮书带你理解AI时代开发者
10月24日程序员节,魔搭社区联合知乎发布《THE NEXT WAVE:AI时代开发者生态白皮书》,揭示AI时代开发者新画像:以“超级个体”为核心,兼具技术与商业闭环能力,工具平权让个人开发者崛起。报告涵盖年龄、学历、组织分布及认知行为特征,展现开发者如何用AI提效、实现从“写代码”到“搭系统”的跃迁。点击下载完整报告。
364 0
|
4天前
|
人工智能 JSON 自然语言处理
Agent Skills 究竟是什么?从玩具到工程化的必经之路
AI应用开发正从“Prompt驱动”迈向“技能驱动”。本文详解Agent Skills标准化实践:以Claude Code Skills为范本,用SKILL.md实现自描述技能;借MCP协议统一多源工具调用,解决兼容与安全难题;结合DeepSeek+OpenAI实战,展现可插拔、可审计、可演进的工业级Agent构建路径。
|
2月前
|
人工智能 自然语言处理 数据可视化
告别高成本定制:友盟U-AgentBox上线,开发者可一键集成行业模板,3天打造专属企业Agent
12月29日,蚂蚁百宝箱与友盟联合推出面向开发者的智能体产品U-AgentBox,聚焦低门槛、高效率集成专属智能体。通过模板化构建、可视化编辑与轻量级部署,助力开发者快速实现业务智能化升级。
248 9

热门文章

最新文章