質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

データベース初期設計構成の相談

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,067

imaharu

score 32

学習のため取得単位数と成績から現在の順位を表示するサイトを作ろうと考えています

データベースの各テーブルを作成したのですが、初めて作成したため
設計したデータベース問題点などをご指導いただきたいです

table 成績評価は

1 対 多数 のデータを処理するため特にアドバイスを頂きたいです

すべての科目に対してtableを作ることは愚策ではないかと思い、一つのテーブルにまとめました。

* 拡張機能として、希望する3つの研究室内での順位を表示することを考えています
そのとき、第一希望と第2希望をどのようにテーブル設計するか検討がつかないのでそれについてもアドバイスを頂けると嬉しいです

よろしくお願いします

 サイトの流れ

ログイン画面

学籍番号とパスワードがtable(学生情報)、パスワードと同じならログイン
登録していないなら、学籍番号とパスワードを入力

初めて登録した人は、とった成績とGPAまたはすべての科目を入力

すべての科目からGPAを計算してtalbe(GPA)に挿入

総単位数とGPAの高い順からソートして表示

* 希望研究室を志望する学生の中での順位を表示(拡張機能)

データベース設計

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 不可

ここまで見て下さりありがとうございます

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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"を入力した生徒と"すべての科目"を入力した生徒が混在する場合、
    両方のデータをまとめて集計・ソートすることができるか?
    (もちろん、不可能ではないですが)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/29 19:08

    詳しい回答ありがとうございます。
    設計を間違えるとあとからのやり直しが大変だと思うので、回答を参考に修正します
    稚拙な質問にお答えいただき、ありがとうございました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る