第二范式(2NF)要求数据库表必须满足第一范式(1NF),并且所有非主键属性都必须完全依赖于整个主键,而不能只依赖于主键的一部分。
反例:学生选课表
考虑以下学生选课表:
复制
学生选课(学号, 课程号, 学生姓名, 课程名称, 成绩)
假设主键是复合主键(学号, 课程号),那么:
满足依赖:成绩完全依赖于整个主键(学号+课程号),因为成绩是由特定学生和特定课程共同决定的
不满足依赖:
学生姓名只依赖于学号(主键的一部分)
课程名称只依赖于课程号(主键的另一部分)
问题分析
这个设计违反了2NF,因为:
学生姓名、系别只依赖于学号(主键的一部分)
课程名称只依赖于课程号(主键的另一部分)
解决方案
要使其满足2NF,应该将其分解为三个表:
学生表(学号, 学生姓名)
课程表(课程号, 课程名称)
选课关系表(学号, 课程号, 成绩)
这样每个非主键属性都完全依赖于整个主键。
第二范式刻画的是两个表之间多对多关系
第三范式刻画的是两个表之间一对多关系