Join

如何實現三個表之間的多對多關係?

  • December 23, 2016

我有這些桌子

學生資訊

 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)

學生、教授、學科之間存在多對多的關係。

那是

  1. 一個學生可以有許多科目可以註冊,並且可以由許多人教授
  2. 一個老師可以教很多學科和很多學生
  3. 一個學科可以被多個學生註冊,並且可以被多個老師教授

問題:

  1. 那個聯結表是正確的還是我應該有 2 個聯結表?
  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,成績,出勤率,…)

因此,您的所有查詢將主要發生在成績表上。從該表中,您可以從概念上接受以下假設:

  • 幾個老師可以教一個給定的學生並給他一個給定科目的成績
  • 一個老師可以教幾門課;因此他可以給學生評分
  • 一個學生可以註冊幾個科目;因此他可以從同一或不同科目的幾位老師那裡獲得成績

真的,真的簡化了這裡的建模……但我認為你不會得到冗餘。如果我錯了,請糾正我。

引用自:https://dba.stackexchange.com/questions/158586