0

サンプル ケース シナリオ - チェックボックスとして 1 つの質問と複数の回答を含むフォームがあるので、複数選択できます。回答を格納するテーブルは次のとおりです。

QuestionAnswers
(
  UserID int,
  QuestionID int,
  AnswerID int
)

ストアド プロシージャを使用してこれらの回答をデータベースに更新する最良の方法は何ですか? さまざまな仕事で、以前の回答をすべて削除して新しい回答を挿入することから、削除する回答のリストを渡し、保存されたプロシージャに追加する回答のリストを渡すことまで、すべてのスペクトルを見てきました。

私の現在のプロジェクトでは、パフォーマンスとスケーラビリティが非常に重要です。

ありがとう!アンドレイ

4

6 に答える 6

1

テーブルのデザインを選択でき、次のステートメントが当てはまる場合:

  • 質問ごとの最大選択肢数を知っています/
  • 各選択肢は、単純なチェック/チェック解除です。
  • 各回答は、何らかのスケールでマークするのではなく、正解/不正解として分類されます。(70%が正しいように。)

次に、パフォーマンスを考慮して、提示した表の代わりに次の表を検討します。

QuestionAnswers
(
  UserID int,
  QuestionID int,
  Choice1 bool,
  Choice2 bool,
  ...
  ChoiceMax bool
)

はい、正規化に関しては醜いですが、非正規化によりパフォーマンスが向上し、クエリが簡素化されます.1つの質問に対して1つの更新/挿入のみです. (そして、影響を受ける行がゼロに等しい場合にのみ、最初に更新して挿入します。)

また、答えが正しかったかどうかの検出もより簡単になります。次の表を使用します。

QuestionCorrectAnswers
(
  QuestionID int,
  Choice1 bool,
  Choice2 bool,
  ...
  ChoiceMax bool
)

QuestionCorrectAnswersユーザーが回答したのと同じ選択肢の組み合わせで行を検索するだけです。

于 2009-12-20T22:36:15.787 に答える
0

古いスレッドを復活させて申し訳ありません。唯一の現実的な解決策は、その質問に対するすべての回答を削除し、チェックボックスがオンになっている新しい行を作成することだと思いました。更新に関しては、回答ごとに列を設定するのが効率的かもしれませんが、このアプローチの柔軟性の欠如は選択肢ではありません。データベースを再設計せずに、質問にオプションを追加できる必要があります。

削除して再挿入するだけです。これが、データベースが大量のデータ行を実行、保存、および取得するように設計されていることです。

于 2010-06-24T02:23:36.960 に答える
0

私は摂政の答えが非正規化されていることに同意しません。各回答が別の列に依存せず、キーのみに依存している限り、それは第3正規形です。これは、顧客名の次のフィールドを持つテーブルと同じです。

CustomerName
(
    name_prefix
    name_first
    name_mi
    name_last
    name_suffix
    city
    state
    zip
)

と同じ

QuestionAnswers
(
   Q1answer1
   Q1answer2
   Q1answerN
)

名前の「質問」と記入されているかどうかわからない複数の回答と、フォームの「質問」と選択されているかどうかわからない複数の回答の間に実際の違いはありません。

于 2010-03-02T15:05:01.267 に答える
0

これは簡単な解決策です。すべての [回答] は整数値 (ビット) を持つ必要があり、この値は現在の質問に対して一意です。たとえば、質問 1 と 4 つの定義済みの回答があるとします。

【回答】 【ビット値】

回答1 0x00001

回答2 0x00002

回答3 0x00004

回答4 0x00008 ...

したがって、SQL INSERT/UPDATE は次のようになります。

declare @checkedMask int
set @checkedMask = 0x00009 -- answer 1 and answer 4 are checked
declare @questionId int
set @questionId = 1

- 消去

delete
--select r.* 
r 
from QuestionResult r 
    inner join QuestionAnswer a  
        on r.QuestionId = a.QuestionId and r.AnswerId = a.AnswerId
where r.QuestionId = @questionId
 and (a.mask & @checkedMask) = 0

- 入れる

insert QuestionResult (AnswerId, QuestionId)
    select
        AnswerId,
        QuestionId
    from QuestionAnswer a
       where a.QuestionId = @questionId
         and (a.mask & @checkedMask) > 0
         and not exists(select AnswerId from QuestionResult r 
                where r.QuestionId = @questionId and r.AnswerId = a.AnswerId)
于 2009-12-26T19:53:13.543 に答える