• ベストアンサー

テーブルの作り方

一つのコンテンツAにコンテンツBのデータが複数あり、 コンテンツBのにはコンテンツAのデータを複数含むデータがあります。 この関係をデータベースに登録しようと考えているのですが、よい方法が思いつきません。   テーブルA     テーブルB ┏━━━━━━━┓  ┏━━━━━━━┓ ┃▲ ▲ ▲ ▲ ┃  ┃● ● ● ● ┃ ┗━━━━━━━┛  ┗━━━━━━━┛ ▲コンテンツB ●コンテンツA 同じキーの同じフィールドに複数のデータを登録させない方向で作ろうと思っています。 よい作りかたはないでしょうか? おねがいします。

  • MySQL
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • yoshi_t
  • ベストアンサー率75% (3/4)
回答No.4

ご質問のような「テーブルA」「テーブルB」が持つ情報の結び付が多対多の関係の場合、「中間テーブル」を作って双方のテーブルデータの結び付を管理する方法が一般的なようです。 「中間テーブル」についての詳しい説明は、WEB上で解説がされているので調べてみてください。

参考URL:
http://www.ianywhere.com/developer/product_manuals/sqlanywhere/0902/ja/html/dbfgja9/00000261.htm

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

普通は都道府県テーブルと特産品テーブルを別々につくり それぞれIDをもたせて、IDでリンクするテーブルをつくって管理しますね。 SQLから得た結果をどのように表示させるかはミドルウェアの仕事ですから。 SQLのみでやるなら変数とテンポラリをつかって以下のようにすると できないことはないです。一度お試しになるとよろしいかと。 (今回は手抜きでリンクテーブルに直接、県名や特産品名を かいていますが、実働の際にはIDで管理する方がよいでしょう) CREATE TABLE `リンク` ( `都道府県` VARCHAR( 30 ) NOT NULL , `特産品` VARCHAR( 30 ) NOT NULL , PRIMARY KEY ( `都道府県` , `特産品` ) ); INSERT INTO `リンク` VALUES('北海道','ジャガイモ'), ('北海道','カニ'), ('北海道','メロン'), ('長崎','ジャガイモ'), ('長崎','かまぼこ'), ('長崎','カステラ'), ('長野','ジャガイモ'), ('長野','メロン'); まずこんな感じリンクをつくります。 普通はこれをPHPなどで処理すればよいのですが SQLのみで県別、特産品別に表示するのは以下のとおり CREATE TEMPORARY TABLE `県別` ( `特産品` VARCHAR( 30 ) NOT NULL , `都道府県` VARCHAR( 30 ) NOT NULL , PRIMARY KEY ( `都道府県`) ); SET @KEN="",@TOKUSAN=""; REPLACE INTO `県別` SELECT if(@KEN=`都道府県`,@TOKUSAN:=CONCAT(@TOKUSAN,',',`特産品`),@TOKUSAN:=`特産品`) AS `特産品` ,@KEN:=`都道府県` AS `都道府県` FROM リンク ORDER BY `都道府県`; SELECT * FROM `県別`; CREATE TEMPORARY TABLE `特産品別` ( `都道府県` VARCHAR( 30 ) NOT NULL , `特産品` VARCHAR( 30 ) NOT NULL , PRIMARY KEY ( `特産品`) ); SET @KEN="",@TOKUSAN=""; REPLACE INTO `特産品別` SELECT if(@TOKUSAN=`特産品`,@KEN:=CONCAT(@KEN,',',`都道府県`),@KEN:=`都道府県`) AS `都道府県` ,@TOKUSAN:=`特産品` AS `特産品` FROM リンク ORDER BY `特産品`; SELECT * FROM `特産品別`;

noname#22222
noname#22222
回答No.2

s_husky です。 <産地一覧> ID____ 1,2,3・・・ 名称___ 北海道、青森、・・・ 都道府県は公的な管理番号というのがあります。 [産地一覧.ID] は、そうれらを用いるといいかも知れません。 <品目一覧> ID________ シーケンシャルな主キー 名称______ ジャガイモ、カニ、・・・ 並び順____ 1,2,3・・・ 単位______ Kg、石・・・ <品目別生産地> ID__________ シーケンシャルな主キー 品目一覧_ID_ <品目一覧>を参照するキー 産地一覧_ID_ <産地一覧>を参照するキー 生産量______ 150 * 単位は、[品目一覧.単位]を参照。 生産順位____ 実際の列としては不要 * 生成できるという意。 備考________ 市場占有率 43% etc. というような設計で事足りると思います。 <生産地別品目一覧>は、<品目別生産地>から生成できるので必要ありません。 仮に、次のよう一時テーブルであっても1秒以内で生成できます。 このような通常は用意さえしない一時的なテーブルにはデータを登録する必要はありません。 データの二重記録は、矛盾を惹起するだけですので厳禁です。 あくまでも、データの特殊な抽出・表示をステップバイステップで行う工夫の一つです。 可能であれば、Excel的なデータの参照という慣習そのものを打破したがいいです。 データベースには、それに相応しい参照形式というのがあると思います。 <生産地別品目一覧一時テーブル> ID_________ [品目一覧.並び順] をコピー。 品目一覧_ID No.01産地_ID No.02産地_ID No.03産地_ID No.04産地_ID No.05産地_ID

noname#22222
noname#22222
回答No.1

<テーブルB> ID 区分 データ この場合、区分が'A'であるデータが複数あるという関係のような・・・。 が、文面から「そうだ!」とも確定出来ません。 ウーン!という感じです。

Filette
質問者

お礼

回答ありがとうございます。 ちょっと補足してみます。

Filette
質問者

補足

例を挙げると、都道府県と特産品のデータがあるとして、 以下の関係をうまいぐあいにデータベースにしたいと考えています。 都道府県     特産品 北海道      ジャガイモ、カニ、メロン 長崎       ジャガイモ、かまぼこ、カステラ 長野       ジャガイモ、メロン 特産品      都道府県 ジャガイモ    北海道、長崎、長野 カニ       北海道 メロン      北海道、長野 かまぼこ     長崎 カステルラ    長崎

関連するQ&A

  • Sqlserver2005でテーブルを作成してい分からなかったので質問

    Sqlserver2005でテーブルを作成してい分からなかったので質問します。 [テーブルA]  {フィールド1}主キー   (データ1000)   (データ1001)   (データ1002) これを親とするテーブルBを作成して [テーブルB]  {フィールド1}主キー{フィールド2}主キー  (データ1000)   (データ1001)  (データ1001)   (データ1002)  (データ1002)   (データ1003) [テーブルB]の{フィールド1と2}を[テーブルA]の {フィールド1}にリーレーションを張って [テーブルA]の{フィールド1}のデータが消した時に[テーブルB]の{フィールド1,2} のデータ、どちらかに該当するデータがあった場合に行ごと削除したいので {フィールド1,2}のリレーションシップの設定の「DeleteRule」を2つとも「重ねて表示」としたいのですが 「パスが循環するか、複数のパスに連鎖する可能性があります。ON DELETE NO ACTION、ON UPDATE NO ACTION、を指定するか、他の FOREIGN KEY 制約を変更してください。 制約を作成できませんでした。以前のエラーを調べてください。」 と表示されて出来ませんこの場合フィールド1,2どちらか1つのフィールドしか DeleteRule「重ねて表示」に設定できないのでしょうか? こういう風に分岐する道筋を明記するテーブルを作りたいのですが 1━┳2    ┗3   自分の作ったテーブルの構造が良くないかもしれないので上に書いてあるような テーブルでは駄目だという方もどういったテーブル構造が良いのか教えて欲しいです

  • テーブルの列名をデータとして設定しておき取得する

    テーブルが2つあるとします。 テーブルAにはテーブルBの列名がデータとして登録されてます。 テーブルBには値が格納されてます。 テーブルA Key  field1  field2  field3 ------------------------------ 1   item2  item3  item5 2   item1  item2  item5 ------------------------------ テーブルB Key  item1  item2  item3  item4  item5 -------------------------------------------- 1    101   205    350   420   510 2    111   112    113   114   115 -------------------------------------------- ここでテーブルAとテーブルBへキーを指定して、 テーブルAのfield1~field3に登録されたすべての列名を元にテーブルBから値を取得したいです。 例として キー1を指定して取得すると 205,350,510 が取れます (item2,item3,item5の列名をテーブルAで指定した為) キー2を指定して取得すると 111,112,115 が取れます キーをパラメータとして与え、 できれば2つのテーブルを結合し、1回のSQLで取得する方法はありますでしょうか? (1回のSQLでなくても簡易であれば良いですが) よろしくお願い致します。

  • Accessで BテーブルのフィールドをAフールドに書き換えたい。

    初心者ですが宜しくお願い致します。 Aテーブル →[氏名],[名前] Bテーブル →[氏名],[結婚後氏名] (1)上のようなテーブルがあります。クエリで、AテーブルとBテーブルの[氏名]フィールドをキーにしてリレーションを組み、A,Bテーブルのフィールド全てを表示させます。 (2)(1)で抽出されたデータだけ、Aテーブルの[氏名]フィールドをBテーブルの[結婚後氏名]フィールドに書き換えたいのですが・・・・ なにかよい方法はありますでしょうか。 詳しい方、教えてください。 宜しくお願い致します。

  • Access2000 のテーブルの構造を複写

    マシンAとマシンBにそれぞれ Access2000 がインストールされています。 マシンAでAccess2000 でデータベースがすでに存在します。 このデータベースには複数のテーブルが存在して、そのうちあるテーブル(「テーブルA」とします) とまったく同じ構造のテーブル(データは転送不要)を マシンBにもってくるにはどうすればいいでしょうか? マシンBのデータベース名は別の名称で、かつ、マシンAのDBファイルをマシンBに複写できないのですがどうすればいいでしょうか? (テキストファイル程度ならマシンBにもってこれるという前提です) フィールド数が2個程度なら手入力も考えたのですが・・・

  • SQL Server 2000でテーブル内容を同一

    MS SQL Server自体が初心者なので、初歩的な質問だと思いますが、 Enterprise Managerを使って、Aというデータベースの「tbl」というテーブルの内容を、「tbl_new」というテーブルに全てコピーするには、どうすればよいのでしょうか?フィールドの内容は同一です。 ちなみに、両方のテーブルにいくつかデータが存在していて、「tbl」が正しいデータになっています。 同じキーがあれば更新して、キーがなければ追加したいのです。 一度テーブルを消して、コピーするなどの方法が依存関係の都合でできないので、データだけ移したいと思っています。 Enterprise Managerのどの機能を使えばよいのかもわからない状態ですが、よろしくお願いします。

  • フォームから2つのテーブルにデータを書き込みたい

    Accessで T_aテーブルとT_bテーブルがありそれぞれのフィールドが以下のようになっているとします。 T_a:フィールド名 データ型    ID  オートナンバー型    商品番号 テキスト型 主キー T_b:フィールド名 データ型    ID  オートナンバー型 主キー    商品番号 テキスト型 このときフォームから入力したデータをそれぞれのテーブルの商品番号に追加したいのですがどのようにすればよいのでしょうか。  よろしくお願いいたします。

  • 複数のテーブルから登録順にデータ取得

    複数のテーブルから登録順にデータ取得なんてことできるのでしょうか? table_A A_id int A_time timestamp A_title text table_B B_id int B_time timestamp B_title text とtable_A table_Bにデータが存在するときに AB関係なく A_titleもしくはB_title を登録順のA_timeもしくはB_time 順に10個とかSQL一発でかけるのでしょうか? そもそもこのような作りにするな!ということでしょうが・・・

  • テーブルとテーブルを結合したい

    同じフィールドを持つテーブル同士のデータを結合して、別のテーブル又はクエリに表示させたいのですが、こんなことできますか?できるとすればどうすればよいのですか? 例:テーブルAの商品フィールドのデータとテーブルBの商品フィールドのデータを一つにまとめてテーブルC又はクエリCに表示させたい。

  • Accessで2つのテーブルのデータの整合性を確認したい

    Accessで2つのテーブルのデータの整合性を確認したいのですが、よい方法を教えていただけませんか? 状況は以下のとおりです。 Aテーブル    a   b    c   d   e       1  111  222  333  444  555 2  666   777 888 999 100 3   110 112 113 114 115 Bテーブル    a   b    c   d   e       1  111 222 333 444 555 2  666 777 000 999 100 3   110 112 300 400 500 ・AテーブルとBテーブルがあり、それぞれのテーブルのa、b、dフィールドのみを対象に、その値がAテーブルとBテーブルとで等しいかどうか調べたい。 (c、eフィールドの値が異なっていても、a、b、dフィールドの値が同じであればそのレコードはOKとし、a、b、dフィールドで1つでも異なる値があればNGとし、抽出したい。 例えば、Bテーブルの1、2レコードはOKだが、3レコードはNG) ・それぞれのテーブルのaフィールドが主キーになっている。 うまく説明できず、わかりにくいかもしれませんが、よろしくお願いします。

  • 複数テーブルの結合

    テーブル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 よろしくお願いします