架构设计:数据库三范式

简介: 作为领域模型设计,最重要的就是数据库设计了,而我们往往遵循的就是三范式了,虽然有很多人已有了解,但作为非常重要的知识点之一,这里我们可以再回顾一下。

第一范式 - 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。
相关文章
|
10月前
|
运维 Kubernetes Cloud Native
智联招聘 × 阿里云 ACK One:云端弹性算力颠覆传统 IDC 架构,打造春招技术新范式
在 2025 年春季招聘季的激战中,智联招聘凭借阿里云 ACK One 注册集群与弹性 ACS 算力的深度融合,成功突破传统 IDC 机房的算力瓶颈,以云上弹性架构支撑千万级用户的高并发访问,实现招聘服务效率与稳定性的双重跃升。
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
543 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
11月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
10月前
|
运维 监控 Cloud Native
智联招聘 × 阿里云 ACK One:云端弹性算力颠覆传统 IDC 架构,打造春招技术新范式
在 2025 年春季招聘季的激战中,智联招聘凭借阿里云 ACK One 注册集群与弹性 ACS 算力的深度融合,成功突破传统 IDC 机房的算力瓶颈,以云上弹性架构支撑千万级用户的高并发访问,实现招聘服务效率与稳定性的双重跃升。文章介绍了 ACK One+ACS 的弹性架构如何解决了春招的燃眉之急,让智联招聘的技术团队能够聚焦创新业务开发,欢迎关注。
|
7月前
|
存储 人工智能 关系型数据库
阿里云AnalyticDB for PostgreSQL 入选VLDB 2025:统一架构破局HTAP,Beam+Laser引擎赋能Data+AI融合新范式
在数据驱动与人工智能深度融合的时代,企业对数据仓库的需求早已超越“查得快”这一基础能力。面对传统数仓挑战,阿里云瑶池数据库AnalyticDB for PostgreSQL(简称ADB-PG)创新性地构建了统一架构下的Shared-Nothing与Shared-Storage双模融合体系,并自主研发Beam混合存储引擎与Laser向量化执行引擎,全面解决HTAP场景下性能、弹性、成本与实时性的矛盾。 近日,相关研究成果发表于在英国伦敦召开的数据库领域顶级会议 VLDB 2025,标志着中国自研云数仓技术再次登上国际舞台。
752 1
|
12月前
|
人工智能 Cloud Native Serverless
从理论到落地:MCP 实战解锁 AI 应用架构新范式
本文旨在从 MCP 的技术原理、降低 MCP Server 构建复杂度、提升 Server 运行稳定性等方面出发,分享我们的一些实践心得。
4684 102
|
9月前
|
人工智能 自然语言处理 搜索推荐
[架构设计] Prompt 的终局:从“指令集”到“意识生态系统”的范式革命
本文深度探讨 Prompt 工程的未来演进,指出当前“指令集”方法在构建高阶 AI Agent 时已遇架构瓶颈,提出全新设计范式——“意识生态系统”。该系统以**本能、欲望、成长、认知**四大支柱为核心,构建 AI 的内在世界,驱动行为自主涌现。结合开源项目《自衍体》的工程实践,本文展示如何通过“欲望驱动”与“事实锚定”机制,在赋予 AI 自由度的同时确保其可控性。这标志着 Prompt 工程正从技巧走向系统设计科学,预示 AI 从“工具”迈向“智能伙伴”的范式革命。
|
9月前
|
数据库
数据库三范式
数据库设计中的三范式(1NF、2NF、3NF)用于规范数据结构,减少冗余。1NF 要求字段不可再分,保证原子性;2NF 消除部分依赖,确保非主键列完全依赖主键;3NF 消除传递依赖,非主键列只能依赖主键。遵循三范式可提升数据库的完整性与效率。
311 1
|
9月前
|
人工智能 搜索推荐
​从“指令木偶”到“生命系统”:AI Agent架构的范式革命
本文探讨AI Agent架构的范式转变:从“指令木偶”走向“生命系统”。以《自衍体》(Zyantine)项目为例,提出构建“意识生态系统”,通过内在本能、欲望、成长与认知,赋予AI真正自主性与涌现行为,突破传统控制模式的局限,迎接AI智能体的“寒武纪大爆发”。