- ベストアンサー
テーブルの作り方
一つのコンテンツAにコンテンツBのデータが複数あり、 コンテンツBのにはコンテンツAのデータを複数含むデータがあります。 この関係をデータベースに登録しようと考えているのですが、よい方法が思いつきません。 テーブルA テーブルB ┏━━━━━━━┓ ┏━━━━━━━┓ ┃▲ ▲ ▲ ▲ ┃ ┃● ● ● ● ┃ ┗━━━━━━━┛ ┗━━━━━━━┛ ▲コンテンツB ●コンテンツA 同じキーの同じフィールドに複数のデータを登録させない方向で作ろうと思っています。 よい作りかたはないでしょうか? おねがいします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ご質問のような「テーブルA」「テーブルB」が持つ情報の結び付が多対多の関係の場合、「中間テーブル」を作って双方のテーブルデータの結び付を管理する方法が一般的なようです。 「中間テーブル」についての詳しい説明は、WEB上で解説がされているので調べてみてください。
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
普通は都道府県テーブルと特産品テーブルを別々につくり それぞれ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 `特産品別`;
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
<テーブルB> ID 区分 データ この場合、区分が'A'であるデータが複数あるという関係のような・・・。 が、文面から「そうだ!」とも確定出来ません。 ウーン!という感じです。
お礼
回答ありがとうございます。 ちょっと補足してみます。
補足
例を挙げると、都道府県と特産品のデータがあるとして、 以下の関係をうまいぐあいにデータベースにしたいと考えています。 都道府県 特産品 北海道 ジャガイモ、カニ、メロン 長崎 ジャガイモ、かまぼこ、カステラ 長野 ジャガイモ、メロン 特産品 都道府県 ジャガイモ 北海道、長崎、長野 カニ 北海道 メロン 北海道、長野 かまぼこ 長崎 カステルラ 長崎