質問
オンラインレポートカードの学生の成績を格納するテーブルを定義しようとしています。ただし、その方法を決めることはできません。
評点は、被験者ごとに、三半期で与えられます。すべての学期には、平均評点、欠席した合計クラス、および「回復評点」があります。 (英語の正しい用語はわかりませんが、平均を下回っている場合は成績を上げようとする余分なテストです)、年間平均と最終的な「成績の回復」も保存する必要があります。基本的には次のようなものです:
|1st Trimester |2nd Trimester |3rd Trimester
Subj. |Avg. |Mis. |Rec |Avg. |Mis. |Rec |Avg. |Mis. |Rec |Year Avg. |Final Rec.
Math |5.33 |1 |4 |8.0 |0 |7.0 |2 |6.5 |7.0
Sci. |5.33 |1 |4 |8.0 |0 |7.0 |2 |6.5 |7.0
この情報を単一のDB行に格納できます。各行は次のようになります。
1tAverage | 1tMissedClasses | 1tRecoveringGrade | 2tAverage | 2tMissedClasses | 2tRecoveringGrade
など。しかし、学期やその他の期間(3年前までだったように)で成績を評価することを決めた場合、これは人間にとって苦痛だと思いました。
また、テーブルフィールドを一般化して、それらの学期がどの学期であるか、またはそれらが年間の決勝であるかどうかにフラグを立てるためにtinyintを使用することもできます。
しかし、これはレポートカードを作成するために多くのサブクエリを要求し、管理するのも苦労します。
2つのうちどちらが良いですか、または他の方法がありますか? ありがとう
解決
テーブルでこのように構造化してみてください。私はすべての情報を持っていなかったので、あなたが何を必要とするか、またはそれで何をするかについていくつかの推測をしました。
TimePeriods:
- ID(INT)
- PeriodTimeStart(DateTime)
- PeriodTimeEnd(DateTime)
- 名前(VARCHAR(50)
学生:
- ID(INT)
- FirstName(VARCHAR(60))
- LastName(VARCHAR(60))
- 誕生日(DateTime)
- [その他の関連する学生フィールド 追加された情報...連絡先のような 情報など]
グレーディング:
- ID(INT)
- StudentID(INT)
- GradeValue(float)
- TimePeriodID(INT)
- IsRecoveringGrade(boolean)
MissedClasses:
- ID(INT)
- StudentID(INT)
- ClassID(INT)
- TimePeriodID(INT)
- DateMissed(DateTime)
クラス:
- ID(INT)
- ClassName(VARCHAR(50))
- ClassDescription(TEXT)
他のヒント
最善の解決策は、期間ごとに1行を保存することだと思います。したがって、次のようなテーブルが作成されます。
grades
------
studentID
periodNumber
averageGrade
missedClasses
recoveringGrade
したがって、2学期であれば、期間1と2があります。期間0を使用して、「年間全体」を意味することをお勧めします。
学期を表す2番目のテーブルを作成し、成績テーブルから学期への外部キー参照を作成する(および成績テーブルに個々の成績を保存する)方が適切です。次に、SQL関数SUMおよびAVGを使用して、平均値、見逃したクラスなどを実行します。
(しかし、真剣に、少なすぎず、多すぎるテーブルの側でエラー。Handruinは私がこれまでに見た最高の解決策を持っています)。