数据库规范化 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 |