0

MCQ テストで、ユーザーが同じ質問に戻ってきたときに、その質問に対して与えられた最後の回答をどのように追跡できますか?

以下はテーブル構造です

Method: 1    
temptblUserAnswer
    id   uid   qid   ansid
    1    1     1     5
    2    1     2     6

その特定の質問のテーブル値を更新する必要がありますか?
または
、次のテーブル構造を使用する必要がありますか?

Method: 2    
temptblUserAnswer
    id   uid   qid   ansid   timestamp
    1    1     1     5       2011-09-28 11:54:32
    2    1     2     12      2011-09-28 11:58:40
    3    1     1     7       2011-09-28 12:02:50

ここでは、タイムスタンプの助けを借りて、特定の質問に対する最後の回答を見つけることができます。

問題は、どの方法に従うべきか、そしてどちらがパフォーマンス指向になるかということです。
または、同じことに対するより良い提案はありますか?Method:1 を使用して、uid、ansid 列にインデックスを適用する必要がありますか?

4

2 に答える 2

2

IDが自動インクリメントの場合、IDに基づいて最後の回答を取得できます。

SELECT TOP 1 AnsID
WHERE Uid=@UserId AND Qid=@QuestionID
ORDER BY Id DESC

パフォーマンスについて:非クラスター化インデックスをUid AND Qid AND IDに配置し、AnsIDを含める必要があります

このテーブルではタイムスタンプ列の使用を避けることができます。

于 2011-09-28T07:20:23.980 に答える
0

1:最初の方法の場合:

特定の質問IDの最後の回答IDを取得するには、次のスクリプトを使用できます。

   --index creation
   CREATE UNIQUE INDEX IUN_temptblUserAnswer_qid_id ON temptblUserAnswer(uid,qid,id DESC);

   --query
    DECLARE @QuestionID INT, @UserID INT;
    SELECT @QuestionID=123, @UserID = 456;

    SELECT TOP 1 ansid
    FROM temptblUserAnswer
    WHERE qid = @QuestionID
    AND uid = @UserID
    ORDER BY id DESC;

この場合、最後の答えは最後のによって与えられると仮定しましたtemptblUserAnswer.idtemptblUserAnswer.idまた、私はそれがであると仮定しましたIDENTITY(1,1)。問題:誰かがテーブルに対してアドホック挿入を実行するtemptblUserAnswerと、間違った結果が得られる可能性があります。

2:2番目の方法の場合:

より精度の高い日付/時刻データ型を使用する必要があります(SQLバージョン<= SQL2005の場合:DATETIMEが唯一のオプションであり、SQLバージョン> SQL2005の場合、GETDATE()の代わりにDATETIME2(7)データ型とSYSDATETIME()関数を使用できます。 / CURRENT_TIMESTAMP関数)。それでも、同じで2つ以上の回答を得ることができますtimestamp。この場合、2番目の基準として「temptblUserAnswer.id」列を使用できます。

   --index creation
   CREATE UNIQUE INDEX IUN_temptblUserAnswer_qid_id ON temptblUserAnswer(uid,qid,timestamp DESC, id DESC);

   --query
    DECLARE @QuestionID INT, @UserID INT;
    SELECT @QuestionID=123, @UserID = 456;

    SELECT TOP 1 ansid
    FROM temptblUserAnswer
    WHERE qid = @QuestionID
    AND uid = @UserID
    ORDER BY timestamp DESC, id DESC;
于 2011-09-28T07:46:07.687 に答える