- ベストアンサー
重複するデータのデータベース設計方法について
はじめまして。 データベースの設計で困っています。 例えば、 学生[学生A / 学生B / 学生C] 部活[サッカー / 野球 / テニス] とデータがあり、学生は部活のどれかに属します。(二重所属可) これをデータベースで1つのテーブルで表すと、以下のようになると思うのですが、どちらのカラムも重複が発生します。 使用上問題なさそうなのですが、このような設計は良くないですか? ┌-------┬------┐ | 部活 | 学生 | ├-------┼------┤ |サッカー| 学生A | ├-------┼------┤ |サッカー| 学生B | ├-------┼------┤ | 野球 | 学生A | ├-------┼------┤ | テニス | 学生C | └---------------┘ 詳しい方、ご教授下さいますようお願いしますm(_ _)m
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>これなら、所属部活(学生番号、部活番号)の学生番号が何度出現しても、部活番号が何度出現しても、問題ないということですよね?? 問題ありません。 通常N:Nのリレーションシップの場合は、今回のようにします。 もちろん第3のテーブルの主キーは学生番号+部活番号です。 したがって、学生番号+部活番号の組み合わせは重複できませんので念のため。
その他の回答 (4)
#2です。 3つめのDBの説明に誤りがあります。 #3さんの回答が妥当だと思います。
- jamshid6
- ベストアンサー率88% (591/669)
学生表、部活表が存在する上で第3のテーブルを作るという意味で書かれているのであれば、問題ありません。 そうでなくて、学生表・部活表の代わりに上記のようなテーブルを作ろうとされているのであれば、 このような文字列を主キーにするデザインはいいデザインとはいえないでしょう。 学生表、部活表は通常カラムは1つではないはずです。 例えば学生 (学生番号、氏名、住所、クラス)、部活(部活番号、部活名、担当教員)など。 ただ、仮にカラムが1つしかなくても、 学生(学生番号、氏名) 部活(部活番号、部活名) 所属部活(学生番号、部活番号) とする方が通常かと思います。
お礼
回答ありがとうございます。 第3のテーブルになります。 これなら、所属部活(学生番号、部活番号)の 学生番号が何度出現しても、 部活番号が何度出現しても、 問題ないということですよね??
学生テーブルにキーと学生名、部活テーブルにキーと部活名 まず上述の二つのDBを作ります。 次に学生キーと部活キーを持つ三つめのDBを作ることで、 二つのDBを関連づけられます。 このDBは学生キーの重複を許可せず、部活キーの重複は許可します。 こんなところでいかがでしょうか。
- ymmasayan
- ベストアンサー率30% (2593/8599)
これはリレーショナルデータベースの標準的な表で問題ありません。 しいて言えば普通、キー項目となる学生を左にするでしょう。 これに「部活表」とでも名づければいいでしょう。
お礼
回答ありがとうございます。 このテーブルには、キーがない(もしくはどちらもキーとなる)としたいです。どちらにも同じ内容が入り得るので。
お礼
回答ありがとうございます。 訂正までありがとうございます。 参考になりました。