Получение последнего идентификатора ответа на вопросы - PullRequest
0 голосов
/ 28 сентября 2011

В тесте 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

Здесь с помощью метки времени я могу найти последний ответ для любого конкретного вопроса.

Теперь вопрос в том, какой метод следовать и какой будет ориентирован на производительность?
Или лучшее предложение для того же? Должен ли я пойти с методом: 1 и применить индекс для столбца uid, ansid?

Ответы [ 2 ]

2 голосов
/ 28 сентября 2011

Если ваш идентификатор автоинкрементный, вы можете получить последний ответ на основе идентификатора:

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

О производительности: вы должны поместить некластеризованный индекс в Uid, Qid, ID и Включить AnsID.

Вы можете избежать использования столбца меток времени в этой таблице.

0 голосов
/ 28 сентября 2011

1: Для первого метода:

Чтобы получить идентификатор последнего ответа для данного идентификатора вопроса, вы можете использовать этот скрипт:

   --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, это может привести к неверным результатам.

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;
...