簡體   English   中英

此數據庫結構正確還是有更好的方法?

[英]Is this database structure correct or is there a better way?

我有三個表,Student,StudentClass和Class表。 學生表顯示學生信息,班級表顯示大學中正在進行的課程,而學生班級表將學生鏈接到他們的教室。 問題是,如果我創建一個查詢,如果我同時連接所有三個表,則會在查詢中得到重復的行。 所以我的問題是,我是否應該使用這三個表來創建像這樣的學生和教室數據庫,還是有一種更有效,更好的方法來做到這一點? 還有其他表格,但我希望您僅關注這三個表格。 謝謝

下表是:

Student Table:


StudentId(PK) StudentForename     StudentSurname    Year   StudentUsername    CourseId(FK) 
S1            Mayur                  Patel            3       u0867587          INFO101
S2            Jim                    Carlton          3       u1231231          INFO101
S3            Ahmed                  Seedat           3       u0660663          INFO101
S4            Amar                   Barot            3       u0954857          INFO101
S5            Richard                Davies           3       u0877223          INFO101

StudentClass Table:

ClassId(PK)  StudentId(PK)
101        S1
102        S3
103        S1
104        S2


    Class Table:

ClassId(PK)    Room      ClassDay      ClassTime      ModuleId(FK)      CourseId(FK)      TeacherId(FK) 
101          CW4/10     Thursday        10:00:00      CHI2550          INFO101             T1
102          CW5/01     Wednesday       12:00:00      CHI2565          INFO101             T5   
103          CW2/04     Monday          15:00:00      CHT2520          INFO101             T2
104          CW4/10     Thursday        11:00:00      CHI2550          INFO101             T1

在下面查詢:(在哪里從表格中簡單查找在文本框中輸入的數據)

SELECT * FROM Module m
            INNER JOIN Class cl ON m.ModuleId = cl.ModuleId 
            JOIN Teacher t ON cl.TeacherId = t.TeacherId 
            JOIN Session s ON m.ModuleId = s.ModuleId
            JOIN Grade_Report gr ON s.SessionId = gr.SessionId
            JOIN Student st ON gr.StudentId = st.StudentId
            JOIN Course c ON st.CourseId = c.CourseId
          WHERE
            ('".mysql_real_escape_string($sessionid)."' = '' OR gr.SessionId = '".mysql_real_escape_string($sessionid)."')
          AND
            ('".mysql_real_escape_string($moduleid)."' = '' OR s.ModuleId = '".mysql_real_escape_string($moduleid)."')
          AND
            ('".mysql_real_escape_string($courseid)."' = '' OR c.CourseId = '".mysql_real_escape_string($courseid)."')
          AND
            ('".mysql_real_escape_string($classid)."' = '' OR cl.ClassId = '".mysql_real_escape_string($classid)."')
          AND
            ('".mysql_real_escape_string($teacherid)."' = '' OR t.TeacherUsername = '".mysql_real_escape_string($teacherid)."')
          AND
            ('".mysql_real_escape_string($studentid)."' = '' OR st.StudentUsername = '".mysql_real_escape_string($studentid)."')
          AND
            ('".mysql_real_escape_string($year)."' = '' OR st.Year = '".mysql_real_escape_string($year)."')
          AND
            ('".mysql_real_escape_string($grade)."' = '' OR gr.Grade = '".mysql_real_escape_string($grade)."')

您的架構看起來不錯,但是查詢比必要的要復雜得多。 請嘗試以下操作:

select *
from Student s, Class c, StudentClass sc
where s.StudentId = sc.StudentId
and c.ClassId = sc.ClassId

內部聯接在此查詢中是隱式的; 它應該給你四行對應於StudentClass的行。 請注意,您將兩次看到Mayur Patel:一次是在周四的CHI2550中,一次是在星期一的CHT2520中。

如果要基於表單字段進行其他過濾,則這些過濾器將是多余的and子句。

您的查詢將如下所示:

select *
from Student as s
left join 
StudentClass as sc
on 
s.StudentId = sc.StudentId
right join 
Class as c
on
sc.ClassId = c.ClassId

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM