数据库管理系统 (DBMS) 中的第一范式 (1NF)
规范化是设计关系型数据库的关键原则之一。第一范式 (1NF) 是规范化过程中的基础步骤。它就像清理数据一样,确保一切整洁有序。阅读本章以了解 1NF 的含义、其重要性以及如何应用它。
什么是第一范式?
第一范式是一组规则,确保表的结构保持简单和有组织。根据关系型数据库之父 E. F. Codd 的定义,如果表中不包含任何多值属性,则该表处于 1NF。用更简单的话说,每个单元格应只包含单个值,而不是值列表或集合。
想象一下,如果一个表中有一个列针对同一个人包含多个值,这就会出问题。例如,在 Student 表中,如果一个学生的单行列出了多个课程,则该表不处于 1NF。
非 1NF 表的示例
考虑以下表 −
| Roll Number | Name | Course |
|---|---|---|
| 1 | Sayan | C, C++ |
| 2 | Harsh | Java |
| 3 | Ankur | C, DBMS |
在这里,我们可以看到问题所在:Course 列对某些学生有多个值。例如,Sayan 同时选修了 C 和 C++,而 Ankur 选修了 C 和 DBMS。这违反了 1NF 的规则,该规则规定每列的每个行只能有一个值。
1NF 的重要性
不处于 1NF 的表可能会引起混淆。例如,查询此类表以查找所有选修“C++”的学生,可能会遗漏某些行。此外,更新数据会变得混乱。想象一下,要为一个学生添加新课程,该如何在一个单元格中管理它?
通过将表转换为 1NF,我们可以消除这些问题,使数据更容易管理和查询。
转换为第一范式的方法
有三种不同的方法可以修复表格并将其转换为 1NF −
- 拆分具有重复值的行
- 为多值属性添加单独的列
- 将表格分为两个
让我们使用上面的示例,详细了解每种方法。
方法 1:拆分具有重复值的行
将表格转换为 1NF 的最简单方法是将具有多个值的行分解为单独的行。对于 Student 表格,它将如下所示 −
| Roll Number | Name | Course |
|---|---|---|
| 1 | Sayan | C |
| 1 | Sayan | C++ |
| 2 | Harsh | Java |
| 3 | Ankur | C |
| 3 | Ankur | DBMS |
修改后,每行在 Course 列中只包含一个值。这修复了 1NF 违规。但有一个有趣的点需要注意:如果我们被要求识别 primary key,我们会发现 Roll Number 单独使用是不够的,因为它对某些学生会重复。相反,需要一个 composite primary key。这是 Roll Number 和 Course 的组合。这是为了唯一标识每行。
注意 − 拆分行简单直接,但可能导致数据冗余。
方法 2:为多值属性添加单独的列
另一种方法是为多个值创建额外的列。例如 −
| Roll Number | Name | Course 1 | Course 2 |
|---|---|---|---|
| 1 | Sayan | C | C++ |
| 2 | Harsh | Java | |
| 3 | Ankur | C | DBMS |
在这里,每门课程都有自己的列。这种结构确保每个单元格只包含一个值,满足 1NF 条件。然而,这种方法有一些 限制 −
- 如果一个学生选修超过两门课程,我们需要添加更多列。
- 某些单元格可能为空 (NULL),这会导致空间使用效率低下。
在这种情况下,primary key 将是 Roll Number,因为它唯一标识每行。但为每个可能的值添加太多列对于大型数据集来说并不实用。
注意 − 添加新列适用于小型、固定数据集,但对于可变长度的属性不具备可扩展性。
方法 3:将表格分为两个
第三种方法通常是 最佳 的 − 它将表格拆分为两个独立的表格。这样,我们可以在无冗余的情况下规范化数据。以下是其工作原理 −
基础表格(存储学生详细信息) −
| Roll Number | Name |
|---|---|
| 1 | Sayan |
| 2 | Harsh |
| 3 | Ankur |
引用表格(存储课程注册信息) −
| Roll Number | Course |
|---|---|
| 1 | C |
| 1 | C++ |
| 2 | Java |
| 3 | C |
| 3 | DBMS |
在这种设计中 −
- 基础表格 使用 Roll Number 作为其 primary key。
- 引用表格 使用 Roll Number 和 Course 的组合作为其 primary key。
- 引用表格中的 Roll Number 也是一个 foreign key,指向基础表格。
这种方法更灵活。如果一个学生选修多门课程,我们只需在引用表格中添加更多行,而无需修改基础表格。
注意 − 分割表格是一种干净且可扩展的方法,适用于复杂数据集。
第一范式的实际益处
通过将表格转换为 1NF,我们确保了以下内容 −
- 一致性 − 数据以统一格式存储。
- 简单性 − 查询更容易编写和理解。
- 可扩展性 − 结构可以在无需重大重新设计的情况下处理增长。
实现 1NF 是迈向更高规范化水平的第一步。
结论
在本章中,我们介绍了数据库设计中的第一范式 (1NF) 概念。我们从定义 1NF 及其重要性开始。
通过一个示例,我们演示了多值属性如何违反 1NF,并探讨了三种修复问题的方法:拆分具有重复值的行、为多值属性添加单独的列,以及将表格分为基础表格和引用表格。每种方法都有其优缺点,但将表格分为两个通常是最实用的解决方案。