SQL(DB設計)の質問です。

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/02/14 15:25:44
  • 終了:--

回答(6件)

id:Asuca No.1

Asuca回答回数281ベストアンサー獲得回数42006/02/14 15:34:24

ポイント5pt

PHP版 アンケートスクリプト

スクリプト配布してますから役に立ちませんか?

id:disca

ありがとうございます。サンプルソースの場合ですとDBを使うものであれば助かります。

2006/02/14 16:58:08
id:esecua No.2

esecua回答回数510ベストアンサー獲得回数102006/02/14 17:37:58

ポイント5pt

私も超初心者ですので全く自信はありませんが一応参考になればと思います。


まずテーブルの作成ですがMySQLでよろしいのでしょうか?そうだと以下はどうでしょう?

CREATE TABLE question(

idques INT PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(30),

ques1 TEXT,

ques2 TEXT,

ques3 TEXT

);


一応、ローカル環境でテストしました。以上のSQLをアプリケーションにあわせ書き換えphpMyAdminなどの”SQL”から実行しテーブルを作成します。


あとはアンケートのWebアプリですがPHPで作成するのがBestかと。

まずお客様がアンケートを入力できるようにフォームを作成します。

<form action=”hoge.php” method=”post”>


<input type=”txt” name=”name” />

<input type=”txt” name=”ques1” />

    ・

    ・

<input type=”submit” value=”OK” />

</form>


フォームから送られてきたデータをDBに登録するためのアプリ

<?php

$na = $_POST[’name’];

$na = mysql_escape_string($na);


$ques1 = $_POST[’ques1’];

$ques1 = mysql_escape_string($ques1);

   ・

   ・

if(!$con = mysql_connect($dbhost, $dbuser, $dbpassword)){

die(””);//エラーメッセージ

}

mysql_select_db($dbname, $con);


if($na == ””){

//エラーメッセージを表示

  ・

  ・

}eles{

$sql = ”INSERT INTO question(name,ques1,ques2,ques3) VALUES (’”.$na.”’,’”.$ques1.”.......);”;

mysql_query($sql,$con)

or die(”エラー”);

print (””);//完了メッセージを表示

}

?>


これで多分最低限機能するとおもいます。アンケート結果を観覧するアプリの場合は while()を使用すればすべて表示できるか思います。又、カテゴリーなどの違うアンケートごとに自動的にテーブルを作成するとなると更に別の機能が必要になるのではないでしょうか?


間違っていたりしたらごめんなさい。

id:disca

ありがとうございます。

>アンケートごとに自動的にテーブルを作成するとなると

今回の質問は、「違うアンケートを取った場合」の「質問」と「回答」テーブルの配置方法です。

2006/02/15 10:00:02
id:tomo_k No.3

tomo_k回答回数426ベストアンサー獲得回数262006/02/14 20:05:14

ポイント10pt

URLはダミーです。


どのような形式のアンケートかはわかりませんが、データとして質問と回答がある場合、それぞれの質問に対して質問番号のようなものを振っていくことでDBに入ると思います。


仕様がよくわかりませんけどテーブル定義例を示しておきました。カラム名はわかりやすくするために日本語で書いていますが実際は英数字で書いてください。

また、Oracleな方言が混じっているかもしれません。

一つの質問で複数の設問をもうけることを考慮し質問明細番号を作りました。一回の質問で何問かの質問をすることがこれでできると思います。

また、過去のアンケートについて検索するために質問番号というものをもうけてあります。


create table 質問 (

質問番号 varchar2(10),

質問明細番号 varchar2(3),

回答者 varchar2(20),

質問文 varchar2(400),

回答文 varchar2(400),

primary key (質問番号,質問明細番号,回答者)

)

id:disca

ご回答、ありがとうございます。この場合ですと、複数回アンケートを取った場合、どうなりますでしょうか?

--

具体的には、毎日、不定期にアンケートを実施します。アンケートのログは残します。

DBはPostgreSQLで考えています。

2006/02/15 10:08:53
id:ictelnet No.4

ictelnet回答回数35ベストアンサー獲得回数02006/02/14 22:07:12

ポイント10pt

http://www.mirai.ne.jp/~suehiro/am/kihonyougo/normal.htm

�f�[�^�x�[�X�̐��K��

以下のようなテーブルを作ります。

A_tbl(アンケート回答基本情報)

アンケート一意番号

(データベース内一意のアンケート用紙一枚単位の番号)

アンケートパターン番号

(いろいろなアンケート用紙パターンがあると思うので、そのパターン単位の番号)

基本的なアンケート項目

(アンケートによらず、不変なもの。例えば年齢、地域など)


B_tbl(アンケート回答詳細項目情報)

アンケート一意番号

アンケート項目設定番号

(アンケートひとつの項目に表示順に従って採番)

アンケート項目枝番

(趣味などは複数存在するので、それに備えて番号付け)

アンケート項目

(趣味、職業など)

アンケート回答

(趣味ならゴルフとか)


C_tbl(アンケートパターンマスター)

アンケートパターン番号

アンケート項目設定番号

アンケート項目


要は、正規化してしまえば、あらゆるアンケートに対応できます。

また、アンケート項目それぞれにインデックスを貼ることが出来ますので、検索や集計も有利です。C_tblを主とした外結合問合せを行えば、難なくアンケートに必要なSQL

を書けます。難点はアンケート詳細情報のデータ件数が増えるという点ですね。

これもOracleで30万件程度なら現在のサーバ性能なら問題なしです。

id:disca

ご回答、ありがとうございます。アンケートの質問ごとに、動的にテーブルを作成しない方法は大変参考になります。

今回の悩みのひとつが、質問者もマルチユーザーであるため、具体的に実装するとなると、マルチユーザ数×(A+B+C)のテーブルを作成するべきか、マルチユーザ+A+B+C のテーブルを作成するべきか、それとも、マルチユーザーごとに別DBを作成するべきか、悩んでいます。よろしくおねがいいたします。

2006/02/15 11:25:31
id:ictelnet No.5

ictelnet回答回数35ベストアンサー獲得回数02006/02/15 12:13:43

ポイント40pt

二度目です。


>質問者もマルチユーザーであるため、

マルチユーザの意味が二通り考えられるため、予測して書きます。

①質問者が自分の考えたアンケートを作成してデータ収集する場合。

 これは、ある単一のアンケート用紙が質問者個人に帰属する場合を考えています。

 例 ネット上でアンケートをとりたい人が自分の好みのアンケートを作成して回答を募るような運用

私の提案したテーブル設計でC_tblに関してですが、このテーブルはアンケート用紙をそのままテーブル化したものです。

アンケートパターン番号 アンケート項目設定番号 アンケート項目 

00000001              001      年齢

00000001              002      趣味

00000001              003      運転免許有無


というようにアンケート用紙の原版を作成するイメージです。

で、このアンケートパターン番号は一意ですので、アンケート担当マスタを作ればいいと思います。


アンケートパターン番号 アンケート担当者 アンケート作成日  実施日

00000001          山田陽一    2006/01/10   2006/02/10

00000002          田中博一    2006/02/01     nil


②ある単一のアンケートに対して複数の質問者がデータを収集する場合

 この場合は、例えばビール会社のアンケート用紙を持って複数の人が該当でアンケートを採取するようなイメージ。

 

 この場合は、A_tblに担当者を設定すればよいと思います。

 

id:disca

ありがとうございます。マルチユーザーに関して意味合いが違います。具体的に言いますと、このアンケートシステムを不特定多数のユーザー(マルチユーザー)アカウントを用いて使用するという意味合いになります。

2006/02/17 13:23:22
id:tomo_k No.6

tomo_k回答回数426ベストアンサー獲得回数262006/02/15 23:07:30

ポイント40pt

http://d.hatena.ne.jp/tomo_k/20060215/1140012350

ともの日記 - 質問の回答

2回目です。

回答の方はURLにしめした日記の方に書いておきました。

コメントの内容によっては追記することもあります。

id:disca

ありがとうございます。さっそく拝見したいです。

2006/02/17 13:24:15

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません