在数据库设计中,范式是一个重要的概念。范式是一组规则,用于规范关系型数据库中表的设计。较高级别的范式会进一步规范关系型数据库的表,从而提高表的规范化程度,减少数据冗余,增加数据的完整性和一致性。本文将通过一个例题,从多个角度来探讨范式的应用。
范式的级别
范式共有6个级别:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF)。下面我们将通过一个例题来说明。
假设有一个学生选课的数据库,其中包括三个表:
- 学生表(Student):学生编号(student_id)、学生姓名(name)、年龄(age)
- 课程表(Course):课程编号(course_id)、课程名称(name)、教师编号(teacher_id)、学分(credit)
- 选课表(Selection):学生编号、课程编号、成绩(score)
第一范式
第一范式的规定是“属性不可再分”,即每一列的值都是原子性的,不可再分。我们可以发现上述数据库的三个表都满足了第一范式的要求。
第二范式
第二范式的规定是“每个非主属性都完全依赖于主键”,即每个表都应当有一个主键,非主属性只能依赖于主键。在上述例子中,学生表的主键是学生编号(student_id),课程表的主键是课程编号(course_id),选课表由学生编号(student_id)和课程编号(course_id)构成的复合主键。其中,选课表中成绩(score)只依赖于复合主键,因此该表也已经满足第二范式的要求。
第三范式
第三范式的规定是“非主属性不传递依赖于主键”,即非主属性不能依赖于非主属性,只能依赖于主键。在上述例子中,课程表的教师编号(teacher_id)只依赖于课程编号(course_id),因此不满足第三范式的要求。为了满足第三范式的要求,可以将课程编号(course_id)和教师编号(teacher_id)分别放在两个表中,形成关于课程和教师的两个表。这样,如果教师编号发生变化,只需要修改教师表,而不需要在多处修改课程表。
巴斯-科德范式(BCNF)
一些数据库学者认为BCNF比第三范式更高级,是在第三范式的基础上进一步规范完整性约束。在上述例子中,存在一个函数依赖关系:课程编号(course_id)->课程名称(name)、学分(credit)、教师编号(teacher_id)。因此,该表不满足BCNF要求。
第四范式和第五范式
第四范式和第五范式相对较少使用,一般只在大型数据库中使用。第四范式的规定是“没有多值依赖”,即每个属性都唯一。第五范式的规定是“没有逆转依赖”,即没有非主属性依赖于非主属性。这些规则都更加严格,一般不常用。