对大学教务管理数据库,有一个教师开课表 Teach(teacherNo,courseNo, semester,classNo),有一个学生选课表 Enroll(teacherNo,studentNo, courseNo,semester,ClassNo,teacherNo, score)。分析这两个表的主键和外 键,弄清楚这两个表之间的关系。这种关系又该如何来表达?是否还要有一个表 Open(courseNo,semester,classNo)?请从范式来分析,说明理由。如果要有 Open 表,Enroll 表是不是要修改?该如何定义 Enroll 表?
时间: 2023-07-14 18:13:33 浏览: 121
在教务管理数据库中,教师开课表 Teach 的主键是由三个属性组成:teacherNo,courseNo和semester。而学生选课表 Enroll 的主键是由四个属性组成:teacherNo,studentNo,courseNo和semester。这两个表之间的关系是一对多的关系,即一个教师可以开设多门课程,而每门课程又可以被多名学生选修。
Teach表中的teacherNo和courseNo是外键,分别引用了教师表和课程表中的主键。Enroll表中的teacherNo,studentNo,courseNo和semester也都是外键,分别引用了教师表、学生表和课程表中的主键。
如果要加入一个Open表,那么它的主键应该由三个属性组成:courseNo,semester和classNo。Enroll表应该修改为:Enroll(studentNo,courseNo,semester,classNo,teacherNo,score),其中的teacherNo引用自Teach表。
从范式来看,Teach表和Enroll表均符合第二范式(2NF),因为它们的属性都能够完全依赖于主键。而如果加入Open表,那么Enroll表就不再符合第二范式,因为Open表中的classNo并不依赖于Enroll表中的主键。为了遵循第二范式,我们需要将Enroll表拆分为两个表:Enroll(studentNo,courseNo,semester,teacherNo,score)和Select(courseNo,semester,classNo,teacherNo,studentNo)。其中,Enroll表中的teacherNo引用自Teach表,Select表中的teacherNo和courseNo均引用自Teach表,而studentNo引用自Student表。这样,每个表的属性都能够完全依赖于主键,符合第二范式。
阅读全文