1

私には4学期の学生がいますが、各科目の出席が心配です。異なる学期の学生はバッチにグループ化されます。各バッチには、36のサブジェクトからサブジェクトを選択するオプションがあります。

最初に、テーブルを作成しました。このテーブルにはsubject、4つのバッチのすべてのサブジェクトとサブジェクトコードがリストされています。別のテーブルstudentがありstudentid、6つの列があり、学生が選択したサブジェクトコードが含まれています。参加することで、生徒がどの科目を選んだかを知ることができます。

今では、毎日の出席をきれいに保存する方法がわかりません。365日と1500人以上の学生のデータを保存する必要があるので、方法を提案してください。(一部のバッチでは、日曜日は休日ではありません)。

出席記録をデータベースに保存するなど、関連するトピックはほとんど見つかりませんでしたが、解決策が見つかりませんでした。

4

2 に答える 2

3

私は次のようなものを持っています:

Subjects( SubjectId PK, Name, etc... )
Classes( ClassId PK, SubjectId, DateTime periodBegin, etc... )
Students( StudentId PK, Name, etc... )
StudentAttendance( StudentId PK, ClassId PK )

Subjectsには各科目のレコードがClasses含まれており、学校の予定表で予定されている各クラスのレコードが含まれています。テーブルには、実際のクラス アセンブリを入力する必要があります。Classesクラス アセンブリが行われるたびに追加するか、学年の開始時にまとめて追加することができます。このStudents表は一目瞭然で、StudentAttendanceどの学生が特定のクラスに積極的に出席したかを示しています。

のようなテーブルが悪い設計だとは思わないでください。StudentAttendanceこれは、多対多結合テーブルの標準的な例です。結合テーブルに数十億の行があるデータベースを目にすることは珍しくありませんが、2 つのキー値 (おそらく int32 または int64) しか含まれていないため、ディスク上のスペースをあまり使用しません。

特定のクラスに出席しなかった学生を検索するクエリを次に示します。

SELECT
    Name
FROM
    Students
WHERE
    StudentId NOT IN (
        SELECT
            StudentId
        FROM
            StudentAttendance
            INNER JOIN Classes ON StudentAttendance.ClassId = Classes.ClassId
        WHERE
            StudentAttendance.ClassId = @classId
    )

特定の科目に出席した各学生の出席数を取得するクエリを次に示します。これを ( ) で割るSELECT Count(*) FROM Clases WHERE Classes.SubjectId = @subjectと、各生徒の出席率が得られます。生徒が (故意に、または登録されていないために) どのクラスにも出席しなかった場合、その生徒はリストに表示されません。

SELECT
    Students.Name
    COUNT(*) As AttendanceCount
FROM
    StudentAttendance
    INNER JOIN Classes ON Classes.ClassId = StudentAttendance.ClassId
    INNER JOIN Students ON Students.StudentId = StudentAttendance.StudentId
GROUP BY
    StudentId
WHERE
    Classes.SubjectId = @subjectId
于 2013-02-24T08:55:41.390 に答える
0

学生と科目の両方、および日付フィールドへの外部キーを持つ結合テーブルを作成し、特定の日付に特定のクラスに出席する各学生の行を保存します。適切なインデックスを作成すれば、パフォーマンスは許容できるはずです。

于 2013-02-24T08:50:06.210 に答える