2012-03-20 12 views
0

私は現在、コースに学生の出席を格納する2つのテーブルを持っています。私は、生徒の総出席を記憶する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

1回の出席には複数のレッスンが含まれていますか?データベース設計では、ユニークなデータレコードが何であるか、およびそれらの間の関係について検討しています。あなたが単一の学生コースの登録をしている場合、それは様々なコンポーネントレッスンで多くの出席者を持つでしょう、これは、包括的な登録がなく、あなたが数える必要がある出席がたくさんあることとは異なります。違いは、それ以外の場合は出席テーブルに繰り返される登録に関するデータを保存する必要があるかどうかです。登録開始日。 –

答えて

3

Dutchie432によれば、不要な冗長性が導入され、その統計を即座に数えることができるため、最初のテーブルは不要です。このような集計表は、パフォーマンスが問題であれば良い解決策になりますが、最後の手段としてのみ使用する必要があります。第二のテーブルについて

- あなたが別のフィールドattendedabsentexcused_absentlateexcused_lateを持っています。これらは相互に排他的ではありませんか?だから1行につき1つしか真実ではありませんか?その場合は、たとえばattendanceという1つの列挙フィールドを使用するほうが良いでしょう。これらのフィールドは、それぞれの状態ごとに異なる値をとります。このようにして、フラグや複数のフラグが設定されていない行を持つことはできません。ここで

+0

ねえ、ありがとう!出席はvarcharかENUMですか?何が良いか、それとも重要ではないでしょうか? –

+1

ENUMは、指定された正しい値に属さない値を挿入しないように、VARCHARより優れています。データベースが非常に大きい場合は、異なる状態の定数で、TINYINTとして出席を格納検討することもでき - 例えば、ABSENT = 0は、などを= 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... 

あなたは学生が授業のために上げたことがない場合でも、コース上でなければならないことを知っている登録テーブルを必要としています。出席テーブルは、1レッスンにつき1人の学生が多く、1レッスンは1レッスンになります。これはmany-to-many tableです。集計と集計はSQLで行うことができます。

+0

乾杯。申し訳ありませんが、私はとてもうまく説明しません。しかし、私は現在Moodleを使っています(学習管理システムです)。すでにコースとレッスンテーブルがあり、そこからデータを取得して、その部分が既に私のためにソートされています。また、私は彼らがMoodleシステムに作成しようとしている私のメインテーブルが出席ですので、彼らがそのコースの学生であることを確認することができる役割の割り当てテーブルがあります。 –

+0

あなたは思うかもしれません:)出発点としてチェックアウトしたいかもしれない出席モジュールまたは2つがすでにあります。プラグインディレクトリを確認してください:http://moodle.org/plugins/search.php?s=attendance –

+0

ああ、あなたはMoodleを使いますか? 私たちのシステムは、バージョン1.9を使用しているし、我々はそれが私たちのニーズ:) –

関連する問題