0

我正在设计一个大学管理系统。我有5个表格:学生,教师,课程,可用课程和采取课程。数据库设计。多对多。什么应该是主键?

Student: 
    student_id (PK) 

Teacher: 
    teacher_id (PK) 

Courses: 
    courses_id (PK) 

Available_Courses: 
    available_courses_id 
    teacher_id 
    course_id 

Courses_Taken: 
    courses_taken_id 
    student_id 
    courses_available_id 

可用课程和课程中应该PK什么?

如果我没有让Available_courses_id(在Table Available_Courses中)主键,那么我将无法连接Courses_Table,如果我在表Available_Courses中创建了所有三个属性的复合键,那么一个教师可以再次注册同一个课程,再次。制作两个属性(即teacher_id和course_id)的组合键将起作用,但会增加数据库中的重复次数,因为它们都将位于Courses_Taken表中以创建关系。

与Courses_Taken表相同,因为我需要在表中使用它的PK出席(尚未完成)。

那么在这种情况下应该怎么做?

+0

看起来像available_courses包含行,老师教课程的行。人们会认为可用的课程将是该表中某些行出现的课程。不是说你的问题如何定义你的表,你只需要告诉我们约束条件。 (CK,FD,FK)。 – philipxy

回答

0

没有必要在available_coursescourses_taken表人工键,只需要使用两个外键的组合作为主键:

student 
    id   int unsigned(P) 

teacher 
    id   int unsigned(P) 

course 
    id   int unsigned(P) 

available_courses 
    teacher_id int unsigned (F teacher.id)--\__(P) 
    course_id int unsigned (F course.id)---/ 

courses_taken 
    student_id int unsigned (F student.id)--\__(P) 
    course_id int unsigned (F course.id)---/ 
+0

我知道没有必要,但可以说我们需要添加另一个名为Exam_Results的表格,我们如何将其集成到此设计中。 据我所知,我们需要在名为Exam_Results的新表中重复student.id,teacher.id和course.id。 除了重复之外,还有其他解决方法吗? –

+0

@AzeemUllah重复他们没有什么*错误*。否则,你在*完全相同的地方重复* id *。冗余不是关于数据出现两次,而是*两次说同样的事情*。 – philipxy

0

一个CK(候选键)是一组列在不包含较小的唯一列集的表中是唯一的。一个CK可以调用PK(主键)。

哪些列集是唯一的取决于表中的行对您的应用程序情况所说的内容以及可能出现的应用程序情况。

查询与“连接表”(无论是什么意思)或CK或FK(外键)无关。一个查询会询问哪些行可以根据应用程序情况以及关系和逻辑运算符如何组合它们所基于的表行构建的应用程序情况,生成真实的声明。

如果列形成CK或FK(即列的某些列的值总是作为特定CK的子值出现),那么我们告诉DBMS,以便它可以执行该操作。这不影响查询组成。

没有什么错误本身与重复值。冗余不是关于数据出现两次,而是两次说同样的事情。不需要引入id列而不是自然键。那只是重复编号值在完全一样的地方

假设你使用的ID,available_courses有中正{} available_courses_id {& teacher_id,COURSE_ID}和courses_taken具有中正{} courses_taken_id {& student_id数据,courses_available_id}。 (虽然你不需要ID)