学生选课系统关系表
学号(Sno) | 姓名(Sname) | 性别(Sex) | 年龄(Age) | 专业(Major) | 课程号(Cno) | 课程名(Cname) | 成绩(Grade) | 授课教师(Tname) |
---|---|---|---|---|---|---|---|---|
2021001 | 张三 | 男 | 20 | 计算机科学与技术 | 001 | 数据库原理 | 85 | 李四 |
2021002 | 李四 | 女 | 19 | 软件工程 | 001 | 数据库原理 | 90 | 李四 |
2021003 | 王五 | 男 | 21 | 网络工程 | 002 | 操作系统 | 75 | 王五 |
2021004 | 赵六 | 女 | 20 | 计算机科学与技术 | 002 | 操作系统 | 80 | 王五 |
主属性
- 主属性是能够唯一标识一条记录的属性或属性组中的各个属性。在 “学生选课系统” 中,学号(Sno)是唯一标识每个学生的属性,课程号(Cno)是唯一标识每门课程的属性。所以学号和课程号都是主属性。
候选键
- 候选键是能够唯一标识一条记录的属性或属性组,并且其任何真子集都不能再唯一标识该记录。在这个例子中,单独的学号可以唯一标识一个学生的基本信息以及他所选的课程和成绩等所有信息,所以学号是一个候选键;同样,单独的课程号可以唯一标识一门课程的所有信息,所以课程号也是一个候选键。
- 另外,学号和课程号的组合(Sno,Cno)也可以唯一标识一条选课记录,包括学生的信息、课程的信息以及对应的成绩等,并且学号和课程号的任何真子集都不能唯一标识这条记录,所以(Sno,Cno)也是一个候选键。通常在实际应用中,会根据具体情况选择其中一个作为主键,这里假设选择(Sno,Cno)作为主键。
函数依赖
- 函数依赖关系:在学生选课系统中,学号确定了,那么对应的姓名、性别、年龄、专业等学生基本信息也就确定了,所以姓名、性别、年龄、专业等属性函数依赖于学号,即 Sno -> Sname,Sno -> Sex,Sno -> Age,Sno -> Major。
- 完全函数依赖:成绩(Grade)这个属性是由学号(Sno)和课程号(Cno)共同决定的,也就是说只有当学号和课程号都确定时,成绩才能唯一确定,不存在成绩只依赖于学号或者课程号其中一个的情况,所以成绩完全函数依赖于学号和课程号,即(Sno,Cno)-> Grade。
- 部分函数依赖:课程名(Cname)只依赖于课程号(Cno),而与学号(Sno)无关,即 Cno -> Cname,这说明课程名对主键(Sno,Cno)存在部分函数依赖。
- 传递函数依赖:假设在学校中,每个专业都有一个固定的辅导员,那么辅导员的信息就可以通过专业来确定,而专业又依赖于学号,即 Sno -> Major,Major -> 辅导员,这就形成了传递函数依赖。
范式
- 第一范式(1NF):上述的学生选课系统表中的每一个属性都是不可再分的原子值,所以它满足第一范式。例如成绩这个属性,它就是一个具体的数值,不能再拆分成其他更小的部分,每个属性都具有原子性。
- 第二范式(2NF):由于课程名(Cname)只依赖于课程号(Cno),对主键(Sno,Cno)存在部分函数依赖,不满足第二范式。为了使其满足第二范式,我们可以将表拆分成三个表:学生表(学号,姓名,性别,年龄,专业)、课程表(课程号,课程名,授课教师)和选课表(学号,课程号,成绩)。这样在选课表中,成绩完全函数依赖于学号和课程号,在学生表和课程表中,各属性也都完全函数依赖于各自的主键,满足了第二范式。
- 第三范式(3NF):在上述拆分后的学生表中,如果存在辅导员的信息,且辅导员的信息通过专业传递依赖于学号,那么就不满足第三范式。此时需要将辅导员的信息单独提取出来放到一个新的表中,如专业表(专业,辅导员),这样就避免了传递函数依赖,满足了第三范式。
评论区