現在あるシステムを作成する上で、DB設計をしています。
このDB設計をする上で、多対多の状態だと良くない(できない?)とよく聞きます。
例)一人の学生は複数の講義を受講し、一つの講義には複数の学生が受講する。
この時に、学生の情報を格納する「学生DB(主キー:学生番号)」と、講義の情報を格納する「講義DB(主キー:講義番号)」を作成します。そうするとこの二つのDBの関係って、多対多になってしまうと思うのですが、この場合どのような問題が起きますか?
例がちょっとわかりにくいかもしれませが、要は
「DBを多対多の状態で設計した場合の問題点は何か?」
ということをお聞きしたいです。
よろしくお願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
これ、聞いて理解できなければ、自分で困ってみるのが一番です。
例に挙げておかれる問題は、たぶん、多対多のテーブルを直接作って構成すると、すぐにとっても困ることができるので、この場合良い事例です。
実験をするに当たって、考慮すべき点をいくつか上げておきます。
・テーブルの設計に当たっては、現実世界の条件を満たすように構成すること。(テーブルを作っていて、「フィールドが多くなりすぎたから、講義の種類は**個しかないことにしようか」とかテーブル設計の都合で現実世界に条件を設けてはいけません。)
・現実の世界を見て、変更されそうなポイントは、容易にその変更をデータベースに反映できること。(講義の種類数が増えたから、テーブルの構成を修正するなんて言うのは、もう最悪です。これはこれで、ひとつの「困った」ですが、テーブル定義を修正すると、その後でアプリケーションを全部修正する必要があることを頭に入れておきましょう。)
・データの登録は容易にできるか、考えましょう。データを登録するために、いくつのテーブルを調査する必要があるか?ひとつのデータを登録するために、いくつのテーブルを連動して操作する必要があるか。などが考慮ポイントです。
この際に、現実世界にあり得ないデータを登録「できない」ようになっているかも重要なポイントです。(アプリケーションでやる仕事に見えますが、これをデータベースレベルではじけるように設計するのはとても大切なことです。アプリケーションはいくつもできる可能性がありますが、データベースはひとつですから、どちらでチェックした方が確実かは自明ですね。)
・データの修正を行うときに、どれだけのテーブルとデータが関係してくるかを考えること。削除・修正の両方です。チェックポイントは挿入の時と同じです。変な操作をしたときに、データの整合性が崩れないように注意すること。あっちを修正してこっちを修正し忘れたら何が起こるかを考慮しておくのはとても重要です。へたをすると、使い物にならないデータとなり修正さえ不可能な事態に追い込まれかねないものです。
ちなみに、最後の2点は、関係するテーブルは、できるだけ少なく構成することが吉です。多くなればなるほど、あらゆる点が複雑になっていきます。テーブルの数を少し増やすだけで操作に関わるテーブル数が減るなら、テーブルの数は増やすべきです。これをテーブル数をシンプルにしようと間違った方向に進むと先の考慮点の、登録・修正の際のデータの整合性を保証する段階で、頓挫することになります。
この条件をクリアした時点で、データベースの設計をもう一度見てみると、たぶん、テーブルが直接多対多の関係でリレーションされていることはないでしょう。
あえて、何故困るかは書きません。
参考に言っておくなら、こうしたときに困らないようにデータベース理論つくられ、正規化というテクニックが生まれたのです。
No.4
- 回答日時:
>「なぜ作らなければならないのか?」ということがわかりません。
逆に、この中間テーブルを使わない方法を考えると
学生テーブルの方に、講義1,講義2,講義3,・・・と受講する講義のフィールド
講義テーブルの方に、学生1,学生2,学生3,・・・と受講する学生のフィールド
といった構造が考えられますが
講義のフィールド、学生のフィールドともに最大可能な数を用意する必要が有ります。
(受講する講義が少なくても、また受講する学生が少なくても常に用意する)
講義や学生の数が非常に少ないのであればこのような構造も考えられますが
数が多い場合、使われないフィールドが多く発生するために、
データベースのデータ格納効率が悪くなってしまいます。
また、受講する学生や講義をリストアップする場合も処理が複雑になります。
(フィールドが使われているかどうかの判断が必要になるので)
No.3
- 回答日時:
>「なぜ作らなければならないのか?」ということがわかりません。
直接は関係付けられないからということでは駄目なの?
>多対多の関係でDBを設計しても特に問題はないということでしょうか?
考える方向が逆なのでは
RDBでは現実世界の事象をテーブルという形で表現します
現実世界に多対多の関係のものがあるのですから
それを扱うDBには多対多の関係のテーブルができて当然なのでは
それとも中間テーブルというのが納得できないのかな
代表的なDBに販売というものがありますが
このケースでは顧客と商品は多対多の関係になります
従って販売テーブルが中間テーブルになります
この場合一般的には販売テーブルがメインで商品と顧客は参照先
と考え販売が中間テーブルという風には考えませんが
視点を変えればまぎれもなく中間テーブルです
No.2
- 回答日時:
>多対多の状態だと良くない(できない?)とよく聞きます。
どこで聞いたのか分かりませんが聞き間違いかガセです
世の中には多対多の関係になるものはいっぱい存在します
多対多の関係の場合直接は関係付けられませんから
中間テーブルを介して関係付けます
学生と講義なら
[受講テーブル](学生番号、講義番号)
というテーブルが中間テーブルになります
受講テーブルと学生が一対多
受講テーブルと講義が一対多になります
この場合のユーザーインタフェースは
講義テーブルから作った単票フォームに受講テーブルをサブフォームとしてはめ込む
ものと
学生テーブルから作った単票フォームに受講テーブルをサブとしてはめ込む
を作ればいいというのも定石ですね
回答ありがとうございます。
受講テーブルを作れば、多対多にならないというのはわかっています。
ただ「なぜ作らなければならないのか?」ということがわかりません。
それとも回答者様は、冒頭でおっしゃっているように、多対多の関係でDBを設計しても特に問題はないということでしょうか?
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- その他(学校・勉強) 大学の大人数での対面講義を受けるとしんどくなります 対処法は? ある講義が1つの教室を借りて大人数で 2 2022/09/22 13:29
- 大学・短大 (工学部)とある数学の講義(必修)を自主休講しようか悩んでいます 7 2022/11/19 21:21
- 大学・短大 放送大学の単位の組み方?について質問です。 今度放送大学に入ろうか検討中です。 そこで大学の単位につ 4 2022/08/03 06:52
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- 大学院 大学留年の危機 重複履修について 4 2022/09/14 23:10
- その他(職業・資格) 『特別管理産業廃棄物管理責任者』修了試験の傾向と対策 1 2023/01/01 01:00
- Excel(エクセル) アウトラインの小計のやり方 1 2023/03/20 11:51
- 大学・短大 (工学部)教科書を丸写しするだけの数学の講義 14 2022/07/31 12:26
- 情報処理技術者・Microsoft認定資格 応用情報処理技術者試験のシステム利用率の計算について 2 2022/03/28 07:43
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
面接のときテーブルが正面に。...
-
お金持ちのテーブル
-
「テーブルに座って……」という...
-
男性と2人で飲食店に行きテーブ...
-
会社の飲み会の幹事になり、座...
-
飲み会で、座敷orテーブルどち...
-
Access2000 のテーブルの...
-
今度同じサークルだった女の子...
-
ExcelからACCESSへ接続するとエ...
-
外部キーだけのテーブル(主キ...
-
【エクセル】データテーブルの...
-
1つのテーブルに同じデータを参...
-
【PHP】SQL文のSUM関数で出力し...
-
まるいテーブル 円い 丸い 漢字...
-
シャンメリーが、硬くて開きま...
-
ACCESS VBA でテーブルの定義だ...
-
オーダーの覚え方について
-
L2SWはARPテーブルを持っている?
-
Accessでデータシートに同じデ...
-
SQLでUPSERTを一度に複数行やる...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
L2SWはARPテーブルを持っている?
-
「テーブルに座って……」という...
-
会社の飲み会の幹事になり、座...
-
飲み会で、座敷orテーブルどち...
-
外部キーだけのテーブル(主キ...
-
男性と2人で飲食店に行きテーブ...
-
テーブルリンク リンク元を知...
-
お金持ちのテーブル
-
アクセスのリンクテーブル一覧...
-
論理名とコメント構文(?)について
-
面接のときテーブルが正面に。...
-
【エクセル】データテーブルの...
-
MySQLで複数テーブルを作成する
-
まるいテーブル 円い 丸い 漢字...
-
オーダーの覚え方について
-
【PHP】SQL文のSUM関数で出力し...
-
UTF8のテーブルをODBCドライバ...
-
1対1のリレーション(主キー同...
-
SQLでテーブルの値を集計して、...
-
取数計算
おすすめ情報