5

私はオンライン調査に取り組んでいます。ほとんどの質問には、回答の 1 ~ 5 のスケールがあります。調査に質問を追加する必要がある場合は、適切なテーブルに INSERT を実行する単純な Web フォームを使用します。アンケートは新しい質問を投げかけています。新しいコードやデータベース構造の変更はありません。

さまざまなデータ型の回答を持つことができるアンケートの質問を追加するよう求められています。仕様は、調査を「構成可能」にすることであり、将来の任意の時点で、「{text answer question}、{1-5 question}、{true false question} を尋ねる新しい調査が必要です」と言ったときに、 , {回答として日付を含む質問}", データベース構造を変更せずにそれを行うことができます.

私はそれらの答えを保存する最善の方法を考えようとしていますが、私が思いついた方法はどれもややハックのようです.

はい/いいえまたは真/偽の答えを持つ質問もあれば、整数の答え (「この 1 か月でテクニカル サポートを利用した回数は?」) を持つ質問もあれば、日付、文字列、複数の数字を持つ質問もあります。単一の値を持つ選択肢、複数の値を持つ複数の選択肢など。または、特定の回答値によってサブ質問が表示される場合があります (「何があなたを失望させましたか...?」)。

簡単な解決策は、各質問を調査の列として、その回答を調査の列として、それを調査の列として質問するかどうかを指定することです。これは私には混乱のように感じます。これは 1 つの大きなテーブルです。あまり「関係的」ではありません。

ブレーンストーミング、私が思いつく「最良の」方法は、回答の種類ごとに異なる表を用意することですが、データの整合性の問題が発生しやすいと感じています。言い換えれば、私は持っているだろう

CREATE TABLE `Questions` (...);
CREATE TABLE `TrueFalseAnswers` (...);
ALTER TABLE `TrueFalseAnswers`
  ADD CONSTRAINT `TrueFalseAnswers_ibfk_1` FOREIGN KEY (`question_id`)
REFERENCES `Questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
CREATE TABLE `TextAnswers` (...);
ALTER TABLE `TextAnswers`
  ADD CONSTRAINT `TextAnswers_ibfk_1` FOREIGN KEY (`question_id`)
REFERENCES `Questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

上記の問題の 1 つは、DDL だけでは、任意の質問に対して少なくとも 1 つだけの回答が存在することを保証できないことです。

もう 1 つの解決策は、質問テーブルに回答用のバイナリ列または文字列列を用意し、すべての回答を何らかの文字列またはバイナリ形式にエンコードして、回答列に格納することです。これにより、すべての質問に対して少なくとも 1 つだけの回答が得られますが、その後、SQL クエリの集計機能にアクセスできなくなります。これは、あまり「リレーショナル」なソリューションではないと思います。

ですから、上で概説したアイデアには問題があると思います。この問題を解決する「最善の」方法はありますか?

時間をかけて問題と私の考えを言語化した今、私が提起している大まかな問題は、「コーディングを行わずに任意の型のデータを保存したい...」ということのようです。絶望的?

私は MySQL を使用しているため、他の RDBMS にアクセスすることはできません。

4

4 に答える 4

7

回答の種類を指定する列を使用しますが、回答をテキストとして保存します。アプリケーションまたはフロント エンドは、 answer_type 列を使用して、エンド ユーザーに表示するもの (テスト ボックス、ラジオ ボタン、日付ピッカー) と、データベースに送信する前に検証する方法を決定できます。

于 2009-11-19T16:16:57.647 に答える
2

QuestionType クラスに対応する QuestionType テーブルを作成します。ユーザーが入力した永続的な回答を自由形式のテキストにすることを許可し、回答の意味を判断するのは QuestionType に任せます。

したがって、それが真/偽の場合、答えは「T」または「F」になる可能性があります。

複数選択の場合、回答は選択された選択肢のインデックスになる可能性があります。

ユーザーが入力するテキスト ボックスの場合は、入力したテキストを保存します。

于 2009-11-19T16:16:04.950 に答える
2

私がポーズをとっているのは、「コーディングせずに任意の型のデータを保存したい...」です。これは絶望的ですか?

はい、ほとんどです。あなたが提起している問題に対する「良い」解決策はありません。「最高」とは、Dave Swersky と Larry Lustig が説明したとおりです。

質問、可能な回答 (複数選択の場合)、および質問の種類を格納する質問テーブル

テキストとしてシリアル化された、質問への回答 (FK to Question テーブル) を格納する Answer テーブル。Varchar(4000) または TEXT データ型。どうしても必要な場合を除き、前者を推奨します。

質問に指定されたタイプに基づいて値が何を意味するかを判断するのは、アプリケーション ロジック次第です。

于 2009-11-19T16:22:48.400 に答える
0

dataType で指定されたテーブルを使用することもできるので、整数、日付、文字列などのテーブルです。そこから、質問 (テーブル) を適切な dataType テーブル + 主キーにリンクする、回答用の 1 つのテーブル。

すべての質問と回答の 1 つの概要を把握するには、その上にビューを作成し、すべての dataType をビュー内のテキストにキャストするだけです。

于 2014-06-11T07:45:13.490 に答える