テーブルの作り方で疑問
- テーブルの作り方について疑問があります。
- 関連テーブルを使って作る方法と、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つのテーブルではいけないんでしょうか? これだとどんな問題があるのでしょうか? よろしくお願いします。
- b-no-no-2
- お礼率11% (1/9)
- その他(データベース)
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
食べ物テーブルが食べ物の名前だけならば、そんな風に作ったっていいと思います。 でも、どうして、中間テーブルを作るか・・・・下の説明では、1レコードを1行で書いて、レコードを下に並べて書きます。 人 食べ物 1 寿司 1 すき焼き 2 寿司 2 そば 3 すき焼き 3 うどん 説明しやすい単純な例は、例えば、「寿司」を後で「鮨」と直そうと思ったとします。 中間テーブルの方法ですと、食べ物テーブルの1レコードを直すだけですみますね。ところが、中間テーブルを使わない方法ですと、寿司のあるレコードを全部直さなければなりません。 まあ、でも、食べ物を「寿司」という"記号"あらわすか、「1」で代用するかは、あまり本質的な問題ではありません。 実は、食べ物テーブルが食べ物の名前だけならいいのですが、普通、そのほかのデータが一緒に書いてあるのが一般的です。 寿司 カロリー 定価 和食・・・・ などというように、ですね。 これを中間テーブルを作らない方法にすると、不便さが倍増します。 人 食べ物 和洋 定価 1 寿司 和食 100円 1 すき焼き 和食 300円 2 寿司 和食 100円 2 そば 和食 200円 3 すき焼き 和食 300円 3 うどん 和食 50円 後で、寿司の定価を150円に直そうと思ったとき・・・あまり考えたくないですね。 それに同じデータが何回も何回も入っているのはスペースの無駄ですし、入力の手間も無駄で、間違いが起こりやすくなります。 更に、うまい簡単な例が思いつかないのですが、これでは、データをいろいろな用途に使いまわすにも不便なのです。
関連する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 よろしければアドバイスお願いします。
- ベストアンサー
- Oracle
- 複数テーブルの結合
テーブル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 よろしくお願いします
- 締切済み
- MySQL
- 異なるサーバーのテーブルを結合する方法
SSIS初心者です。 SSISで異なるサーバーのテーブルを結合する方法を教えて頂きたいです。 環境のイメージとしては サーバー1のテーブルAと サーバー2のテーブルBを結合して サーバー2のテーブルCに登録処理を行いたいです。 二つのDBはスキーマ名、ログインID、パスワードが全て異なります。 ご教示頂けましたら、助かります。 宜しくお願い致します。
- ベストアンサー
- SQL Server
- 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が思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。
- ベストアンサー
- Oracle
- DELETEでテーブル削除方法
テーブルA、テーブルB、テーブルCがあります。 テーブルA テーブルB テーブルC --------------------------------- 個人ID 個人ID なし --------------------------------- テーブルAに等しい個人IDをテーブルBから 削除をし、テーブルCにテーブルAのIDが存在すれば テーブルCを削除し、存在しなければテーブルA、テーブルB の個人IDを削除しようと考えています。 SQLでテーブルAとBを比較して削除をし テーブルAとテーブルCを削除すれば出来ると思うのですが 他にいい方法があればご教授お願い致します。
- ベストアンサー
- Oracle
- 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
お礼
やっとわかりました! “そのほかのデータ”のことなんて全然考えていませんでした・・・ 回答ありがとうございました!