数据库范式详解:从第一范式到第五范式


title: 数据库范式详解:从第一范式到第五范式

date: 2025/2/7

updated: 2025/2/7

author: cmdragon

excerpt:

在数据库设计中,范式是构建高效和可维护数据库的重要原则。一个良好的数据库范式不仅能够消除数据冗余,还能提高数据的完整性和一致性。

categories:

  • 前端开发

tags:

  • 数据库
  • 范式
  • 第一范式
  • 第二范式
  • 第三范式
  • BCNF
  • 数据库设计

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

在数据库设计中,范式是构建高效和可维护数据库的重要原则。一个良好的数据库范式不仅能够消除数据冗余,还能提高数据的完整性和一致性。

一、什么是数据库范式

数据库范式是数据库设计中的一种理论基础,用来减少冗余数据并确保数据的依赖关系。范式通过将数据分解成多个表格,并利用外键建立关系来实现数据库的高效管理。范式有不同的级别,从低级范式到高级范式,需求越高,设计越复杂。基本上,数据越是拟合较高的范式,数据的完整性和一致性就越高。

二、第一范式 (1NF)

定义:第一范式要求表中的每个字段都是原子性的,也就是说,表中的每个列不能包含子表或重复的数据。

示例

考虑一个学生选课表,记录了学生和他们所选课程的信息:

学生ID 学生姓名 选课
1 张三 数学, 英语, 物理
2 李四 化学
3 王五 数学, 化学

上述设计并不符合第一范式,因为"选课"字段包含多个值。不符合第一范式的原因在于,数据难以处理,难以确保数据的一致性。

满足第一范式的设计

将"选课"字段分解:

学生ID 学生姓名 选课
1 张三 数学
1 张三 英语
1 张三 物理
2 李四 化学
3 王五 数学
3 王五 化学

优势

  • 数据的处理变得更简单,便于实现 CRUD 操作。
  • 更容易进行数据分析和查询。

三、第二范式 (2NF)

定义:第二范式要求满足第一范式,同时要求表中的每个非主属性完全依赖于主键。也就是说,表中的非主属性不能依赖于主键的一部分。

示例

考虑以下学生选课及课程分数的表:

学生ID 课程ID 学生姓名 课程名称 分数
1 101 张三 数学 90
1 102 张三 英语 85
2 101 李四 数学 75

在这个例子中,"学生姓名"和"课程名称"并不是完全依赖于主键(学生ID和课程ID的组合),而是部分依赖。

满足第二范式的设计

创建两个表,一个是学生信息表,另一个是课程信息表:

学生表

学生ID 学生姓名
1 张三
2 李四

选课表

学生ID 课程ID 分数
1 101 90
1 102 85
2 101 75

课程信息可以单独创建一个表格:

课程表

课程ID 课程名称
101 数学
102 英语

优势

  • 数据更新时,避免了数据冗余。
  • 提高了数据的一致性与完整性。

四、第三范式 (3NF)

定义:第三范式要求满足第二范式,并且每个非主属性不能依赖于其他非主属性。即在一个表中,任何非主属性必须直接依赖于主键,而不是间接依赖。

示例

考虑学生的成绩表,包含教师的信息:

学生ID 课程ID 学生姓名 教师姓名 教师ID
1 101 张三 教师A T1
1 102 张三 教师B T2
2 101 李四 教师A T1

这里,"教师姓名"依赖于"教师ID",而不是直接依赖于表的主键。

满足第三范式的设计

创建一个教师表,将教师信息单独提取:

学生表

学生ID 学生姓名
1 张三
2 李四

选课表

学生ID 课程ID 分数 教师ID
1 101 90 T1
1 102 85 T2
2 101 75 T1

教师表

教师ID 教师姓名
T1 教师A
T2 教师B

优势

  • 明确了每个属性的独立性,减少数据冗余。
  • 更高的灵活性和可维护性。

五、BCNF(Boyce-Codd 正规形式)

定义:BCNF 要求数据库满足第三范式,但有一个更严格的规则:任何决定因素都必须是超键。这消除了在处理复杂函数依赖时可能出现的异常。

示例

考虑一个示例,描述某些课程及其主讲教师:

课程ID 教师ID 教师姓名 教师办公室
101 T1 教师A 办公室1
101 T2 教师B 办公室2
102 T1 教师A 办公室1

这里,"教师姓名"和"教师办公室"都依赖于"教师ID"。然而,课程 ID 也是部分唯一决定的,这导致了冗余。

满足 BCNF 的设计

我们可以将上面的示例进行分解,构建多个表:

课程表

课程ID 教师ID
101 T1
101 T2
102 T1

教师表

教师ID 教师姓名 教师办公室
T1 教师A 办公室1
T2 教师B 办公室2

优势

  • 更加减少了数据冗余,避免了更新异常和插入异常。
  • 促使数据逻辑上的严密性。

六、第四范式 (4NF)

定义:第四范式要求满足 BCNF,同时消除多值依赖。即,表中的每个字段都只能依赖于主键而不是其它数据集合。

示例

考虑一个产品与供应商多重属性的表:

产品ID 供应商ID 国家 颜色
1 S1 中国 红色
1 S2 美国 红色
2 S1 中国 蓝色
2 S2 日本 蓝色

这个表存在多值依赖,即一个产品可以有多个供应商和国家的组合。

满足第四范式的设计

将其拆分为两个表:

产品供应商表

产品ID 供应商ID
1 S1
1 S2
2 S1
2 S2

产品颜色表

产品ID 颜色
1 红色
2 蓝色

优势

  • 避免了冗余,提高了数据的完整性。
  • 数据的模型更为清晰和易于理解。

七、第五星式 (5NF)

定义:第五范式要求满足第四范式,消除连接依赖。即,一个表只能表达一种逻辑描述。

示例

考虑某一项目与多种角色的表:

项目ID 员工ID 角色
1 E1 开发者
1 E2 设计师
2 E1 开发者
2 E3 测试员

若某个员工在多个项目中担任多个角色,那么就需要对表进行进一步拆分。

满足第五范式的设计

项目员工角色表

项目ID 员工ID
1 E1
1 E2
2 E1
2 E3

员工角色表

员工ID 角色
E1 开发者
E2 设计师
E3 测试员

优势

  • 数据结构更为干净,有助于找出更复杂的应用逻辑。
  • 避免了不必要的连接,提高查询性能。

八、总结

每一种范式都有其特定的应用场景和优势。遵循这些范式,不仅能帮助我们设计出更加高效、可维护的数据库,还能在数据的完整性、一致性和查询性能等方面提供重要保障。

随着业务需求的复杂化,数据库范式的重要性愈加凸显。在实际的项目中,我们需要根据具体情况灵活应用这些范式,选择适合的设计方案,以确保数据库系统的高效、稳定和安全。

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:数据库范式详解:从第一范式到第五范式 | cmdragon's Blog

往期文章归档:

相关推荐
小哈里13 分钟前
【后端开发】系统设计101——通信协议,数据库与缓存,架构模式,微服务架构,支付系统(36张图详解)
数据库·缓存·微服务·架构·系统设计
米饭好好吃.19 分钟前
【Redis实战】投票功能
数据库·redis·缓存
J不A秃V头A1 小时前
SQL精度丢失:CAST(ce.fund / 100 AS DECIMAL(10, 2)) 得到 99999999.99
数据库·sql·oracle
工业甲酰苯胺2 小时前
Redis 事务和 “锁机制”——> 并发秒杀处理的详细说明
数据库·redis·bootstrap
wybshyy2 小时前
WebApi使用 (.Net Framework版)
数据库·.net
菠萝咕噜肉i2 小时前
Maven
java·数据库·maven
Snow_Dragon_L2 小时前
【MySQL】语言连接
android·数据库·后端·sql·mysql·ubuntu·adb
Lzehui2 小时前
spring boot接收请求常用注解
java·数据库·spring boot
m0_653031362 小时前
微软发布基于PostgreSQL的开源文档数据库平台DocumentDB
数据库·microsoft·postgresql
飞翔的佩奇2 小时前
Java项目: 基于SpringBoot+mybatis+maven+mysql实现的装饰工程管理系统(含源码+数据库+毕业论文)
java·数据库·spring boot·mybatis·ssm·毕设·装饰工程