質問の回答

SQL(DB設計)の質問です。お客様に対して、アンケートを作成したいと考えています。過去のアンケートを行った内容を閲覧できることと、過去のお客様が入力したアンケート結果も閲覧することができるようにしたいです。DB設計として相応しい方法を教えてください。(具体的には、1つ1つのアンケート結果ごとに、カラムを増やしていく方法、アンケートごとにテーブルを作成する方法…)よろしくお願いいたします。

昨日の回答の続き。

前提

ここで言っているアンケートはこんな感じ。

1,質問文1

2,質問文2

3,質問文3


つまり、質問文がただ並列に並んでいるだけで入れ子の状態。

1,質問文1

1−1 質問文1−1

1−2 質問文1−2

2,質問文2

3,質問文3

のようにならないこと。
このような場合があり得る場合は質問明細明細番号のようなカラムを追加しておくことで対処する。
1,質問文1
のような場合はその質問明細明細番号は0にするとかルールを決めておけばプログラム言語側で対処できる問題であると考える。

一つの解決方法

複数回アンケートを採ったときはこのように取得します。
たとえば第一回目のすべてのアンケートを取るにはこう。

前項であげた質問文1とか質問文2とか言うところが質問明細番号に相当し何回目のアンケートかというところが質問番号にそうとうする。日本語がまずかったらよいと思われる表現方法に改めるとよろしいかと。

select * from 質問 where 質問番号 = '1' order by 回答者,質問番号,質問明細番号

正規化という意味では質問文を質問番号として質問文テーブルなるものを定義するとよいかと思います。回答者もそれが限られた人ならば回答者マスタみたいのを作って質問テーブルには回答者番号とするとよいでしょう。

create table 質問文(
質問番号 varchar2(10),
質問明細番号 varchar2(3),
質問文 varchar2(400),
primary key (質問番号,質問明細番号)
)

create table 質問(
質問番号 varchar2(10),
質問明細番号 varchar2(3),
回答者 varchar2(20),
回答文 varchar2(400),
primary key (質問番号,質問明細番号,回答者)
)

こういった場合ですと2回目のアンケートを取るには

select
質問.質問番号,
質問.質問明細番号,
質問文.質問文,
質問.回答者,
質問.回答文
from
質問,質問文
where
質問文.質問番号 = 質問.質問番号 and
質問文.質問明細番号 = 質問.質問明細番号 and
質問文.質問番号 = '2'
order by
質問.回答者,
質問.質問番号,
質問.質問明細番号


のようなクエリでよいと思う。すると次のようなイメージでとれてくるものと思われる。

質問.質問番号 質問.質問明細番号 質問文.質問文 質問.回答者 質問.回答文
2 1 hoge1 kaito1 fuga1
2 2 hoge2 kaito1 fuga2
2 3 hoge3 kaito1 fuga3
2 1 hoge1 kaito2 fuga4
2 2 hoge2 kaito2 fuga5
2 3 hoge3 kaito2 fuga6


あとは、プログラム言語側で望む形に整形して表示してあげればよろしいかと。