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)