2010-05-02 109 views
6

我正在用php和mysql进行在线测验,并且需要一些帮助来决定如何设计数据库来优化插入问题/答案并为测验选择问题。该表将持有80个问题,每个问题有4个可能的选项加上正确的答案。MySql数据库设计测验

当从数据库中检索问题和选项时,我将随机选择25个问题及其选项。

为所有问题,选项和正确答案制作单个列更好吗?例如:

ID | Q | OPT1 | OPT2 | OPT3 | OPT4 | ANS 

或者为每个单个问题,选项和正确答案建立一个列会更好吗?例如:

Q1 | Q1_OPT1 | Q1_OPT2 | Q1_OPT3 | Q1_OPT5 | Q1_ANS | Q2 | Q2_OPT1 | Q2_OPT2... 

回答

10

最好将可能的答案存储在单独的表格中。这使您可以为每个问题提供任意数量的答案,而不仅仅是4.它还允许问题具有不同数量的答案。如果您有多个测验,您可能还需要一个测验表。

Quizes: 
    id 
    name 

Questions: 
    id 
    quiz 
    prompt 

Answers: 
    id 
    question 
    prompt 

QuizResult (someone taking a quiz) 
    id 
    quiz 
    // other information about the quiz taker, possibly including the time 

现在正确的答案变得更加棘手。我喜欢这里的较高的实现:

每个问题都有一个值,每个答案都有价值

系统最近,我和你一起工作可以分配的每个问题,每个答案的点值。不正确的答案经常得到0,正确的答案得到了全额。您也可以使用此方法获得部分正确的答案。这是我想要的方法。

你可以去,并说每一个问题是值得10分,或者你可以分配不同的权重不同的问题:

Questions: 
    id 
    quiz 
    prompt 
    value (you can make this question worth more or less) 

    Answers: 
    question 
    prompt 
    value (you can make this answer worth more or less) 

Store中的答案表

更简单的正确答案(但不太健壮)的解决方案是简单地说在Answers表中哪个答案是正确的。

Answers: 
    question 
    prompt 
    is_correct 

Store中问题表

正确的答案,我不会推荐它。当你创建一个问题时,直到你插入一个问题才会有正确的答案。这意味着至少有3个查询才能正确提出问题。如果你使用外键依赖,这将很快变得烦人。

+1

+1但要清楚的是,应该在'Answers'表中的列中标记正确的答案,而不是在'QuizResult'表中。 – 2010-05-02 18:40:36

+0

+1是一个很好的答案,好东西。 – Rog 2012-02-28 00:46:46

3

围棋与选项1哪里出现了对每个问题/选项/答案一行。

选项2没有任何意义。每次你想添加/删除一个问题,你都会修改数据库模式!而且你总是只有一排!

1

前往您的第一个选项。这是最正常的选择,但这不一定是一个有说服力的论点。但是规范化设计的优点是多方面的:

  • 将新问题包含到您的测验产品组合中是小菜一碟。 (另一个选项需要向表中添加新列)。
  • 编写返回结果集的select语句很简单。 (替代选项需要动态SQL)
  • 很容易编写一个显示问题和答案的GUI,因为每个显示的文本集都映射到相同的coilumn_names。