Хорошие друзья. Я работаю над приложением Laravel, которое похоже на систему управления студентами для школ в моей стране. Приложение требует, чтобы я хранил десятки студентов, а также создавал отчеты за период или семестр, которые студент достиг этого балла.
В моей стране обычно в течение учебного года шесть (6) периодов. Период составляет 4 недели. Также в учебном году есть два (2) семестра, продолжительность которых составляет 3 с половиной месяца. В каждом семестре есть четыре (4) термина.
Вот картина, которая объясняет, как выглядят вещи:
Поскольку я должен генерировать отчет каждого ученика за определенный период семестра, так выглядит моя концептуальная модель:
Стол учеников:
students -------- id * name grade_id (fk)
Таблица предметов:
subjects -------- id * name
Таблица классов:
grades -------- id * name
Примечание. Таблица классов хранит имя каждого класса в школе. ех. grade 12
, grade 11
и т. д.
Теперь это таблицы, в которых хранятся оценки учащихся для предметов определенного периода или семестра.
period_one (1st Period) ----------------------- id * student_id (fk) subject_id (fk) grade_id (fk) score first_exam (1st Sem. Exam) ----------------------- id * student_id (fk) subject_id (fk) grade_id (fk) score period_four (4th Period) ----------------------- id * student_id (fk) subject_id (fk) grade_id (fk) score
Обратите внимание, то же самое верно для second period
, third period
, 5th period
, six period
т. Д.
К этому времени я знаю, что кто-то видел что-то подозрительное или неумное. Я повторяю одни и те же столбцы в каждой таблице, и я считаю, что это можно сделать лучше.
Но есть причина, почему я сделал это таким образом, и это связано с созданием отчетов. С помощью этой настройки я могу легко структурировать свои запросы для создания отчетов.
Это запрос, который я использовал для создания периодических отчетов
// the function runs a select all query for all the period/term grades tables // It displays the periodic grades sheet $student_id = 1; // any id could be passed $term = "period_one"; // giving the exact table name to fetch record from $class_id = 2; // 2 may represent grade 12 in this case. function periodic_report($term, $student_id, $class_id) { global $connection; $query = "SELECT $table.student_id, score, subject_name, class_name from $term INNER JOIN students ON students.student_id = $table.student_id INNER JOIN classes ON classes.class_id = $table.class_id INNER JOIN subjects ON subjects.subject_id = $table.subject_id WHERE $table.student_id = $student_id AND $table.class_id = $class_id"; $result_set = mysqli_query($connection, $query); // Test if there was a query/syntax error confirm_query($result_set); return $result_set; }
вот как выглядит результат:
Запрос для генерации отчетов первого семестра:
// the function runs a select all query for semester grades // It displays the first semester grades sheet function first_semester_report($student_id) { global $connection; $query = "SELECT subjects.subject_name, period_one.score, period_two.score, period_three.score, first_exam.score FROM subjects LEFT JOIN period_one ON period_one.subject_id = subjects.subject_id AND period_one.student_id = {$student_id} LEFT JOIN period_two ON period_two.subject_id = subjects.subject_id AND period_two.student_id = {$student_id} LEFT JOIN period_three ON period_three.subject_id = subjects.subject_id AND period_three.student_id = {$student_id} LEFT JOIN first_exam ON first_exam.subject_id = subjects.subject_id AND first_exam.student_id = {$student_id} LEFT JOIN students ON students.student_id = {$student_id} WHERE period_one.subject_id = subjects.subject_id OR period_two.subject_id = subjects.subject_id OR period_three.subject_id = subjects.subject_id OR first_exam.subject_id = subjects.subject_id ORDER BY subjects.subject_name"; $result_set = mysqli_query($connection, $query); if(!$result_set){ die("Database query failed. Error from first semester report: ".mysqli_error($connection)." Error number is: ".mysqli_errno($connection)); } // Test if there was a query/syntax error //confirm_query($result_set); return $result_set; }
Запрос для генерации отчета второго семестра:
// the function runs a select all query for semester grades // It displays the second semester grades sheet function second_semester_report($student_id) { global $connection; $query = "SELECT subjects.subject_name, period_four.score, period_five.score, period_six.score, second_exam.score FROM subjects LEFT JOIN period_four ON period_four.subject_id = subjects.subject_id AND period_four.student_id = {$student_id} LEFT JOIN period_five ON period_five.subject_id = subjects.subject_id AND period_five.student_id = {$student_id} LEFT JOIN period_six ON period_six.subject_id = subjects.subject_id AND period_six.student_id = {$student_id} LEFT JOIN second_exam ON second_exam.subject_id = subjects.subject_id AND second_exam.student_id = {$student_id} LEFT JOIN students ON students.student_id = {$student_id} WHERE period_four.subject_id = subjects.subject_id OR period_five.subject_id = subjects.subject_id OR period_six.subject_id = subjects.subject_id OR second_exam.subject_id = subjects.subject_id ORDER BY subjects.subject_name"; $result_set = mysqli_query($connection, $query); if(!$result_set){ die("Database query failed. Error from second semester report: ".mysqli_error($connection)." Error number is: ".mysqli_errno($connection)); } // Test if there was a query/syntax error //confirm_query($result_set); return $result_set; }
так выглядит отчет о семестре, основанный на запросе на семестр:
Время от времени я беспокоюсь, что это можно сделать лучше, но позор – это я не знаю, как это сделать.
Есть ли лучшие способы сделать это? Кроме того, только 70 процентов школ планируют свой учебный год в периоды, когда другие используют разные способы. Есть ли способ настроить это так, чтобы школы могли указывать периоды или термины в учебном году, а таблица создавалась для каждого периода или срока?
Поймите практические последствия и предложения. Благодаря!!!!