Дизайн базы данных для студентов оценки за бумагу

Ранее я задавал вопрос о система посещаемости. В той же системе у меня также есть отдельная таблица для хранения оценок учеников. Теперь перед моим вопросом я хотел бы показать, что я сделал до сих пор:

В каждом семестре есть 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 для создания этого приложения.

0

Решение

Я бы использовал более нормализованную форму:

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
2

Другие решения

В вашем 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,

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector