Join
如何實現三個表之間的多對多關係?
我有這些桌子
學生資訊:
subjectId(primary key) name location
主題資訊:
subjectId(primary key) subjectName totalmarks
教師資訊:
teacherId(primary key) teacherName
成績:
studentId(foreign key from studentInfo) subjectId(foreign key from subjectInfo) marks attendence
接線表:
studentId(foreign key from studentInfo) subjectId(foreign key from subjectInfo) professorId(foreign key from professorInfo)
學生、教授、學科之間存在多對多的關係。
那是
- 一個學生可以有許多科目可以註冊,並且可以由許多人教授
- 一個老師可以教很多學科和很多學生
- 一個學科可以被多個學生註冊,並且可以被多個老師教授
問題:
- 那個聯結表是正確的還是我應該有 2 個聯結表?
- 根據卷號查找學生報告的 SQL 查詢是什麼?報告中的詳細資訊應為學科名稱、學科標記、學科、出席情況、教授該學科的教授姓名
我嘗試的查詢返回冗餘數據。
select teacherInfo.teacherName, grade.marks, grades.attendence, subjectinfo.subjectName from teacherinfo join junctiontable on junctiontable.teacherId = teacherInfo.teacherId join studentinfo on studentinfo.studentId = junction.studentId join grades on grades.studentId = studentinfo.studentId where studentinfo.studentId = 1;
一位老師可以在同一天多次教授同一堂課,多年也可以多次教授。學生可以重新上課。但是,一個老師一次只能教一堂課,一個學生一次只能上一堂課。我會添加類實例和類系統資料庫作為您的聯結表。您最初的嘗試與此相差不遠:
1.studentInfo studentId(primary key) name location 2.subjectInfo subjectId(primary key) subjectName totalmarks 3.teacherInfo teacherId(primary key) teacherName 4.classInstance classId(primary key) subjectId(foreign key from subjectInfo) teacherId(foreign key from teacherInfo) year, semester, time, building, room nr, etc 5.classEnrollment studentId(foreign key from studentInfo) classId(foreign key from classInstance) marks attendance
嗯,
我會以這種簡單的方式修改你的系統:
假設有幾位老師,教同一門課給一個給定的科目可以給他一個分數,你可能只有 4 個表:
- 學生(學生證PK,….)
- 老師(老師ID PK,….)
- 主題(主題ID PK,….)
- 成績((學生ID,教師ID,主題ID)PK,成績,出勤率,…)
因此,您的所有查詢將主要發生在成績表上。從該表中,您可以從概念上接受以下假設:
- 幾個老師可以教一個給定的學生並給他一個給定科目的成績
- 一個老師可以教幾門課;因此他可以給學生評分
- 一個學生可以註冊幾個科目;因此他可以從同一或不同科目的幾位老師那裡獲得成績
真的,真的簡化了這裡的建模……但我認為你不會得到冗餘。如果我錯了,請糾正我。