考虑一个基本的表模式:
学生ID,学生姓名,系,课程代码,课程名称,年级学期,年级
如何通过识别功能依赖关系将其转换为第二范式?
答案 0 :(得分:5)
我使用助记符设备作为前三种常规形式。我用RePeaT这个词忽略了元音。首先是没有重复组或多值字段,第二是没有对主键的部分依赖,最后没有Transitory依赖。
在您的情况下,它看起来像1NF问题而不是2NF。 2NF意味着部分依赖并且看着你的表没有复合主键,即主键具有多于1个字段,因此不存在部分依赖的可能性。因此,对于1NF,有两种可能性,一种是重复组,另一种是多值字段。因此,具有重复组的1NF示例为here,多值示例为here。
如果您拥有表格的实际记录/行并提出问题会更好:是否有重复的组或是否有任何多值字段?从那里,您可以使用我上面提供的示例开始回答您的问题。
根据您的新信息:
你有:
Table : Student
Fields : StudentID, Student Name, Department
Table : Course
Fields : CourseCode, Course Name, Year, Semester
Table: TableGrade
Fields : StudentID, CourseID, Grade
如果我们按照你想要的那样操作TableGrade而没有课程(或稍后会看到课程提供),那么我们需要在Course表中再添加一个字段以匹配你的TableGrade表或更改一个字段你的TableGrade:
如果您只想改变课程表,那就是这样:
Table: Course
Fields: CourseID, CourseCode, Course Name, Year, Semester
如果你想改变TableGrade,那就是这样:
Table: TableGrade
Fields: StudentID, CourseCode, Grade
但是,如果您查看课程表,则会出现问题。 假设你有原始的那个:
CourseCode, Course Name, Year, Semester
如果仔细观察,课程名称会不必要地重复 这实际上违反了1NF,也就是说,没有重复的群体。在这 case CourseCode和课程名称不必要地重复。
如果您使用也观察我提到的建议更改,它仍然会有问题:
CourseID, CourseCode, Course Name, Year, Semester
在这种情况下,它违反了3NF,没有说明瞬态依赖。在这种情况下 课程名称取决于CourseCode,而不是作为主键的CourseID。
另一件事是我们知道课程有部分,所以你至少会有
CourseCode, Course Name, Section, Year, Semester
所以,这就是为什么有一个课程或更多的课程更有意义 适当地提供课程,然后添加另一个表名称课程作为参考表。
因此,新架构将如下:
Table : Student
Fields : StudentID, Student Name, Department
Table : CoursesOffered
Fields : CourseID, CourseCode, Section, Year, Semester
Table: Courses
Fields : CourseCode, Course Name
Table: TableGrade
Fields : StudentID, CourseID, Grade
这个对你有意义吗?