我使用助记设备作为前三种常规形式.我用RePeaT这个词忽略了元音.首先是没有重复组或多值字段,第二是没有对主键的部分依赖,最后没有Transitory依赖.
在你的情况下,它看起来像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
Run Code Online (Sandbox Code Playgroud)
如果我们按照你想要的那样使用TableGrade没有课程(或者你将在后面看到的课程),那么我们需要在你的课程表中再添加一个字段以匹配你的TableGrade表或更改你的TableGrade的一个字段:
如果您只想更改课程表,它将是这样的:
Table: Course
Fields: CourseID, CourseCode, Course Name, Year, Semester
Run Code Online (Sandbox Code Playgroud)
如果你想改变TableGrade,它将是这样的:
Table: TableGrade
Fields: StudentID, CourseCode, Grade
Run Code Online (Sandbox Code Playgroud)
但是,如果您查看课程表,则会出现问题.假设你有原始的:
CourseCode, Course Name, Year, Semester
Run Code Online (Sandbox Code Playgroud)
仔细看看这个课程名称会不必要地重复,这实际上违反了1NF,即没有重复的小组.在这种情况下,CourseCode和课程名称不必要地重复.
如果您使用也观察我提到的建议更改它仍然会有问题:
CourseID, CourseCode, Course Name, Year, Semester
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它违反了没有瞬态依赖的3NF.在这种情况下,课程名称取决于CourseCode,而不是作为主键的CourseID.
另一件事是我们知道课程有部分,所以你至少会有
CourseCode, Course Name, Section, Year, Semester
Run Code Online (Sandbox Code Playgroud)
因此,这就是为什么让课程采取或实际上更合适的课程提供更有意义,然后添加另一个表名称课程作为参考表.
所以,新架构将是:
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
Run Code Online (Sandbox Code Playgroud)
这个对你有意义吗?