我构建测验/测试应用程序。 它在数据库中有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;
}
}
}
两种方法都有缺点 在第一个中,您必须多次复制问题。 如果测验中有很多问题,第二个循环将花费大量时间。
那正确的方法是什么?
答案 0 :(得分:0)
这取决于你, 除了我更喜欢后者之外,您的第二个解决方案是一个循环,它正在客户端计算机上发生,因此不是太重要! 我认为它的速度足以在不到一秒钟的时间内生成1000个问题,所以还可以!
答案 1 :(得分: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);
答案 2 :(得分: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
}
这样,您只需要运行一个循环即可获取答案,或者编写一个稍微复杂的聚合查询即可获取答案