Правильна ли эта структура базы данных или есть лучший способ?

#php #mysql #database

#php #mysql #База данных

Вопрос:

У меня есть три таблицы: Student, StudentClass и Class table. В таблице Student отображается информация о студентах, в таблице class отображаются классы, которые проводятся в университете, а таблица StudentClass связывает студентов с их классами. Проблема в том, что если я создаю запрос, я получаю повторяющиеся строки в запросе, если я объединяю все три таблицы. Итак, мой вопрос заключается в том, правильно ли я создаю подобную базу данных для учащихся и классов с этими тремя таблицами или есть более эффективный и лучший способ сделать это. Есть и другие таблицы, но я хочу, чтобы вы просто сосредоточились на этих трех таблицах. Спасибо

Ниже приведены таблицы:

 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)."')
  

Комментарии:

1. Отправьте запрос; это поможет.

2. Используете ли вы первичные ключи, которые видны в реальном мире? Например, возможно ли, что другой класс будет иметь идентификатор 101 в следующем году?

3. Извините, забыл нажать ctrl и K для запроса

4. Учитель может отредактировать класс 101 на следующий год, если, скажем, в другой день следующего года, но в то же время и с тем же учителем, например.

5. В вашем запросе намного больше трех таблиц. Я бы подумал о том, что вы делаете более тщательно.

Ответ №1:

Ваша схема выглядит нормально, но ваш запрос намного сложнее, чем необходимо. Попробуйте следующее:

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

Внутренние соединения неявны в этом запросе; он должен дать вам четыре строки, соответствующие строкам в StudentClass . Обратите внимание, что вы увидите Маюра Пателя дважды: один раз в CHI2550 в четверг и один раз в CHT2520 в понедельник.

Если вам нужна другая фильтрация на основе полей формы, это будут просто дополнительные and предложения.

Ответ №2:

Ваш запрос будет выглядеть примерно так:

 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
  

Комментарии:

1. Хорошо, тогда спасибо за запрос, но подходят ли таблицы для базы данных учащихся / классов? Если это так, я могу продолжить работу с этими тремя таблицами, если нет, то при необходимости я внесу незначительные изменения

2. Как указывалось ранее, это классическая схема «многие ко многим». В этих таблицах нет ничего плохого, но есть проблема с отправленным вами запросом. Ваши цели не ясны.