質問: table名 学生情報 | 学籍番号 | パスワード | | --- | --- | | 1 | 1234 | | 2 | password | | 3 | taro | | 4 | imaharu | table名 単位数 | 学籍番号 | 総単位数 | | --- | --- | | 1 | 126 | | 2 | 130 | | 3 | 123 | | 4 | 119 | table名 GPA | 学籍番号 | GPA | | --- | --- | | 1 | 2.7 | | 2 | 3.2 | | 3 | 3.5 | | 4 | 1.5 | table名 成績評価 | 学籍番号 | 科目 | 評価 | | --- | --- | --- | | 1 | データベース | 優 | | 1 | 実験 | 不可 | | 1 | 微積分 | 優 | | 1 | teratail | 秀 | | 1 | データベース | 優 | | 2 | 実験 | 可 | | 2 | 微積分 | 優 | | 2 | teratail | 秀 | | 3 | データベース | 優 | | 3 | 実験 | 可 | | 3 | 微積分 | 優 | | 3 | teratail | 不可 | ここまで見て下さりありがとうございます
回答: > > table 成績評価は 1 対 多数 のデータを処理するため特にアドバイスを頂きたいです > > > この設計で問題ないと思います。 ただ、「科目マスタ」テーブルを定義し、 「成績評価」テーブルの科目には文字列の代わりに「科目マスタ」テーブルの ID を格納し、 外部キーを定義しておくとなお良いでしょう。 例えば、以下のようになります。 **table名 科目マスタ** | ID | 科目名 | 単位 | | --- | --- | --- | | 1 | データベース | 5 | | 2 | 実験 | 10 | | 3 | 微積分 | 5 | | 4 | teratail | 3 | **table名 成績評価** | 学籍番号 | 科目ID | 評価 | | --- | --- | --- | | 1 | 1 | 優 | | 1 | 2 | 不可 | | 1 | 3 | 優 | | 1 | 4 | 秀 | こうしておけば、科目ごとの単位数を DB で管理できるようになる上に、 誰かが誤って存在しない科目名を入力してしまうことを防止できます。 同様の理由から、以下のように「評価マスタ」テーブルも定義したほうが良いでしょう。 **table名 評価マスタ** | ID | 表示名 | ポイント | | --- | --- | --- | | 1 | 優 | 5 | | 2 | 秀 | 4 | | 3 | 可 | 3 | | 4 | 不可 | 0 | **table名 成績評価** | 学籍番号 | 科目ID | 評価ID | | --- | --- | --- | | 1 | 1 | 1 | | 1 | 2 | 4 | | 1 | 3 | 1 | | 1 | 4 | 2 | 「科目ごとの単位数」と「評価ごとのポイント」を DB で管理すると、 GPA の計算を DB内で(SQL文だけで)実行できるようになるため、 アプリケーションのロジックをシンプルにできる、というメリットもあります。 (もっとも、その分 SQL文は複雑になりますがw) > > すべての科目に対してtableを作ることは愚策ではないか > > > これは仰るとおりだと、私も考えます。 もし、そのような設計にしてしまうと、 例えば取得した科目から総単位数を集計するようなロジックが複雑になる上に 新しい科目が追加されるたびにテーブルを増やさなければならず、 いつかアプリケーション側の修正を忘れてバグを生むことになるでしょう。 > > 第一希望と第2希望をどのようにテーブル設計するか検討がつかない > > > 上述の「科目マスタ」テーブル、「成績評価」テーブルと同じ要領で * 「研究室マスタ」テーブル * 「希望研究室」テーブル(カラム : 学籍番号、研究室ID、希望順(第一希望 or 第二希望)) で十分だと考えます。 > > とった成績とGPAまたはすべての科目を入力 > > > "成績"とは、総単位数のことでしょうか? であれば、「単位数」テーブルと「GPA」テーブルは1つにまとめてしまっても良いと思います。 両方とも生徒ごとに1レコードしか存在し得ない上に、 サイトの仕様上、一方のデータが存在すればもう一方のデータも必ず存在するはずだからです。 最後に、 > > とった成績とGPAまたはすべての科目を入力 > > > について私の個人的な意見を言わせていただくと、 まずは入力させる項目をどちらか一方に絞って、サイトを作ったほうが良いと思います。 好きな方を入力できたほうがサイトの利便性は高いでしょうが、 アプリケーションは意外と複雑になるからです。 好きな方を入力できるようにする場合、例えば以下のような懸念が生じます。 * 両方を入力することを許可するのか? 許可する場合、(そして双方のデータが矛盾している場合、)どちらのデータを使用するのか? * "成績とGPA"を入力した生徒と"すべての科目"を入力した生徒が混在する場合、 両方のデータをまとめて集計・ソートすることができるか? (もちろん、不可能ではないですが)