数据库设计的范式(Normal Forms)是一些规范化的规则,用于组织数据库中的数据,以减少冗余、消除异常、提高数据一致性。下面是几大常见的数据库范式:
第一范式 (1NF: First Normal Form)
要求:
- 所有表中的字段必须是原子性的,即每个字段只能包含一个值,而不能包含一组值或列表。
- 表中每一列必须是单值属性,不可再分。
举例: 假设有一个客户表: |
CustomerID | CustomerName | PhoneNumbers |
---|---|---|---|
1 | Alice | 123-4567, 234-5678 |
这里 PhoneNumbers 列违反了第一范式,因为它包含多个值。将其规范化为第一范式: |
CustomerID | CustomerName | PhoneNumber |
---|---|---|---|
1 | Alice | 123-4567 | |
1 | Alice | 234-5678 |
第二范式 (2NF: Second Normal Form)
要求:
- 满足第一范式。
- 表中的每个非主键列都必须完全依赖于主键(即不能有部分依赖)。
举例: 假设有一个订单表: |
OrderID | ProductID | ProductName | Quantity |
---|---|---|---|---|
1 | 101 | Widget | 10 | |
2 | 102 | Gadget | 5 |
这里 ProductName 依赖于 ProductID ,而不是 OrderID 。将其规范化为第二范式:订单表: |
OrderID | ProductID | Quantity |
---|---|---|---|
1 | 101 | 10 | |
2 | 102 | 5 |
产品表: | ProductID | ProductName |
---|---|---|
101 | Widget | |
102 | Gadget |
第三范式 (3NF: Third Normal Form)
要求:
- 满足第二范式。
- 表中的每个非主键列必须直接依赖于主键,而不能依赖于其他非主键列(即不能有传递依赖)。
举例: 假设有一个学生表: |
StudentID | StudentName | DepartmentID | DepartmentName |
---|---|---|---|---|
1 | Alice | 10 | Computer Science | |
2 | Bob | 20 | Mathematics |
这里 DepartmentName 依赖于 DepartmentID ,而 DepartmentID 又依赖于 StudentID 。将其规范化为第三范式:学生表: |
StudentID | StudentName | DepartmentID |
---|---|---|---|
1 | Alice | 10 | |
2 | Bob | 20 |
部门表: | DepartmentID | DepartmentName |
---|---|---|
10 | Computer Science | |
20 | Mathematics |
BCNF (Boyce-Codd Normal Form)
要求:
- 满足第三范式。
- 对于每个非平凡的函数依赖 X -> Y,X 必须是超键(superkey)。
举例: 假设有一个课程表: |
CourseID | Instructor | Classroom |
---|---|---|---|
1 | Prof. A | Room 101 | |
2 | Prof. B | Room 102 |
如果一个教室只能由一个教授教授,并且一个教授只能在一个教室授课,这里存在一个依赖关系 Classroom -> Instructor 。将其规范化为 BCNF:课程表: |
CourseID | Instructor |
---|---|---|
1 | Prof. A | |
2 | Prof. B |
教室表: | Classroom | Instructor |
---|---|---|
Room 101 | Prof. A | |
Room 102 | Prof. B |
第四范式 (4NF: Fourth Normal Form)
要求:
- 满足 BCNF。
- 不包含多值依赖(一个属性依赖于另一个属性的多个值)。
举例: 假设有一个项目表: |
ProjectID | EmployeeID | SkillID |
---|---|---|---|
1 | 101 | A | |
1 | 101 | B | |
2 | 102 | A |
这里一个项目可以涉及多个员工,一个员工可以拥有多项技能,存在多值依赖。将其规范化为第四范式: 项目-员工表: |
ProjectID | EmployeeID |
---|---|---|
1 | 101 | |
2 | 102 |
员工-技能表: | EmployeeID | SkillID |
---|---|---|
101 | A | |
101 | B | |
102 | A |
第五范式 (5NF: Fifth Normal Form)
要求:
- 满足第四范式。
- 消除所有的连接依赖(Join Dependency)。
举例: 假设有一个供应商-零件-项目表: |
SupplierID | PartID | ProjectID |
---|---|---|---|
1 | A | X | |
1 | B | X | |
2 | A | Y | |
2 | B | Y |
将其规范化为第五范式: 供应商-零件表: |
SupplierID | PartID |
---|---|---|
1 | A | |
1 | B | |
2 | A | |
2 | B |
零件-项目表: | PartID | ProjectID |
---|---|---|
A | X | |
B | X | |
A | Y | |
B | Y |
供应商-项目表: | SupplierID | ProjectID |
---|---|---|
1 | X | |
2 | Y |
通过遵循这些范式规则,可以设计出更加健壮、减少冗余且易于维护的数据库模型。每个范式都有其应用场景和限制,实际中需要根据具体需求来平衡规范化与性能之间的关系。