生徒の出席状況を追跡するためのデータベーステーブルの設計に疑問がありました。現在、私のテーブルstudents
には少なくとも4000
人の生徒がいます。
出席を追跡するための出席用のデータベースを作成すると、ほぼ4000*30days*12months => ~ 1,400,000
行になります(休暇/日曜日は無視されます)。
出席表には次のものが含まれます。
id (INT)
student_id (INT)
course_id (INT)
data (DATETIME)
present/absent (TINYINT, as I'll store 1/0)
comments
PHP/MySql
を使用しています。テーブルがとても大きくなったので、他に方法はありますか?
@Twinklesの代替案をさらに詳しく説明するために、出席データに現在の学生と不在の学生を保存する理由を心配しています。それは、すべての子供たちと、特定の日に欠席したかどうかを示すレポートを実行できるようにするためですか。それを行うためのより良い方法があります。
私が見たほとんどのシステムでは、学生が出席している(正の出席)か、学生が不在(負の出席ですが、その名前で呼ばれることはまれです)のいずれかが保存されます。どちらを使用するかの決定は、学校の構造と報告要件(および彼らが報告する誰でも)によって決まりました。
生徒が不在の生徒を追跡する必要があるなどの理由で欠席しているときに学校が心配な場合は、標準の(否定的な)出席構造を使用する必要があります。米国のほとんどの幼稚園から高等学校では、このようにしています。
確認された時間数が完了した後でコースのクレジットのみを授与する場合(例ジョニーは、コースワークを完了し、クラスの12セッションに参加するまでコースに合格しません)、積極的な出席構造を使用できます。
データが次のようになっていると仮定します:(簡単にするために、例ではコースIDを無視しています)
Attendance:
id | student_id | date |
------------------------------
1 | 2 | 2013-10-24 |
Students:
student_id | student_name |
-----------------------------
1 | Johnny Johnson |
2 | Bobby Tables |
3 | Suzie Smith |
学校のすべての子供とその日の出席状況のレポートを取得するには、次のようなクエリを実行します。
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'
どちらが返されますか:
Result :
student_id | student_name | attendance_status |
-------------------------------------------------
1 | Johnny Johnson | Present |
2 | Bobby Tables | Absent |
3 | Suzie Smith | Present |
おそらく[〜#〜] id [〜#〜]、student_IDおよびpresenceに対してインデックスを定義します。これらの3つの値は9バイトで表されるため、インデックス全体のサイズは20MB未満になり、メモリに完全に収まります。気にしない。
別の方法:講義を欠席したすべての学生の行のみを格納することを検討できます。
これは、アーカイブや粒度の低下に適したケースのように思えます。時間の経過とともに正確なデータの関連性が低くなると思います。私の個人的な好みは、毎日、毎週、毎年の3つのレベルの細分性を持つことです。データが1週間以上経過した後、週ごとに要約します。 1年以上経過したら、年に要約します。私も毎月言ったでしょうが、毎週のマッピングは正確ではありません。