人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: disca
●カテゴリ:コンピュータ 生活
✍キーワード:dB SQL お客様 アンケート カラム
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● Asuca
●5ポイント

http://readygo.s8.xrea.com/php/php_fs06.php

マルチアンケートEX

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

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

◎質問者からの返答

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


2 ● esecua
●5ポイント

http://hatena.jp/

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


まずテーブルの作成ですが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()を使用すればすべて表示できるか思います。又、カテゴリーなどの違うアンケートごとに自動的にテーブルを作成するとなると更に別の機能が必要になるのではないでしょうか?


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

◎質問者からの返答

ありがとうございます。

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

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


3 ● tomo_k
●10ポイント

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

ともの日記

URLはダミーです。


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


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

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

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

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


create table 質問 (

質問番号 varchar2(10),

質問明細番号 varchar2(3),

回答者 varchar2(20),

質問文 varchar2(400),

回答文 varchar2(400),

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

)

◎質問者からの返答

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

--

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

DBはPostgreSQLで考えています。


4 ● ictelnet
●10ポイント

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万件程度なら現在のサーバ性能なら問題なしです。

◎質問者からの返答

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

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


5 ● ictelnet
●40ポイント

http://www.yahoo.co.jp/

Yahoo! JAPAN

二度目です。


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

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

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

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

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

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

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

00000001 001 年齢

00000001 002 趣味

00000001 003 運転免許有無


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

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


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

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

00000002 田中博一 2006/02/01 nil


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

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

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

◎質問者からの返答

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


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ