2010-05-18 9 views
0

Je suis en train de concevoir un schéma pour une simple application de quiz. Il a 2 tables - "Question" et "Choix de réponse". La table des questions contient les colonnes "ID de la question", "Texte de la question" et "ID de la réponse". Le tableau "Choix de réponse" contient les colonnes "ID de question", "ID de réponse" et "Texte de réponse". Avec ce schéma simple, il est évident qu'une question peut avoir plusieurs choix de réponses & d'où la nécessité de la table de choix de réponses. Cependant, une question ne peut avoir qu'une seule réponse correcte et, par conséquent, le besoin d'un «ID de réponse» dans le tableau de questions. Cependant, cette colonne "ID de réponse" dans le tableau des questions donne l'illusion qu'il peut y avoir plusieurs questions pour une seule réponse qui n'est pas correcte. L'autre alternative pour éliminer cette illusion est d'avoir une autre table juste pour la réponse correcte qui aura seulement 2 colonnes à savoir l'ID de la question et l'ID de réponse avec une relation 1-1 entre les deux tables. Cependant, je pense que c'est redondant. Toute recommandation sur la meilleure façon de concevoir ceci, en appliquant ainsi les règles selon lesquelles une question peut avoir plusieurs choix de réponses mais seulement une bonne réponse? Merci beaucoup.Conception de base de données - question de relation de table

+2

Quoi que vous fassiez, peu importe ce que vous choisissez, s'il vous plaît, pour l'amour de dieu, n'appelle pas le PK de chaque ID de table. –

+0

@Stephanie Page: S'il vous plaît, pour l'amour de Dieu, pourquoi le dites-vous? – naivnomore

+0

Pas assez de place dans un commentaire pour une dissertation complète mais ... disons que vous avez une requête de table multiple (disons 5). Vous avez cinq colonnes toutes nommées exactement les mêmes, toutes signifiant des choses complètement différentes. Accepteriez-vous cela pour toute autre colonne? Accepteriez-vous que la colonne "COST" signifie 5 choses différentes dans cinq tableaux différents? Voudriez-vous les appeler "TOTAL_COST", "DIRECT_COST", "AVERAGE_COST", etc? Alors pourquoi le feriez-vous avec ID? C'est juste une liste de raisons de ne pas le faire. Et les gens de l'autre côté n'ont qu'un seul argument, les frappes au clavier. En ce jour, c'est une mauvaise excuse. –

Répondre

2

Perdez la colonne AnswerID du tableau Question. Vous créez une référence circulaire (sorte de). Au lieu de cela, avoir une colonne bit (boolean) IsCorrect dans la table Answer. Cela vous permettra également d'avoir plusieurs réponses correctes à l'avenir si vous en avez besoin. Par le point de Matti, un déclencheur sur INSERT/UPDATE d'un enregistrement de réponse appliquera la règle de réponse correcte zéro ou un par question.

+1

Cela vous oblige cependant à créer des règles supplémentaires pour appliquer qu'une seule réponse pour chaque question peut être marquée comme correcte. –

+0

@Matti - bon point. Un déclencheur INSERT/UPDATE ferait l'affaire. –

+0

le champ Bit IsCorrect dans le tableau des choix est l'approche la plus flexible car vous pouvez, si nécessaire à l'avenir, avoir plusieurs réponses correctes pour une question simplement en basculant une valeur de champ 0 ou 1. –

2

Que diriez-vous juste de nommer la colonne CorrectAnswerId? Je doute que quelqu'un puisse le confondre avec quoi que ce soit d'autre.

+1

+1 Plus simple que ma solution! –

+0

@Bob +1 pour reconnaître ceci, pas commun sur SO – xandercoded

+0

Je suppose que vous me demandez de renommer le nom de colonne dans le tableau de questions en "CorrectAnswerID". Je peux certainement le faire mais je suppose que cela ne change toujours pas le problème original. Il apparaîtra toujours comme si la table des choix de réponses a une relation 1: N avec la table des questions. Ce n'est pas un gros problème. Je voulais juste savoir s'il y avait un meilleur design compte tenu de mes exigences. – naivnomore

0

Trois tables (parce que vous pouvez avoir beaucoup de "Oui" "Non", pourquoi dupliquer cela, et vous pouvez changer plus tard un "Non" en un "Nop" facilement). le tableau questions_answers cartographie certaines réponses à certaines questions. (C'est une relation de plusieurs à plusieurs).

questions:

  • id
  • Description
  • correct_answer_id

réponses:

  • id
  • Description

questions_answers:

  • question_id
  • answer_id
+0

vous pouvez également considérer une autre table pour identifier les utilisateurs et une autre pour identifier quelles réponses un utilisateur donné a choisi ... – Randy

0

des questions
- id
- QUESTION_TEXT

1, "left or right?"

answer_choices
- id
- question_id
- answer_text
- correct

1, 1, "left", 1 
2, 1, "right", 0

répond
- id
- question_id
- user_id
- answer_ch oices_id

1, 1, 1234, 2 // wrong! 
1, 1, 5678, 1 // yay

Donc, en gros vous devez d'abord interroger la question de la table questions, puis interroger les réponses possibles de la table answer_choices qui sont liés à la question par question_id. Quand une réponse a été donnée, vous prenez le answer_choices_id sélectionné et le comparez avec le tableau answer_choices pour voir si correct est 1 ou 0.

+0

Que fait l'identification sur le tableau de réponses? –

+0

Simplement un identifiant unique pour la réponse d'un utilisateur. Si c'est utile dépend de l'utilisation. Vous pouvez également le supprimer et utiliser 'question_id' combiné avec' user_id' pour l'identifier. – Alec

+0

Avoir un champ correct dans le tableau des choix de réponses laisse trop de trous puisqu'il n'y a qu'une seule réponse correcte à n'importe quelle question. Au lieu de cela, vous pouvez avoir le champ correct dans la table des questions ou créer une autre table avec juste l'ID de la question et le champ correct. Cependant, mon problème n'est pas ça. Comment pouvons-nous concevoir ces tableaux de manière à ce qu'il n'y ait pas de redondance ou de doublons. – naivnomore

Questions connexes