2013-09-10 41 views
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,表示是尚未回答表明它已经被正确回答。

我想知道您是否有任何想法创建更好的结构或更好的效率。 是否还有一种有效的方法为已解决特定问题的用户添加时间戳?

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

这个结构可以工作,但我一直认为它可能不是有效的,如果我要添加说50多个问题。 任何帮助,将不胜感激。

回答

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 

您可以通过使用一个选择将数据插入到新结构就像我在上面向您展示的那样,您的原始表格上的声明

+0

感谢您的建议。但是,如何将“分数”表中的“id”列传输/复制到“任务”表中? –

+0

为了完成,两个表中不应该有一个离散的PK,还是多个列可以用作PK的快速解释? – ChrisW

+0

@MaxWayne你的意思是你如何将当前数据复制到新结构中? – Fluffeh

0

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

问题: QuestionID,QuestionName,...

回答: AnswerID,用户名,QuestionID ,AnswerGiven,AnswerCorrect,Date已回答

这样如果你添加一个新问题,你不必改变表结构。

0

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