浅析数据库三大范式

数据库设计的三大范式是指关系数据库设计中的三种规范化标准,分别是第一范式(1NF)1、第二范式(2NF)2和第三范式(3NF)3。这些范式旨在减少数据冗余,提高数据一致性和完整性。

第一范式(1NF)

第一范式要求关系数据库中的每个属性都必须是不可分割的基本数据项,即每个字段只能存储一个值。换句话说,表格中的每个单元格只能包含一个值,而不能包含多个值或重复的值。

例如,下面的表格不满足第一范式,因为“电话号码”字段包含了多个值。

IdUserCreatedAtPhoneNumbers
1AliceJune 21 20223122133955, 6266666138
2BobJuly 22 20249191247844, 9311741082

由于第一范式要求每个字段只能存储一个值,需要将“电话号码”字段拆分为多个行。

IdUserCreatedAtPhoneNumber
1AliceJune 21 20223122133955
2AliceJune 21 20226266666138
3BobJuly 22 20249191247844
4BobJuly 22 20249311741082

第二范式(2NF)

第二范式在满足第一范式的基础上,要求每个非主属性必须完全依赖于主键,而不能依赖于主键的一部分。这意味着,如果一个表格的主键是由多个字段组成的,那么所有非主属性必须依赖于整个主键,而不能只依赖于其中的某一个字段。

IdUserCreatedAtPhoneNumberService
1AliceJune 21 20223122133955T-Mobile
2AliceJune 21 20226266666138CommonIO
3BobJuly 22 20249191247844CommonIO
4BobJuly 22 20249311741082CommonIO

观察这个数据表,主键是由“Id”和“PhoneNumber”组成的复合主键。可以看到,“Service”字段依赖于“PhoneNumber”字段,而不是依赖于整个主键。因此,这个表格不满足第二范式。

要使这个数据表满足数据库第二范式,需要将“Service”字段移到一个新的表格中。

IdUserCreatedAtPhoneNumber
1AliceJune 21 20223122133955
2AliceJune 21 20226266666138
3BobJuly 22 20249191247844
4BobJuly 22 20249311741082

修改后的数据表满足第二范式。

IdPhoneNumberService
13122133955T-Mobile
26266666138CommonIO
39191247844CommonIO
49311741082CommonIO

第三范式(3NF)

第三范式在满足第二范式的基础上,要求每个非主属性必须直接依赖于主键,而不能依赖于其他非主属性。这意味着,如果一个表格中的某个非主属性依赖于另一个非主属性,那么这个表格就不满足第三范式。

那么,什么是传递依赖呢?假设有一个表格,其中包含“学生 Id”、“学生姓名”和“班级名称”三个字段。如果“班级名称”依赖于“学生 Id”,而“学生姓名”也依赖于“学生 Id”,那么就存在传递依赖,因为“班级名称”依赖于“学生姓名”。

IdUserCreatedAtPhoneNumberServiceCarrier
1AliceJune 21 20223122133955T-MobileVerizon
2AliceJune 21 20226266666138CommonIOVerizon
3BobJuly 22 20249191247844CommonIOVerizon
4BobJuly 22 20249311741082CommonIOVerizon

上述数据表中,“Carrier”字段依赖于“Service”字段,而不是直接依赖于主键“Id”。因此,这个表格不满足第三范式。要使这个数据表满足第三范式,需要将“Carrier”字段移到一个新的表格中。

IdUserCreatedAtPhoneNumberService
1Alice2022-06-213122133955T-Mobile
2Alice2022-06-216266666138CommonIO
3Bob2024-07-229191247844CommonIO
4Bob2024-07-229311741082CommonIO

将“Carrier”字段移到一个新的表格中。

IdServiceCarrier
1T-MobileVerizon
2CommonIOVerizon

总的来说,数据库三大范式的主要目的是减少数据冗余,提高数据一致性和完整性。第一范式要求每个字段只能存储一个值,第二范式要求每个非主属性必须完全依赖于主键,而第三范式要求每个非主属性必须直接依赖于主键。