2010-05-02 15 views
6

Je fais un quiz en ligne avec php et mysql et j'ai besoin d'aide pour décider comment concevoir la base de données pour l'insertion optimale des questions/réponses et pour sélectionner les questions pour le quiz. La table contiendra 80 questions chacune avec 4 options possibles plus la bonne réponse.Conception de base de données MySql pour un quiz

Lors de la récupération des questions et des options de la base de données, je vais sélectionner au hasard 25 questions et leurs options.

Vaut-il mieux faire une seule colonne pour toutes les questions, les options et les bonnes réponses? Par exemple:

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

Ou serait-il préférable de faire une colonne pour chaque question, option, et la réponse correcte? Par exemple:

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

Répondre

10

Il serait préférable de stocker les réponses possibles dans une table séparée. Cela vous permet d'avoir n'importe quelle quantité de réponses par question au lieu de seulement 4. Cela permet également aux questions d'avoir un nombre différent de réponses. Si vous avez plus d'un quiz, vous pouvez également utiliser une table de quantification.

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 

Maintenant, la réponse correcte devient beaucoup plus difficile. Je préfère les implémentations plus ici:

Chaque question a une valeur et chaque réponse a une valeur

Un système J'ai récemment travaillé avec vous pouvez attribuer une valeur de point pour chaque question et chaque réponse. Les réponses incorrectes ont souvent obtenu 0, les réponses correctes ont obtenu le montant total. Vous pouvez également avoir des réponses partiellement correctes en utilisant cette méthode. C'est la méthode que j'irais avec.

Vous pouvez aller dire à chaque question vaut 10 points ou vous pouvez attribuer différents poids à différentes questions:

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) 

stocker la bonne réponse dans les réponses Tableau

Un plus simple (mais moins robuste) consiste simplement à dire quelle réponse est correcte dans le tableau Réponses.

Answers: 
    question 
    prompt 
    is_correct 

magasin la bonne réponse dans les questions Tableau

Je ne le recommanderais pas. Lorsque vous créez une question, celle-ci n'aura pas de réponse correcte tant que vous n'en aurez pas inséré une. Cela signifie au moins 3 requêtes pour correctement poser une question. Si vous utilisez des dépendances de touches étrangères, cela deviendra rapidement ennuyeux.

+1

+1 Mais pour être clair, il faut marquer la bonne réponse dans une colonne dans la table 'Answers', pas dans la table' QuizResult'. –

+0

+1 pour une bonne réponse, bonne chose. – Rog

3

Optez pour l'option 1 où vous avez une ligne pour chaque question/option/réponse.

L'option 2 n'a aucun sens. Chaque fois que vous voulez ajouter/supprimer une question, vous allez modifier le schéma de la base de données !! Et vous aurez juste une rangée toujours !!

1

Optez pour votre première option. C'est l'option la plus normalisée, mais ce n'est pas nécessairement un argument décisif. Mais les vertus de la conception normalisée sont multiples:

  • C'est un morceau de gâteau d'inclure de nouvelles questions dans votre portefeuille de quiz. (L'autre option nécessite l'ajout de nouvelles colonnes à la table).
  • Il est simple d'écrire l'instruction select qui renvoie l'ensemble de résultats. (l'option alternative nécessite un SQL dynamique)
  • Il est facile d'écrire une interface graphique qui affiche les questions et les réponses, car chaque ensemble de texte affiché correspond aux mêmes noms de colonnes.
Questions connexes