测验的数据库结构如何?

时间:2013-09-10 23:44:46

标签: php mysql database

以下是我当前的测验数据库结构的样子:

为了测试和简单,我只提出了3个问题。 这就是我的表(测验)的样子:

| id | score | q1_answered | q2_answered | q3_answered |
--------------------------------------------------------
| 1  | 210   |      0      |       1     |      0      |
| 9  | 380   |      1      |       0     |      1      |
| 5  | 210   |      1      |       1     |      1      |
--------------------------------------------------------

每个问题列的数字从0到1, 0 表示尚未回答, 1 表示已正确回答。

我想知道你们中是否有人想要创造一个更好的结构或更好,更有效率。 是否有一种有效的方法为已解决特定问题的用户添加时间戳?

例如说:如果用户回答问题1,将记录答案的时间并显示。

这种结构可行,但我一直认为如果我再增加50个问题可能效率不高。 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

我会根据你的表创建两个表:

scores
sID score testID
1   210    1
9   380    1
// etc etc

quests
sID testID question answer anstime
1      1    1         0     1231237128961
1      1    2         1     1231237128964
1      1    3         0     1231237128968
9      1    1         1     1231237128961
9      1    2         0     1231237128968

基本上,您正在以一种方式规范化数据,您可以轻松添加更多问题而无需以任何方式修改表格,您仍然可以使用一个很好的干净表来保存易于加入的分数

然后你也可以做更多有趣的查询,比如有多少人在某个时间回答了问题3,很好地汇总了数据,当然,如果要显示所有结果,仍然可以将其加入分数特别ID。

我还在表中添加了两列名为testID的列。这样,您不仅可以跟踪一个测试的多个用户,还可以跟踪多个测试中的多个用户。你将能够看到学生在测试过程中是否有所改善,或者随着学科的继续而逐渐恶化。

编辑:从你的结构中复制数据会有点烦人,但这应该让你开始至少在路径上:

insert into quests (sID, question, answer)
select sID, testID, q1_answered from yourTableName

您可以使用原始表格上的select语句将数据插入到新结构中,如上所示。

答案 1 :(得分:0)

简而言之,您为问题定义了一个表,并为用户提供了答案:

问题: QuestionID,QuestionName,......

回答: AnswerID,UserID,QuestionID,AnswerGiven,AnswerCorrect,DateAnswered

这样,如果添加新问题,则无需更改表结构。

答案 2 :(得分:0)

我不担心50个问题的效率。只是有一些有趣的编程。尝试一下。如果您有一百万个问题或数十万个问题,您可能会开始考虑效率问题。电脑真的很快。