it-swarm.com.de

Datenbankdesign zur Verfolgung der Anwesenheit von Schülern

Ich hatte Zweifel an der Gestaltung einer Datenbanktabelle, um die Anwesenheit der Schüler zu verfolgen. Derzeit hat meine Tabelle students mindestens 4000 Studenten.

Das Erstellen einer Datenbank für die Anwesenheit zur Verfolgung ihrer Anwesenheit hat fast 4000*30days*12months => ~ 1,400,000 Zeilen (Urlaub/Sonntag vernachlässigen).

Die Anwesenheitstabelle hat:

id (INT)
student_id (INT) 
course_id (INT)
data (DATETIME)
present/absent (TINYINT, as I'll store 1/0)
comments

Ich benutze PHP/MySql. Gibt es einen anderen Weg, wenn ein Tisch so groß wird?

6
xan

Um die Alternative zu @Twinkles näher zu erläutern, mache ich mir Sorgen darüber, warum Sie anwesende und abwesende Schüler in Ihren Anwesenheitsdaten speichern. Liegt es daran, dass Sie einen Bericht erstellen möchten, in dem alle Kinder angezeigt werden und ob sie an einem bestimmten Tag abwesend waren? Es gibt einen besseren Weg, es zu tun.

Die meisten Systeme, die ich gesehen habe, speichern entweder die Anwesenheit des Schülers (positive Anwesenheit) oder die Abwesenheit des Schülers (negative Anwesenheit, obwohl selten mit diesem Namen bezeichnet). Die Entscheidung über die Verwendung hing von der Struktur und den Berichtspflichten der Schule ab (und wem auch immer sie Bericht erstatten).

Wenn Ihre Schule Bedenken hat, wenn der Schüler aus Gründen wie der Verfolgung von Truant-Schülern abwesend ist, sollten Sie eine Standardstruktur (negativ) verwenden. Die meisten K-12-Schulen in den USA machen das so.

Wenn Ihre Schule nur für Kurse angerechnet wird, nachdem eine überprüfte Anzahl von Stunden abgeschlossen wurde (z. B. Johnny besteht den Kurs erst, wenn er seine Kursarbeit abgeschlossen und 12 Sitzungen der Klasse besucht hat), dann Eine positive Anwesenheitsstruktur könnte verwendet werden.

Angenommen, Ihre Daten sehen folgendermaßen aus: (Der Einfachheit halber wird in Ihrem Beispiel die Course_id ignoriert.)

Attendance: 
id | student_id | date       | 
------------------------------
1  | 2          | 2013-10-24 | 

Students:
student_id | student_name   | 
-----------------------------
1          | Johnny Johnson |
2          | Bobby Tables   |
3          | Suzie Smith    |

Um einen Bericht über alle Kinder an Ihrer Schule und ihren Besuchsstatus für diesen Tag zu erhalten, können Sie eine Abfrage ausführen wie:

SELECT s.student_id, s.student_name
,  CASE WHEN a.id IS NOT NULL THEN 'Absent' ELSE 'Present' END as attendance_status
FROM Students s
LEFT JOIN Attendance a on s.student_id=a.student_id AND a.date = '2013-10-24'

Welches würde zurückkehren:

Result :
student_id | student_name   | attendance_status |
-------------------------------------------------
1          | Johnny Johnson | Present           |
2          | Bobby Tables   | Absent            |
3          | Suzie Smith    | Present           |
7
Core.B

Sie werden sehr wahrscheinlich einen Index über ID , student_ID und Anwesenheit definieren. Da diese drei Werte durch 9 Byte dargestellt werden, ist der gesamte Index weniger als 20 MB groß und passt vollständig in Ihren Speicher. Ich würde mir darüber keine Sorgen machen.

Alternative: Sie können nur eine Zeile für jeden Schüler speichern, der die Vorlesung verpasst hat.

2
Twinkles

Es klingt nach einem guten Fall für die Archivierung oder Verringerung der Granularität. Ich vermute, dass die genauen Daten mit der Zeit weniger relevant werden. Meine persönliche Präferenz wäre es, drei Granularitätsstufen zu haben: täglich, wöchentlich und jährlich. Nachdem die Daten älter als eine Woche sind, fassen Sie sie wöchentlich zusammen. Nachdem es über ein Jahr alt ist, fassen Sie es zu jährlich zusammen. Ich hätte auch monatlich gesagt, aber die Zuordnung von Woche zu Monat ist nicht genau.

0
David Cummins