面试模拟场景
面试官: 你能介绍一下1NF、2NF、3NF、4NF范式吗?
参考回答示例
1. 第一范式(1NF - First Normal Form)
定义:
- 第一范式要求每个表中的字段都是原子性的,即每个字段只包含一个不可分割的值。换句话说,1NF消除了表中重复的列,并确保列中的每个数据项都是单一值。
特点:
- 单一值: 每个列中的值都是不可再分的基本数据项。
- 消除重复: 在1NF中,不允许表中的列包含重复的组,也不允许列中包含多值属性。
示例:
假设我们有一个包含学生信息的表:
StudentID | Name | PhoneNumbers |
---|---|---|
1 | John Doe | 1234567890, 0987654321 |
2 | Jane Smith | 2345678901 |
这张表不符合1NF,因为PhoneNumbers
列包含了多个值。为了符合1NF,我们需要将多值属性拆分成多个行或列:
StudentID | Name | PhoneNumber |
---|---|---|
1 | John Doe | 1234567890 |
1 | John Doe | 0987654321 |
2 | Jane Smith | 2345678901 |
2. 第二范式(2NF - Second Normal Form)
定义:
- 第二范式是在满足第一范式的基础上消除部分依赖,即表中的非主属性必须完全依赖于主键,而不能依赖于主键的一部分。2NF主要解决的是部分依赖问题。
特点:
- 完全依赖: 每个非主属性都必须完全依赖于主键,而不是依赖于主键的一部分。
- 消除部分依赖: 如果一个非主属性只依赖于主键的一部分,就违反了2NF。
示例:
假设我们有一个订单表:
OrderID | ProductID | ProductName | Quantity |
---|---|---|---|
101 | P01 | Widget | 10 |
102 | P02 | Gadget | 5 |
在这个表中,ProductName
依赖于 ProductID
,而不是 OrderID
,因此这张表违反了2NF。
要符合2NF,可以将表分解成两个表:
- 订单表:
OrderID | ProductID | Quantity |
---|---|---|
101 | P01 | 10 |
102 | P02 | 5 |
- 产品表:
ProductID | ProductName |
---|---|
P01 | Widget |
P02 | Gadget |
3. 第三范式(3NF - Third Normal Form)
定义:
- 第三范式是在满足第二范式的基础上消除传递依赖,即表中的非主属性不能依赖于其他非主属性。3NF的目标是消除数据冗余,确保数据依赖于主键,而不是其他非主属性。
特点:
- 消除传递依赖: 非主属性之间不应该存在传递依赖。也就是说,如果A依赖于B,B依赖于C,那么A不应该直接依赖于C。
示例:
假设我们有一个员工表:
EmployeeID | DepartmentID | DepartmentName | Manager |
---|---|---|---|
1 | D01 | Sales | Alice |
2 | D02 | Engineering | Bob |
在这个表中,DepartmentName
和 Manager
依赖于 DepartmentID
,而 DepartmentID
又依赖于 EmployeeID
,因此这张表违反了3NF。
要符合3NF,可以将表分解成两个表:
- 员工表:
EmployeeID | DepartmentID |
---|---|
1 | D01 |
2 | D02 |
- 部门表:
DepartmentID | DepartmentName | Manager |
---|---|---|
D01 | Sales | Alice |
D02 | Engineering | Bob |
4. 第四范式(4NF - Fourth Normal Form)
定义:
- 第四范式是在满足第三范式的基础上消除多值依赖。4NF的目标是确保每个非主属性在主键的基础上都是唯一的,即没有多个独立的多值属性。
特点:
- 消除多值依赖: 表中的任何非主属性都不应该有多值依赖,即一个主键不应该对应多个独立的多值属性。
示例:
假设我们有一个课程表,其中一个学生可以选修多门课程,并且每门课程可以有多个教师:
StudentID | Course | Teacher |
---|---|---|
1 | Math | Mr. Smith |
1 | Math | Mrs. Doe |
1 | Science | Dr. Brown |
在这个表中,Course
和 Teacher
是两个独立的多值属性,它们之间存在多值依赖,因此违反了4NF。
要符合4NF,可以将表分解成两个表:
- 学生课程表:
StudentID | Course |
---|---|
1 | Math |
1 | Science |
- 课程教师表:
Course | Teacher |
---|---|
Math | Mr. Smith |
Math | Mrs. Doe |
Science | Dr. Brown |
5. 总结
- 1NF(第一范式): 要求每个字段都是原子性的,不允许多值属性和重复列。
- 2NF(第二范式): 在满足1NF的基础上,消除部分依赖,所有非主属性必须完全依赖于主键。
- 3NF(第三范式): 在满足2NF的基础上,消除传递依赖,非主属性之间不应该存在依赖关系。
- 4NF(第四范式): 在满足3NF的基础上,消除多值依赖,确保每个非主属性在主键的基础上都是唯一的。