在M.C.Q测试中,当用户再次回到同一问题时,我如何追踪问题的最后答案?,
以下是表格结构
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列上应用索引吗?
答案 0 :(得分:2)
如果您的ID是自动增量,则可以根据Id:
获得最后一个答案SELECT TOP 1 AnsID
WHERE Uid=@UserId AND Qid=@QuestionID
ORDER BY Id DESC
关于性能:您应该将非聚集索引放在Uid AND Qid AND ID和Include AnsID上
您可以避免在此表中使用timestamp列。
答案 1 :(得分: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.id
给出的。我还假设temptblUserAnswer.id
是IDENTITY(1,1)
。
问题:如果某人在temptblUserAnswer
表上运行ad-hoc插入,则可能会得到错误的结果。
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;