Ранее я задавал вопрос о система посещаемости. В той же системе у меня также есть отдельная таблица для хранения оценок учеников. Теперь перед моим вопросом я хотел бы показать, что я сделал до сих пор:
В каждом семестре есть 2 работы. Есть 6 семестров, чтобы закончить курс. В первой статье студент может иметь максимальные оценки 75, а во второй — оценки 25. Теперь я построил простую таблицу students_marks
следующее:
Name | Type
------------|-------
marks_id | int
s_id | int
sem_id | int
sessionYear | varchar(11)
paper_one | decimal(11,0)
paper_two | decimal(11,0)
Сейчас, marks_id
это primary key
, в то время как s_id
а также sem_id
являются foreign keys
к двум другим столам student_info
а также semester
,
Чтобы вывести полученные оценки, я бы сделал это:
SELECT * FROM `student_marks`
JOIN `student_info` ON student_marks.s_id = student_info.s_id
WHERE student_info.deleted = ?
AND `sem_id` = ? AND `sessionYear` = ?
ORDER BY `class_roll`
Чего я не осознавал, так это того, что в 5-м и 6-м семестре есть 4 статьи, каждая из которых имеет максимальные отметки 50. Теперь, если я добавлю еще два столбца в таблицу выше, это будет избыточно для других семестров, где мне не нужно есть 4 статьи.
Я ищу помощи, чтобы изменить дизайн этой таблицы, чтобы я мог включить новые статьи.
Заранее спасибо.
Примечание: я использую базу данных MySQL и PHP для создания этого приложения.
Я бы использовал более нормализованную форму:
create table student (id int, -- pk this one
studentinfo ... )-- all the student info
create table attendance (studentid int, -- fk to student
semesterid int)create table paper (studentid INT, --fk to student table
selemsterid int, -- fk to attendance table
paperid INT, -- one for each paper
paperdate date, -- allows retakes
papermark decimal(11,0) ) -- Store the marks
select s.*, p.*
from student s
inner join attendance a
on a.studentid = s.id
inner join paper p
on p.studentid = s.id
and p.semesterid = s.semesterid
В вашем students_marks
таблица у вас есть столбцы sem_id
а также sessionYear
, Я предполагаю, что вы можете узнать год от sem_id
, Итак sessionYear
колонка не нужна. Убери это.
Теперь вы можете иметь только один столбец paper_grade
и введите каждую статью в отдельный ряд.
Name | Type
------------|-------
mark_id | int
student_id | int
semester_id | int
paper_grade | int
Не беспокойтесь о том, что идентификаторы повторяются для каждой строки — до тех пор, пока между ними нет зависимостей, все в порядке.
Я бы также предложил изменить decimal(11,0)
в int
,