0

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

为了测试和简单起见,我只提出了 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 个问题,它可能效率不高。任何帮助,将不胜感激。

4

3 回答 3

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 语句将数据插入到新结构中,就像我在上面向您展示的那样。

于 2013-09-10T23:48:23.233 回答
0

简而言之,您为问题定义一个表,为用户给出的答案定义一个表:

问题:问题 ID、问题名称、...

答案:AnswerID、UserID、QuestionID、AnswerGiven、AnswerCorrect、DateAnswered

这样,如果您添加一个新问题,您就不必更改表结构。

于 2013-09-10T23:51:09.280 回答
0

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

于 2013-09-10T23:52:19.363 回答