考虑一个基本的表模式:
StudentID, Student Name, Department, courseCode, Course Name, year-Semester, Grade
如何通过识别函数依赖将其转换为第二范式?
考虑一个基本的表模式:
StudentID, Student Name, Department, courseCode, Course Name, year-Semester, Grade
如何通过识别函数依赖将其转换为第二范式?
我对前三个范式使用助记符。我使用 RePeaT 这个词忽略了元音。首先是没有重复组或多值字段,其次没有对主键的部分依赖,最后没有临时依赖。
在您的情况下,它看起来像 1NF 问题而不是 2NF。2NF 表示部分依赖,查看您的表没有复合主键,即主键具有超过 1 个字段,因此不存在部分依赖的可能性。因此对于 1NF,有两种可能性,一种是重复组,另一种是多值字段。因此,具有重复组的 1NF 示例在此处,多值示例在此处。
如果您有表的实际记录/行并提出以下问题会更好:是否有任何重复组或是否有任何多值字段?从那里您可以使用我上面提供的示例开始回答您的问题。
根据您的新信息:
你有:
Table : Student
Fields : StudentID, Student Name, Department
Table : Course
Fields : CourseCode, Course Name, Year, Semester
Table: TableGrade
Fields : StudentID, CourseID, Grade
如果我们遵循您想要的,即 TableGrade 没有参加任何课程(或提供的课程,您将在稍后看到),那么我们需要在您的课程表中再添加一个字段以匹配您的 TableGrade 表或更改您的 TableGrade 的一个字段:
如果您只想更改课程表,它将是这样的:
Table: Course
Fields: CourseID, CourseCode, Course Name, Year, Semester
如果您只想更改 TableGrade,它将是这样的:
Table: TableGrade
Fields: StudentID, CourseCode, Grade
但是,如果您查看课程表,则会出现问题。假设你有原始的:
CourseCode, Course Name, Year, Semester
如果您仔细查看此课程名称会出现不必要的重复,这实际上违反了 1NF,即没有重复组。在这种情况下,CourseCode 和 Course Name 会不必要地重复。
如果您还使用我提到的建议更改,它仍然会有问题:
CourseID, CourseCode, Course Name, Year, Semester
在这种情况下,它违反了没有瞬态依赖的 3NF。在这种情况下,Course Name 取决于 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
这对你有意义吗?