首页 > 解决方案 > 存储用户测验/测试答案的正确方法是什么?

问题描述

我构建测验/测试应用程序。它在数据库中有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

第二种方式

一旦用户打开测验页面初始化蓝图 json:

{
  "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;
         }
     } 
 }

两种方式都有缺点在第一种方式中,您必须多次复制问题。如果测验有很多问题,第二个循环将花费大量时间。

那么正确的方法是什么?

标签: javascriptjsondatabasealgorithm

解决方案


我可以建议一种更好的方法来存储您的问题,假设您有一个问题模式:

{ 
  "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
} 

这样你只需要运行一个循环来得到答案,或者编写一个稍微复杂的聚合查询来得到答案。


推荐阅读