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 和 Include 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;

在这种情况下,我假设最后一个答案是由 last 给出的temptblUserAnswer.id。我也假设temptblUserAnswer.idIDENTITY(1,1). 问题:如果有人在表上运行临时插入,temptblUserAnswer则可能会得到错误的结果。

2:对于第二种方法:

您应该使用精度更高的日期/时间数据类型(对于 SQL 版本<=SQL2005:DATETIME 是唯一选项,对于 SQL 版本>SQL2005,您可以使用 DATETIME2(7) 数据类型和 SYSDATETIME() 函数而不是 GETDATE() /CURRENT_TIMESTAMP 函数)。即便如此,您也可以得到两个或多个相同的答案timestamp。在这种情况下,您可以使用“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 回答