テーブルの作り方で疑問

このQ&Aのポイント
  • テーブルの作り方について疑問があります。
  • 関連テーブルを使って作る方法と、1つのテーブルに全ての情報をまとめる方法の違いがわからないです。
  • どちらの方法が良いのか、どんな問題があるのか教えてください。
回答を見る
  • ベストアンサー

テーブルの作り方で疑問

最近簡単なアプリを作り始めたのですが、DBの設計で疑問があります。 人物   好きな食べ物 Aさん  寿司、すき焼き Bさん  寿司、そば Cさん  すき焼き、うどん 例えば上のような関係の場合には、 [人物テーブル] ID__:1,2,3 人物名:Aさん、Bさん、Cさん [食べ物テーブル] ID___:1,2,3,4 食べ物名:寿司、すき焼き、そば、うどん [中間テーブル] ID___:1,2,3,4,5,6 人物ID_:1,1,2,2,3,3 食べ物ID:1,2,1,3,2,4 こういうようにテーブルを作るのが普通だという事はわかりました。 でも何故こうするのかがイマイチわかりません。。。 例えば、人物テーブルと、 [テーブル] ID__:1,2,3,4,5,6 人物ID:1,1,2,2,3,3 食べ物:寿司,すき焼き,寿司,そば,すき焼き,うどん という2つのテーブルではいけないんでしょうか? これだとどんな問題があるのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#110201
noname#110201
回答No.1

食べ物テーブルが食べ物の名前だけならば、そんな風に作ったっていいと思います。 でも、どうして、中間テーブルを作るか・・・・下の説明では、1レコードを1行で書いて、レコードを下に並べて書きます。 人 食べ物 1 寿司 1 すき焼き 2 寿司 2 そば 3 すき焼き 3 うどん 説明しやすい単純な例は、例えば、「寿司」を後で「鮨」と直そうと思ったとします。 中間テーブルの方法ですと、食べ物テーブルの1レコードを直すだけですみますね。ところが、中間テーブルを使わない方法ですと、寿司のあるレコードを全部直さなければなりません。 まあ、でも、食べ物を「寿司」という"記号"あらわすか、「1」で代用するかは、あまり本質的な問題ではありません。 実は、食べ物テーブルが食べ物の名前だけならいいのですが、普通、そのほかのデータが一緒に書いてあるのが一般的です。 寿司 カロリー 定価 和食・・・・ などというように、ですね。 これを中間テーブルを作らない方法にすると、不便さが倍増します。 人 食べ物 和洋 定価 1 寿司 和食 100円 1 すき焼き 和食 300円 2 寿司 和食 100円 2 そば 和食 200円 3 すき焼き 和食 300円 3 うどん 和食 50円 後で、寿司の定価を150円に直そうと思ったとき・・・あまり考えたくないですね。 それに同じデータが何回も何回も入っているのはスペースの無駄ですし、入力の手間も無駄で、間違いが起こりやすくなります。 更に、うまい簡単な例が思いつかないのですが、これでは、データをいろいろな用途に使いまわすにも不便なのです。

b-no-no-2
質問者

お礼

やっとわかりました! “そのほかのデータ”のことなんて全然考えていませんでした・・・ 回答ありがとうございました!

関連するQ&A

  • 参照先に値が無い場合空欄にするテーブル結合を作る

    初歩的な質問ですみません table:A +------------+-------------+ | id | status_id| +------------+-------------+ | 1 | 1 | | 2 | 2 | | 3 | 1 | | 3 | 2 | +------------+-------------+ table:B +------------+-------------+ | status.id | name| +------------+-------------+ | 1 | そば | | 2 | うどん | +------------+-------------+ みたいなテーブルがあるとすると、 +------------+-------------+------+ | A.id | B.status_id| B.name | +------------+-------------+------+ | 1 | 1 | そば | | 1 | 2 | NULL | | 2 | 1 | NULL | | 2 | 2 | うどん | | 3 | 1 | そば | | 3 | 2 | うどん | +------------+-------------+------+ 結合して上の表のようにしたいのです どうかお力をお貸しください

    • ベストアンサー
    • MySQL
  • ACCESS テーブルの結合

    同じmdb内で複数テーブルがあります。(テーブル1から10まで)フィールド名はすべて同じです。それぞれのテーブルのIDは1からオートナンバーになってます。 【例】 テーブル1  フィールド名: ID A B C テーブル2   フィールド名:ID A B C  ・ ・ テーブル10   フィールド名:ID A B C  ひとつのテーブルで管理したいのですが・・・教えてください。

  • テーブルの並び替え

    仕事であるdbを使って集計をすることになったのですが、なにぶん初心者なので分りやすくdbを並べ替えたいのですが、うまくいきません。 たとえば 主キー ID  code1 code2 222 33 あ   B  222 33 う   c  225 66 あ   c 239 77 か   B 239 77 う   d となっているものをテーブルを 主キー ID codeA codeB codeC codeD 222 33 あ   B  う c 225   66 あ   c 239   77 か   B  う  d と別テーブルへ並べ替えたいのですが、どのように 書いたらいいものか・・・。 どなたか教えてくれませんでしょうか?

  • テーブルのどちらかにデータがない事があるテーブル結合について

    ■table a のテーブル構成 date a_id b_id c_id a_count ■table b のテーブル構成 date a_id b_id c_id b_count value 上記の2つのテーブル構成から、 ■date a_id b_id c_id毎の集計データ date a_id b_id c_id a_count b_count value を抽出するSQLが知りたいです。 table aにあって、table bに存在しない。又は逆もある為、 union しかないと思うのですが、思いつきません。。

    • ベストアンサー
    • MySQL
  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • 複数テーブルの結合

    テーブルA  a_id id a_data a_date ----------- テーブルB id b_data b_date テーブルC id c_data c_date ----------- テーブルAとテーブルBは「id」がキーで1:N(Nは0も含む) テーブルAとテーブルCは「id」がキーで1:N(Nは0も含む) このような3のテーブルで a_idを検索キーにして次のフィールドのデータを抽出したいのですが。。。 ※テーブルCのc_dateを降順で先頭の1レコードのみ ※テーブルBのidをカウントする selectの結果(イメージ) id a_data a_date count(B.id) c_date ------------------------------------- 001 AAAA 2007/02/01 20 2007/02/14 005 BBBB 2007/02/02 0 2007/02/10 006 CCCC 2007/02/02 0 2007/01/08 003 DDDD 2007/02/01 100 002 EEEE 2007/02/01 9 004 FFFF 2007/02/01 0 よろしくお願いします

  • 異なるサーバーのテーブルを結合する方法

    SSIS初心者です。 SSISで異なるサーバーのテーブルを結合する方法を教えて頂きたいです。 環境のイメージとしては サーバー1のテーブルAと サーバー2のテーブルBを結合して サーバー2のテーブルCに登録処理を行いたいです。 二つのDBはスキーマ名、ログインID、パスワードが全て異なります。 ご教示頂けましたら、助かります。 宜しくお願い致します。

  • 2つのテーブル結合

    Oracle10g使用しています。 テーブルAとテーブルBを結合させてデータを取得したいと思っています。 [テーブルA] ID name 1 A 2 B 3 C 4 D [テーブルB] ID SEQ VALUE 1 1 111 2 1 222 2 2 333 3 1 444 4 1 555 4 2 666 4 3 777 テーブルAのキーは[ID]、テーブルBのキーは[ID,SEQ]です。 この二つを連結して以下のように出力したいと思っています。 ID SEQ NAME VALUE 1 1 A 111 2 2 B 333 3 1 C 444 4 3 D 777 テーブルBのデータは同じIDのうち最大のSEQのものを取得したいのですが よいSQLが思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。

  • DELETEでテーブル削除方法

    テーブルA、テーブルB、テーブルCがあります。 テーブルA テーブルB テーブルC --------------------------------- 個人ID  個人ID  なし --------------------------------- テーブルAに等しい個人IDをテーブルBから 削除をし、テーブルCにテーブルAのIDが存在すれば テーブルCを削除し、存在しなければテーブルA、テーブルB の個人IDを削除しようと考えています。 SQLでテーブルAとBを比較して削除をし テーブルAとテーブルCを削除すれば出来ると思うのですが 他にいい方法があればご教授お願い致します。

  • MySQL 複数テーブルのフィールドにUPDATE

    よろしくお願いします。 PHP5、MySQL5、 PEAR DB、Smarty にて開発しております。 標題にもありますように、LEFT JOINを使ってUPDATEできる方法を探しております。 ●Aテーブル(親) id | del_flag ----------------- 1 | 0 2 | 0 3 | 0 4 | 0 ●Bテーブル id | del_flag ----------------- 1 | 0 3 | 0 4 | 0 ●Cテーブル id | del_flag ----------------- 1 | 0 2 | 0 3 | 0 4 | 0 上記のような3つ、またはもしくはそれ以上テーブルがあったとします。 そこで、 Aテーブルの id 2 のdel_flagを1 とアップデートしたときに、 同時に全てのB、Cのテーブルの id 2 のdel_flagも 1 としたく思います。 Bテーブルには、id 2 が存在しないため、結果的にはCテーブルだけが更新されますが、 A、B,Cともに同一のid値 がある場合も考慮して、 アップデートしたいと思います。 そこで、PHP内で、一つ一つのテーブルを地道にアップデートすることは可能だとおもいますが、 一度のSQLでdel_flagの値を1とできる方法はございませんでしょうか? お手数ですが、 具体的なクエリを書いていただけると、大変助かります。 いろいろ調べましたが、なかなか上手くいかず・・・・。 よろしくお願いいいたします。  

    • ベストアンサー
    • MySQL