在关系型数据库中,第一、二和三范式(1NF、2NF和3NF)是数据规范化的基础。这些范式旨在确保数据库表的数据不包含冗余信息,并且表中每个数据项都可以通过主键唯一确定。虽然这些范式是数据库设计中最基本的原则之一,但它们之间的区别有时会造成困惑。在本文中,我们将从几个角度探讨第一、二、三范式之间的区别。
1. 定义
第一范式(1NF):数据表中的每个字段都是原子性的,即不可再分。
第二范式(2NF):数据表中每个非主键字段都与主键有完全依赖关系,即非主键字段都必须完全依赖于主键而不是部分依赖。
第三范式(3NF):数据表中的非主键字段不应该相互依赖,而是只依赖于主键。
2. 关键特征
第一范式(1NF):每个单元格只包含单个值,而不是多个值的集合。这防止了列中的重复数据和冗余数据。
第二范式(2NF):每个非主键字段都与主键有完全依赖关系。这意味着非主键字段只与主键有关,而与其他非主键字段无关。
第三范式(3NF):每个非主键字段都不应该相互依赖,而只依赖于主键。换句话说,非主键字段之间不应该有传递依赖性。
3. 示例
为了更好地说明这些范式之间的区别,我们来看一个示例。
图书馆管理系统中有两个表:书籍和作者。
[book]表的结构如下:
| ID | Book Name | Author ID | Author Name | Price |
| 1 | "Database design" | 1 | "Danny" | $20 |
| 2 | "Programming in Python" | 2 | "John" | $15 |
[author]表的结构如下:
| Author ID | Name | Email |
| 1 | "Danny" | "danny@example.com" |
| 2 | "John" | "john@example.com" |
基于上述表可以得到以下结论:
第一范式:两个表的每个单元格都只包含一个值,没有多个值的集合,因此满足第一范式。
第二范式:[book]表中的每个非主键字段都与主键有完全依赖关系。这意味着["Book Name", "Author ID", "Price"]只依赖于["ID"],而["Author Name"]只依赖于["Author ID"],不存在部分依赖,因此满足第二范式。
第三范式:[book]表中的非主键字段["Author Name"]与主键["ID"]无关,而是依赖于另一个非主键字段["Author ID"]。因此,[book]表不符合第三范式。
为了使[book]表满足第三范式,需要从[book]表中提取出一个新表[author]。[author]表的结构如下:
| Author ID | Name | Email |
| 1 | "Danny" | "danny@example.com" |
| 2 | "John" | "john@example.com" |
然后更新[book]表,将["Author ID"]替换为["Author ID"]和[author]表关联关系中的["Email"],[book]表的结构如下:
| ID | Book Name | Author ID | Price |
| 1 | "Database design" | 1 | $20 |
| 2 | "Programming in Python" | 2 | $15 |
从而使[book]表满足第三范式。
4. 总结
第一范式(1NF)可保证数据库表中没有重复数据或多个值的集合。
第二范式(2NF)可保证每个非主键字段都与主键有完全依赖关系,消除了表中的部分依赖关系。
第三范式(3NF)预防了表中的传递依赖关系。
在设计数据库时,应尽可能遵循这些范式,以确保数据的一致性、完整性和准确性。