- ベストアンサー
複数チェック項目に対応したスキーマの定義方法
個人の音楽に対する嗜好情報を格納する為のデータベースのスキーマを定義するとします。 扱う項目は以下の4項目とします。 1.名前 2.住所 3.好きなアーティスト 4.好きなアーティストをどこで知ったか(複数選択:新聞、雑誌、インターネット、ラジオ、その他) 4の項目に関しては、それぞれの選択項目をチェックボックスで複数チェックできるようになっていて、「その他」をチェックした場合は、そのアーティストをどこで知ったかテキストボックスに書き込むようにします。 このような情報を以下のような定義のテーブルを作成し、格納しようとしました。 CREATE TABLE ONGAKU_INFO ( 個人コード CHARACTER(4) NOT NULL , 名前 VARCHAR(32) NOT NULL , 住所 VARCHAR(256) NOT NULL , 好きなアーティスト VARCHAR(32) NOT NULL , 好きなアーティストをどこで知ったか VARCHAR(128) ); 「好きなアーティストをどこで知ったか」についてはチェックボックスで選択された項目をそれぞれ「/」でつなげてひとつのフィールドに格納し、取り出すときは「/」で分割しようというわけです。例えば「新聞」「雑誌」「インターネット」をチャックしたら「新聞/雑誌/インターネット」としてひとつのフィールドに書き込むわけです。 しかしこの方法だと「好きなアーティストをどこで知ったか」の選択項目が増えると128byteを超え、格納できなくなってしまいます。その度にスキーマの定義を変更したりするのはスマートなやり方ではないと思います。 このように「好きなアーティストをどこで知ったか」の選択項目が増えても対応できるようなスキーマの定義の方法を教えていただけないでしょうか。 宜しくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>■「個人情報」テーブル >・個人コード >・名前 >・住所 >・好きなアーティスト > >■「知ったか」テーブル >・個人コード >・ID >・好きなアーティストをどこで知ったか これでもよいかもしれませんが私だったら ■「どこで知ったか」テーブル ・個人コード ・シーケンス番号 ・どこID ■「どこ」テーブル ・どこ ・どこID として結果はSQL文として SELECT 個人情報.名前, 個人情報.住所, 個人情報.好きなアーティスト, どこ.どこ FROM どこ INNER JOIN (どこで知ったか INNER JOIN 個人情報 ON どこで知ったか.個人ID = 個人情報.個人ID) ON どこ.どこID = どこで知ったか.どこID; みたいなことで如何でしょうか
その他の回答 (2)
私だったら「個人情報」と「好きなアーティスト」テーブルに分け、リレーションを取ります。
補足
リレーションをとる言うことは以下のようなことでしょか。 下記のようにテーブルを分けます、項目を定義したとします。。 ■「個人情報」テーブル ・個人コード ・名前 ・住所 ・好きなアーティスト ■「好きなアーティストをどこで知ったか」テーブル ・個人コード ・シーケンス番号 ・どこで知ったか 個人コードとシーケンス番号の2つの組み合わせで一意のキーとする。例えば個人コード「001」の山田さんが「さだまさし」を「インターネット」「ラジオ」で知った。また個人コード「002」の佐藤さんが「キロロ」を「新聞」「その他:レコード店」で知ったとしたら「好きなアーティストをどこで知ったか」テーブルは以下のようになる。 個人コード シーケンス番号 どこで知ったか 001 1 インターネット 001 2 ラジオ 002 1 新聞 002 2 レコード店 以上のようなテーブル構成で間違っておりませんでしょか。
- taka451213
- ベストアンサー率47% (436/922)
こんにちは。 Oracleなら、ネストした表などを使えばすっきりしますが・・・。 多分ハズシてますね・・・。 (^^ゞ
お礼
ご回答ありがとうございます。使用するデータベースはPostgreSQLです。情報が足りなく申し訳ございませんでした。
お礼
お礼が遅くなってすみません。仰せのとおりで設計することにいたしました。現在この設計で開発中ですが特に大きな問題もなく、開発も順調です。 ありがとうございました。