[pgsql-jp: 27473] Re: 項目があったりなかったりするテーブル設計について。

Takashi Adachi adachi @ ikic.co.jp
2002年 9月 27日 (金) 03:34:37 JST


伊藤さん、こんにちは。

> ・回答テーブルに通常なら選択された値をレコードに
>  格納するだけだが、
>  ひとつ項目が増える事もイレギュラー的に発生するので、
>  回答テーブルどう設計するか。

ここがどういう意味かよくわからないのですが
1つの質問に対して複数の回答がある場合があるということでしょうか?

↑と仮定して

> クライアントがレイアウトした(内容も含む)フォームを公開し、
> クライアントの顧客がそれに答えて送信する。
> 送信されたデータを取り込む。

とするとこんなのは如何でしょうか?


質問目的T (アンケートの実施目的)
  ・質問目的ID(PK)
  ・質問目的内容

質問T (アンケートの質問内容)
  ・質問目的ID(PK) ← 質問目的Tの同項目
  ・質問ID(PK)
  ・質問内容

回答選択肢T (アンケートの質問に対する回答選択肢)
  ・質問目的ID ← FK:質問Tの同項目
  ・質問ID(PK) ← FK:質問Tの同項目
  ・選択肢ID(PK)
  ・選択肢内容
  ・選択肢区分 ← 1:選択のみ、2:テキスト(ユーザーが任意入力可)

回答T
  ・回答者ID(PK)
  ・回答日時(PK)
  ・質問目的ID(PK) ← FK:質問Tの同項目
  ・質問ID(PK) ← FK:質問Tの同項目
  ・回答SEQ(PK)
  ・回答ID ← 回答選択肢T.選択肢IDと存在チェック
  ・任意入力内容 ← 回答選択肢T.選択肢区分が2の時のみ使用


回答Tは

  ・回答IDもPK(FK:回答選択肢T.選択肢ID)にしてしまう。
   → この場合FKは全部回答選択肢Tからですね。
     この方が回答IDは参照整合性でチェックできるから楽といえば楽ですね。

  ・回答Tを2つに分けて任意入力内容のみを保持するテーブルを作っておく。

ってのもありかと。


言うまでもないと思いますがお気楽気分で気の向くままに書いたので
これでいいかは精査して下さいね。

#テーブル設計なので「唯一解」というのはないと思いますし
#これがすっきりしているかと問われると疑問だし・・・







pgsql-jp メーリングリストの案内