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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

2047閲覧

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

imaharu

総合スコア32

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2017/07/28 14:06

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

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

table 成績評価は

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

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

  • 拡張機能として、希望する3つの研究室内での順位を表示することを考えています

そのとき、第一希望と第2希望をどのようにテーブル設計するか検討がつかないのでそれについてもアドバイスを頂けると嬉しいです

よろしくお願いします

サイトの流れ

ログイン画面

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

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

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

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

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

#データベース設計

table名 学生情報

学籍番号パスワード
11234
2password
3taro
4imaharu

table名 単位数

学籍番号総単位数
1126
2130
3123
4119

table名 GPA

学籍番号GPA
12.7
23.2
33.5
41.5

table名 成績評価

学籍番号科目評価
1データベース
1実験不可
1微積分
1teratail
1データベース
2実験
2微積分
2teratail
3データベース
3実験
3微積分
3teratail不可

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

この設計で問題ないと思います。

ただ、「科目マスタ」テーブルを定義し、
「成績評価」テーブルの科目には文字列の代わりに「科目マスタ」テーブルの ID を格納し、
外部キーを定義しておくとなお良いでしょう。

例えば、以下のようになります。

table名 科目マスタ

ID科目名単位
1データベース5
2実験10
3微積分5
4teratail3

table名 成績評価

学籍番号科目ID評価
11
12不可
13
14

こうしておけば、科目ごとの単位数を DB で管理できるようになる上に、
誰かが誤って存在しない科目名を入力してしまうことを防止できます。

同様の理由から、以下のように「評価マスタ」テーブルも定義したほうが良いでしょう。

table名 評価マスタ

ID表示名ポイント
15
24
33
4不可0

table名 成績評価

学籍番号科目ID評価ID
111
124
131
142

「科目ごとの単位数」と「評価ごとのポイント」を DB で管理すると、
GPA の計算を DB内で(SQL文だけで)実行できるようになるため、
アプリケーションのロジックをシンプルにできる、というメリットもあります。
(もっとも、その分 SQL文は複雑になりますがw)


すべての科目に対してtableを作ることは愚策ではないか

これは仰るとおりだと、私も考えます。

もし、そのような設計にしてしまうと、
例えば取得した科目から総単位数を集計するようなロジックが複雑になる上に
新しい科目が追加されるたびにテーブルを増やさなければならず、
いつかアプリケーション側の修正を忘れてバグを生むことになるでしょう。


第一希望と第2希望をどのようにテーブル設計するか検討がつかない

上述の「科目マスタ」テーブル、「成績評価」テーブルと同じ要領で

  • 「研究室マスタ」テーブル
  • 「希望研究室」テーブル(カラム : 学籍番号、研究室ID、希望順(第一希望 or 第二希望))

で十分だと考えます。


とった成績とGPAまたはすべての科目を入力

 "成績"とは、総単位数のことでしょうか?
であれば、「単位数」テーブルと「GPA」テーブルは1つにまとめてしまっても良いと思います。

両方とも生徒ごとに1レコードしか存在し得ない上に、
サイトの仕様上、一方のデータが存在すればもう一方のデータも必ず存在するはずだからです。


最後に、

とった成績とGPAまたはすべての科目を入力

について私の個人的な意見を言わせていただくと、
まずは入力させる項目をどちらか一方に絞って、サイトを作ったほうが良いと思います。

好きな方を入力できたほうがサイトの利便性は高いでしょうが、
アプリケーションは意外と複雑になるからです。

好きな方を入力できるようにする場合、例えば以下のような懸念が生じます。

  • 両方を入力することを許可するのか?

許可する場合、(そして双方のデータが矛盾している場合、)どちらのデータを使用するのか?

  • "成績とGPA"を入力した生徒と"すべての科目"を入力した生徒が混在する場合、

両方のデータをまとめて集計・ソートすることができるか?
(もちろん、不可能ではないですが)

投稿2017/07/29 09:27

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imaharu

2017/07/29 10:08

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問