Я создаю тест/тестовое приложение. Он имеет 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;
}
}
}
Оба способа имеют недостатки. Во-первых, вы должны много раз копировать вопросы. Во втором цикле потребуется много времени, если у викторины много вопросов.
Итак, каков правильный путь?
Я могу предложить лучший способ сохранить ваши вопросы. Допустим, у вас есть схема вопросов:
{
"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
}
таким образом вам просто нужно запустить один цикл, чтобы получить ответы, или написать небольшой сложный агрегированный запрос, чтобы получить ответы
Это зависит от вас, кроме того, я предпочитаю, чтобы позже, ваше второе решение - это цикл, и это происходит на клиентской машине, так что это не слишком важно! Я думаю, что он достаточно быстрый, чтобы генерировать 1000 вопросов меньше секунды, так что это нормально!
я бы, наверное, просто стол
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);