浅析数据库三大范式
数据库设计的三大范式是指关系数据库设计中的三种规范化标准,分别是第一范式(1NF)1、第二范式(2NF)2和第三范式(3NF)3。这些范式旨在减少数据冗余,提高数据一致性和完整性。
第一范式(1NF)
第一范式要求关系数据库中的每个属性都必须是不可分割的基本数据项,即每个字段只能存储一个值。换句话说,表格中的每个单元格只能包含一个值,而不能包含多个值或重复的值。
例如,下面的表格不满足第一范式,因为“电话号码”字段包含了多个值。
Id | User | CreatedAt | PhoneNumbers |
---|---|---|---|
1 | Alice | June 21 2022 | 3122133955, 6266666138 |
2 | Bob | July 22 2024 | 9191247844, 9311741082 |
由于第一范式要求每个字段只能存储一个值,需要将“电话号码”字段拆分为多个行。
Id | User | CreatedAt | PhoneNumber |
---|---|---|---|
1 | Alice | June 21 2022 | 3122133955 |
2 | Alice | June 21 2022 | 6266666138 |
3 | Bob | July 22 2024 | 9191247844 |
4 | Bob | July 22 2024 | 9311741082 |
第二范式(2NF)
第二范式在满足第一范式的基础上,要求每个非主属性必须完全依赖于主键,而不能依赖于主键的一部分。这意味着,如果一个表格的主键是由多个字段组成的,那么所有非主属性必须依赖于整个主键,而不能只依赖于其中的某一个字段。
Id | User | CreatedAt | PhoneNumber | Service |
---|---|---|---|---|
1 | Alice | June 21 2022 | 3122133955 | T-Mobile |
2 | Alice | June 21 2022 | 6266666138 | CommonIO |
3 | Bob | July 22 2024 | 9191247844 | CommonIO |
4 | Bob | July 22 2024 | 9311741082 | CommonIO |
观察这个数据表,主键是由“Id”和“PhoneNumber”组成的复合主键。可以看到,“Service”字段依赖于“PhoneNumber”字段,而不是依赖于整个主键。因此,这个表格不满足第二范式。
要使这个数据表满足数据库第二范式,需要将“Service”字段移到一个新的表格中。
Id | User | CreatedAt | PhoneNumber |
---|---|---|---|
1 | Alice | June 21 2022 | 3122133955 |
2 | Alice | June 21 2022 | 6266666138 |
3 | Bob | July 22 2024 | 9191247844 |
4 | Bob | July 22 2024 | 9311741082 |
修改后的数据表满足第二范式。
Id | PhoneNumber | Service |
---|---|---|
1 | 3122133955 | T-Mobile |
2 | 6266666138 | CommonIO |
3 | 9191247844 | CommonIO |
4 | 9311741082 | CommonIO |
第三范式(3NF)
第三范式在满足第二范式的基础上,要求每个非主属性必须直接依赖于主键,而不能依赖于其他非主属性。这意味着,如果一个表格中的某个非主属性依赖于另一个非主属性,那么这个表格就不满足第三范式。
那么,什么是传递依赖呢?假设有一个表格,其中包含“学生 Id”、“学生姓名”和“班级名称”三个字段。如果“班级名称”依赖于“学生 Id”,而“学生姓名”也依赖于“学生 Id”,那么就存在传递依赖,因为“班级名称”依赖于“学生姓名”。
Id | User | CreatedAt | PhoneNumber | Service | Carrier |
---|---|---|---|---|---|
1 | Alice | June 21 2022 | 3122133955 | T-Mobile | Verizon |
2 | Alice | June 21 2022 | 6266666138 | CommonIO | Verizon |
3 | Bob | July 22 2024 | 9191247844 | CommonIO | Verizon |
4 | Bob | July 22 2024 | 9311741082 | CommonIO | Verizon |
上述数据表中,“Carrier”字段依赖于“Service”字段,而不是直接依赖于主键“Id”。因此,这个表格不满足第三范式。要使这个数据表满足第三范式,需要将“Carrier”字段移到一个新的表格中。
Id | User | CreatedAt | PhoneNumber | Service |
---|---|---|---|---|
1 | Alice | 2022-06-21 | 3122133955 | T-Mobile |
2 | Alice | 2022-06-21 | 6266666138 | CommonIO |
3 | Bob | 2024-07-22 | 9191247844 | CommonIO |
4 | Bob | 2024-07-22 | 9311741082 | CommonIO |
将“Carrier”字段移到一个新的表格中。
Id | Service | Carrier |
---|---|---|
1 | T-Mobile | Verizon |
2 | CommonIO | Verizon |
总的来说,数据库三大范式的主要目的是减少数据冗余,提高数据一致性和完整性。第一范式要求每个字段只能存储一个值,第二范式要求每个非主属性必须完全依赖于主键,而第三范式要求每个非主属性必须直接依赖于主键。