在数据库设计中,三范式(3NF)是指一种数据规范化的过程,旨在减少数据冗余和提高数据的一致性。下面是对三范式的详细解释:
第一范式(1NF)
第一范式要求数据库中的每个表格中的每一列都是原子的,即每个字段都只能包含一个值,而不能是一个集合或列表。这意味着表中的每一个字段都应该是不可再分的最小数据单元。
例子:
假设有一个表格 Students
,记录学生的姓名和他们的电话号码。
不符合1NF的表格:
StudentID | Name | PhoneNumbers |
---|---|---|
1 | Alice | 123456, 654321 |
2 | Bob | 987654 |
符合1NF的表格:
StudentID | Name | PhoneNumber |
---|---|---|
1 | Alice | 123456 |
1 | Alice | 654321 |
2 | Bob | 987654 |
第二范式(2NF)
第二范式在满足第一范式的基础上,要求表中的每个非主属性完全依赖于主键,而不是部分依赖于主键。也就是说,表中的每一个非主键列都必须依赖于整个主键,而不能依赖于主键的一部分。
例子:
假设有一个表格 Orders
,记录订单信息,包括订单ID、产品ID、产品名称和数量。
不符合2NF的表格:
OrderID | ProductID | ProductName | Quantity |
---|---|---|---|
1 | 101 | Widget | 10 |
1 | 102 | Gadget | 5 |
2 | 101 | Widget | 7 |
符合2NF的表格:
将表格拆分为两个表格,一个记录订单信息,另一个记录产品信息。
Orders
表:
OrderID | ProductID | Quantity |
---|---|---|
1 | 101 | 10 |
1 | 102 | 5 |
2 | 101 | 7 |
Products
表:
ProductID | ProductName |
---|---|
101 | Widget |
102 | Gadget |
第三范式(3NF)
第三范式在满足第二范式的基础上,要求表中的每个非主属性都不传递依赖于主键。也就是说,非主属性之间不能存在依赖关系,所有非主属性都必须直接依赖于主键。
例子:
假设有一个表格 Employees
,记录员工信息,包括员工ID、部门ID、部门名称和员工姓名。
不符合3NF的表格:
EmployeeID | DeptID | DeptName | EmployeeName |
---|---|---|---|
1 | 10 | Sales | Alice |
2 | 20 | Marketing | Bob |
3 | 10 | Sales | Charlie |
符合3NF的表格:
将表格拆分为两个表格,一个记录员工信息,另一个记录部门信息。
Employees
表:
EmployeeID | DeptID | EmployeeName |
---|---|---|
1 | 10 | Alice |
2 | 20 | Bob |
3 | 10 | Charlie |
Departments
表:
DeptID | DeptName |
---|---|
10 | Sales |
20 | Marketing |
通过遵循三范式,可以确保数据库设计的规范性,减少数据冗余,提高数据的一致性和完整性。