Как я могу сделать эту схему базы данных лучше? - PullRequest
0 голосов
/ 20 марта 2012

В настоящее время у меня есть две таблицы, в которых хранится посещаемость курса студентом. У меня есть таблица hub_attendance, в которой хранится общая посещаемость учащегося, и hub_attendance_lesson, где хранится посещаемость каждого урока, который ученик посещал или не посещал. Я не уверен, что это правильно или я делаю что-то не так, я новичок в базах данных!

hub_attendance:
id
student_id
course_id
total_lessons
total_lessons_so_far
total_attended
total_absent
total_excused_absent
total_late
total_excused_late

hub_attendance_lesson:
id
lesson_id
course_id
student_id
date
attended
absent
excused_absent
late
excused_late

EDIT:

Итак, я полностью избавился от первого стола, и это мой новый одиночный стол.

Hub_Attendance:
id
lesson_id
course_id
student_id
date
attendance

Ответы [ 4 ]

3 голосов
/ 20 марта 2012

Как сказал Dutchie432, вам не нужна первая таблица, потому что она вносит ненужную избыточность, и вы можете считать эту статистику на лету. Такие сводные таблицы могут быть хорошим решением, если производительность является проблемой, но их следует использовать только в качестве крайней меры.

О второй таблице - у вас есть отдельные поля attended, absent, excused_absent, late и excused_late. Разве это не взаимоисключающие? То есть только один из них может быть правдой для одного ряда? Если это так, вам может быть лучше использовать одно поле перечисления, например, attendance, которое будет принимать разные значения для каждого из этих состояний. Таким образом, вы не можете иметь строки, в которых не установлен ни один из флагов или более одного флага.

1 голос
/ 20 марта 2012

Вот что вам нужно:

**Course**
id, name, etc...

**Lesson**
id, courseid, name, etc...

**Attendance**
id, studentid, lessonid, lateness, etc...

**Enrolment**
id, courseid, studentid, startdate, etc...

Вам нужен регистрационный стол, чтобы знать, что студенты должны быть на курсе, даже если они никогда не приходят на уроки.Таблица посещаемости позволит вам иметь много учеников на урок и много уроков на каждого учащегося.Это таблица «многие ко многим» .Любое агрегирование и подсчет могут быть выполнены в SQL.

0 голосов
/ 20 марта 2012

Удалите эту первую таблицу, каждый итог можно получить с помощью SQL:

SELECT count(id) AS absent
FROM hub_attendance_lesson 
WHERE lesson_id = <your lesson id>
AND absent = <false / true>

Полагаю, вы сможете адаптировать этот код для своих нужд.

0 голосов
/ 20 марта 2012

Если я правильно понимаю вашу схему, ваша первая таблица может быть полностью исключена. Вы должны быть в состоянии получить итоги, используя MySQL.

select count(id) as total_late from hub_attendance_lesson where late=true and student_id=TheUserId 
...