跳到主要内容

数据库规范化 1NF 到 3NF 的详解

· 阅读需 2 分钟
素明诚
Full stack development

第一范式(1NF)

每个表格的列都必须拥有单一的(不可再分的)值,列不能有重复的组

假设有一个记录学生爱好的表格,如果一个学生有多个爱好,这样设计就违反了 1NF

StudentIDStudentNameHobbies
1Alice游泳, 跑步

为了满足 1NF,我们应将“Hobbies”拆分为多行,每行表示一个爱好

StudentIDStudentNameHobby
1Alice游泳
1Alice跑步

第二范式(2NF)

基于 1NF,所有非主键字段必须完全依赖于整个主键

假设一个表格记录学生参加的课程及课程老师,如果主键是(StudentID, CourseID),则下表违反了 2NF,因为“TeacherName”只依赖于“CourseID”部分

StudentIDCourseIDTeacherName
1101Dr. Smith
2101Dr. Smith
1102Dr. Jones

为了达到 2NF,我们应该把“TeacherName”移到单独的表格中

Courses Table

CourseIDTeacherName
101Dr. Smith
102Dr. Jones

Enrollment Table

StudentIDCourseID
1101
2101
1102

第三范式(3NF)

基于 2NF,任何非主键字段不应依赖于其他非主键字段

如果有一个员工表,其中包括员工、他们所在的部门以及部门经理

EmployeeIDDepartmentNameDepartmentManager
E01SalesJohn Doe
E02SalesJohn Doe
E03HRJane Smith

这里,“DepartmentManager”依赖于“DepartmentName”,违反了 3NF 正确的设计应该是创建一个独立的“部门”表

Departments Table

DepartmentNameDepartmentManager
SalesJohn Doe
HRJane Smith

Employees Table

EmployeeIDDepartmentName
E01Sales
E02Sales
E03HR