Как правильно хранить пользовательский тест / ответ на тест?

1

Я создаю тест/тестовое приложение. Он имеет 2 таблицы в базе данных.

Первый, таблица викторины:

quizes
--------
title
.....
questions

Структура вопросов

{
"answer": "rightanswer", 
"index": 0, 
"question": "What is the right answer?", 
"answers": [
     "answers1", 
     "answers2", 
     "answers3", 
     "answers4"
   ], 
}

И у меня есть отдельная таблица для хранения ответов пользователей (user_answers).

user_answers
-----
id
quiz_id
.....
answers

Итак, мой вопрос в том, как правильно хранить ответы пользователей.

Первый путь:

Как только пользователь откроет страницу викторины, скопируйте все вопросы в столбец user_answers/answer. И просто поставите под сомнение его ответ и отметьте, а затем обновите user_answers/answer.

Второй путь

Как только пользователь откроет страницу с инициативой об закладке:

{
  "index": 0
  "mark": 5
}

После ответа нажимайте этот json на массив и обновите user_answers/answer, и каждый раз просто объединяйте вопросы и ответы с массивами вроде:

for (let i = 0; i < questions.length; i++) {
    for (let j = 0; j < userAnswers.length; j++) {
        if (userAnswers[j].index == i) {
            questions[i].mark = userAnswers[j].mark;
         }
     } 
 }

Оба способа имеют недостатки. Во-первых, вы должны много раз копировать вопросы. Во втором цикле потребуется много времени, если у викторины много вопросов.

Итак, каков правильный путь?

  • 2
    Время дать каждому вопросу и каждому ответу уникальные идентификаторы. Затем дайте каждому ответу question_id, и тогда у вас будут отношения, соответствующие им, независимо от того, как они хранятся
Теги:
database
algorithm

3 ответа

0
Лучший ответ

Я могу предложить лучший способ сохранить ваши вопросы. Допустим, у вас есть схема вопросов:

{ 
  "qid" : 0,
  "question": "What is the answer",
  "answers": [
    { "text" : "Answer one" , "isAnswer" : false },
    { "text" : "Answer two" , "isAnswer" : false },
    { "text" : "Answer three" , "isAnswer" : true }
  ]
}

А для схемы ответов

{
  "quizId" : 10,
  "qid" : 0,
  "answerId" : 0 // <- here index , but you can take unique answer ids also for a question
} 

таким образом вам просто нужно запустить один цикл, чтобы получить ответы, или написать небольшой сложный агрегированный запрос, чтобы получить ответы

  • 0
    Кроме того, вы можете включить вопросы, где в этой схеме возможно несколько ответов
0

Это зависит от вас, кроме того, я предпочитаю, чтобы позже, ваше второе решение - это цикл, и это происходит на клиентской машине, так что это не слишком важно! Я думаю, что он достаточно быстрый, чтобы генерировать 1000 вопросов меньше секунды, так что это нормально!

0

я бы, наверное, просто стол

CREATE TABLE 'answers' (
  'id' INTEGER NULL AUTO_INCREMENT,
  'user_id' INTEGER,
  'quiz_id' INTEGER,
  'quiz_question_id' INTEGER, 
  'answer' VARCHAR(200),
  PRIMARY KEY ('id')
);
CREATE UNIQUE INDEX no_duplicate_answers ON answers (user_id,quiz_id,quiz_question_id);
  • 0
    Это хорошее решение, но не в моем случае. У меня более 5000 тестов, поэтому я решил сохранить его в формате JSON.
  • 1
    @NickD Это самая глупая вещь, которую я когда-либо слышал. «Более 5000 тестов» означает, что вы переросли файл JSON около 4900 тестов назад.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню