2012-03-20 2 views
0

В настоящее время у меня есть две таблицы, в которых хранятся посещаемости учащегося в курсе. У меня есть таблица 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 
+0

Как вы определяете посещаемость? За урок или за группу уроков? Некоторые детали реальной ситуации, с которой вы столкнулись, сделают проблемы дизайна более ясными. –

+0

Эй, я не уверен, что вы подразумеваете под группой уроков? –

+0

Как и в одном посещении, есть несколько уроков? Дизайн базы данных посвящен разработке уникальных данных и взаимосвязей между ними. Если у вас есть один курс обучения в студенческом общеобразовательном учреждении, который затем будет иметь много занятий на различных уроках компонента, это отличается от того, что у вас нет всеобъемлющего набора, и у вас есть много занятий, которые вам нужно учитывать. Разница заключается в том, нужно ли хранить данные о зачислении, которые в противном случае будут повторяться в таблице посещаемости, например. дата начала регистрации. –

ответ

3

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

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

+0

Эй, спасибо! Итак, посещаемость должна быть varchar или ENUM? Что было бы лучше или это не имеет значения? –

+1

ENUM был бы лучше, чем VARCHAR, потому что он защитил бы вас от вставки значения, не принадлежащего указанным правильным значениям. Если ваша база данных очень большая, вы можете также рассмотреть возможность хранения посещаемости как TINYINT с константами для разных состояний - например, ABSENT = 0, ATTENDED = 1 и т. Д. Вероятно, это будет немного быстрее, если несколько удобочитаемый. – socha23

+0

Спасибо :) Мой новый стол очень маленький. –

0

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

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

очень верно! Спасибо =) –

0

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

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

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

1

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

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

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

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

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

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

+0

Cheers. Извините, я не очень хорошо объясняю. Но я использую Moodle прямо сейчас (это система управления обучением), и у нее уже есть таблица курса и урока, и именно там я беру эти данные, так что часть уже отсортирована для меня. В нем также есть таблица назначений ролей, где я могу проверить, являются ли они учащимися для этого курса, поэтому моя основная таблица, которую я пытаюсь создать в системе Moodle, - это посещаемость. –

+0

Думал, что вы можете быть :) Есть модуль посещаемости или два, которые уже существуют, что вы можете проверить в качестве отправной точки. Проверьте каталог плагинов: http://moodle.org/plugins/search.php?s=attendance –

+0

О, о, вы используете Moodle? Наша система использует версию 1.9, и мы просто строим простой с нуля, так что это соответствует нашим потребностям :) –

Смежные вопросы