数据库规范化 1NF 到 3NF 的详解
· 阅读需 2 分钟
第一范式(1NF)
每个表格的列都必须拥有单一的(不可再分的)值,列不能有重复的组
假设有一个记录学生爱好的表格,如果一个学生有多个爱好,这样设计就违反了 1NF
| StudentID | StudentName | Hobbies |
|---|---|---|
| 1 | Alice | 游泳, 跑步 |
为了满足 1NF,我们应将“Hobbies”拆分为多行,每行表示一个爱好
| StudentID | StudentName | Hobby |
|---|---|---|
| 1 | Alice | 游泳 |
| 1 | Alice | 跑步 |
第二范式(2NF)
基于 1NF,所有非主键字段必须完全依赖于整个主键
假设一个表格记录学生参加的课程及课程老师,如果主键是(StudentID, CourseID),则下表违反了 2NF,因为“TeacherName”只依赖于“CourseID”部分
| StudentID | CourseID | TeacherName |
|---|---|---|
| 1 | 101 | Dr. Smith |
| 2 | 101 | Dr. Smith |
| 1 | 102 | Dr. Jones |
为了达到 2NF,我们应该把“TeacherName”移到单独的表格中
Courses Table
| CourseID | TeacherName |
|---|---|
| 101 | Dr. Smith |
| 102 | Dr. Jones |
Enrollment Table
| StudentID | CourseID |
|---|---|
| 1 | 101 |
| 2 | 101 |
| 1 | 102 |
第三范式(3NF)
基于 2NF,任何非主键字段不应依赖于其他非主键字段
如果有一个员工表,其中包括员工、他们所在的部门以及部门经理
| EmployeeID | DepartmentName | DepartmentManager |
|---|---|---|
| E01 | Sales | John Doe |
| E02 | Sales | John Doe |
| E03 | HR | Jane Smith |
这里,“DepartmentManager”依赖于“DepartmentName”,违反了 3NF 正确的设计应该是创建一个独立的“部门”表
Departments Table
| DepartmentName | DepartmentManager |
|---|---|
| Sales | John Doe |
| HR | Jane Smith |
Employees Table
| EmployeeID | DepartmentName |
|---|---|
| E01 | Sales |
| E02 | Sales |
| E03 | HR |