跳到主要内容

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