数据库的范式是一套减少数据冗余和改善数据完整性的规则。
第一范式(1NF)
要求每列的原子性,即属性值不能再分解
示例:
一个包含学生信息的表,其中包含以下字段:
- 学生ID(StudentID)
- 学生姓名(StudentName)
- 选修课程(Courses)
如果 Courses 字段是这样的:
学生A:数学, 英语
学生B:物理, 化学, 生物
这个设计就不符合第一范式,因为 Courses 字段包含了多个值。
调整后的设计:
- 学生ID(StudentID)
- 学生姓名(StudentName)
- 课程名称(Courses)
每个学生和课程的组合占据一行,例如:
- 学生ID:1,学生姓名:学生A,课程名称:数学
- 学生ID:1,学生姓名:学生A,课程名称:英语
- 学生ID:2,学生姓名:学生B,课程名称:物理
- 学生ID:2,学生姓名:学生B,课程名称:化学
- 学生ID:2,学生姓名:学生B,课程名称:生物
这样的设计符合第一范式,因为每个字段都只包含一个数据值,便于数据库管理和查询处理。
第二范式(2FN)
要求必须满足1NF,非主键列要完全依赖于主键。不能存在部份依赖。
也就是说每个表只代表一个对象,通常发生在主键是由多个字段组成的复合主键的情况下
示例:
一个学生课程表,包含以下字段:
- 学生ID(StudentID)
- 课程ID(CourseID)
- 学生姓名(StudentName)
- 课程名称(CourseName)
其中,(StudentID, CourseID) 是复合主键。在这个表中:
StudentName 只依赖于 StudentID(部分依赖于复合主键中的一个部分)
CourseName 只依赖于 CourseID(部分依赖于复合主键中的一个部分)
这个表不符合2NF,因为存在部分依赖。
第三范式(3FN)
要求必须满足2NF,并且所有非主键属性之间不能存在传递依赖关系。
(非主键属性不能依赖于其他非主键属性)
示例:
假设已经将上述学生课程表分解成两个2NF表:
- 学生表(StudentID, StudentName)
- 课程表(CourseID, CourseName, teacherName )
假设课程名称决定了授课教师,那么就存在传递依赖:
teacherName 依赖于 CourseName,而 CourseName 依赖于 CourseID
为了符合3NF,需要进一步分解:
- 课程表(CourseID, CourseName)
- 授课教师表(CourseName, InstructorName)
这样确保了所有非主属性只依赖于主键,且不存在任何非主属性依赖于其它非主属性的情况。
标签:范式,CourseName,数据库,课程名称,ID,依赖于,学生,主键 From: https://blog.csdn.net/aliez_ahh/article/details/141278292