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

avatar
cmdragon 渡劫
image image

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

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

一、什么是数据库范式

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

二、第一范式 (1NF)

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

示例

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

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

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

满足第一范式的设计

将“选课”字段分解:

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

优势

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

三、第二范式 (2NF)

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

示例

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

学生ID课程ID学生姓名课程名称分数
1101张三数学90
1102张三英语85
2101李四数学75

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

满足第二范式的设计

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

学生表

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

选课表

学生ID课程ID分数
110190
110285
210175

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

课程表

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

优势

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

四、第三范式 (3NF)

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

示例

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

学生ID课程ID学生姓名教师姓名教师ID
1101张三教师AT1
1102张三教师BT2
2101李四教师AT1

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

满足第三范式的设计

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

学生表

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

选课表

学生ID课程ID分数教师ID
110190T1
110285T2
210175T1

教师表

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

优势

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

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

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

示例

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

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

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

满足 BCNF 的设计

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

课程表

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

教师表

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

优势

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

六、第四范式 (4NF)

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

示例

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

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

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

满足第四范式的设计

将其拆分为两个表:

产品供应商表

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

产品颜色表

产品ID颜色
1红色
2蓝色

优势

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

七、第五星式 (5NF)

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

示例

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

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

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

满足第五范式的设计

项目员工角色表

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

员工角色表

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

优势

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

八、总结

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

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

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:

往期文章归档: