2010-12-13 7 views
2

Je travaille sur un projet quiz et je veux créer une structure de MySQL de telle sorte que:structure de MySQL db aide

QuestionID: Un numéro d'identification unique question (clé primaire)
testID: Un numéro d'identification de test unique (la question appartient à ce test) (clé primaire)
questionOrder: L'ordre de la question dans les questions de quiz, c.-à-d. Cette question est la question n dans le quiz. Je veux que cette valeur provienne de mysql, de sorte que lorsque j'insère une nouvelle question à db, je n'ai pas besoin de la calculer
Une question peut être dans plusieurs tests différents.

J'ai quelques questions:
1) J'ai le code suivant mais je reçois:
définition de table incorrecte; il ne peut y avoir qu'une seule colonne automatique et elle doit être définie comme une clé
Comment puis-je résoudre ce problème?

2) Cette structure ne permet pas à une question d'appartenir à plusieurs quiz. Une idée pour éviter cela?

3) Pensez-vous que cette structure est bonne/optimale, pouvez-vous suggérer quelque chose de mieux?


CREATE TABLE `quiz_question` (
    `questionID` int(11) NOT NULL auto_increment, 
    `quizID` int(11) NOT NULL default '0', 
    `questionOrder` int(11) NOT NULL AUTO_INCREMENT, 
    `question` varchar(256) NOT NULL default '', 
    `answer` varchar(256) NOT NULL default '', 
    PRIMARY KEY (`questionID`), 
    UNIQUE KEY (`quizID`, `questionOrder`), 
    KEY `par_ind` (`quizID`, `questionOrder`) 
) ENGINE=MyISAM; 

ALTER TABLE `quiz_question` 
ADD CONSTRAINT `0_133` FOREIGN KEY (`quizID`) REFERENCES `quiz_quiz` (`quizID`); 

CREATE TABLE `quiz_quiz` (
    `quizID` int(11) NOT NULL auto_increment, 
    `topic` varchar(100) NOT NULL default '', 
    `information` varchar(100) NOT NULL default '', 
    PRIMARY KEY (`quizID`) 
) ENGINE=MyISAM; 

Merci d'avoir lu ceci.

Répondre

1

1) Vous ne pouvez avoir qu'une colonne AUTO_INCREMENT par table. Ce devrait être une clé. Généralement, cela fait partie de/est le PK.

2) Un «quiz» serait une entité composée de questions. Vous devriez avoir 3 tables: 1 - quiz_question: quest_id, question, réponse 2 - quiz_quiz: quiz_id, sujet, information 3 - quiz_fact: quiz_id, quest_id, quest_order

Les tables quiz et question tenir le par élément (questionnaire/question) information. Le quiz_fact définit comment un quiz est composé (ce quiz a cette question dans cet ordre).

3) Ma seule suggestion serait d'utiliser plutôt Drizzle; Sérieusement, jouez avec les choses - «assez bien» l'est souvent. Si cela vous convient, pourquoi bricoler? Sinon, vous pouvez poser des questions plus détaillées une fois que vous avez cette opération et que vous l'exécutez (c'est-à-dire que mes requêtes sont trop lentes pour telle ou telle opération).

1

Supprimez AUTO_INCREMENT du champ questionOrder.

Pour autant que MySQL définisse la valeur dans le champ questionOrder, faites-le dans une requête UPDATE ultérieure. Habituellement, vous voudriez que l'administrateur du test, en utilisant votre utilitaire d'administration, puisse ajuster l'ordre des questions. Dans ce cas, il vous suffit d'entrer une valeur initiale +1 supérieure à la valeur de commande précédente la plus élevée (sur ce test). Ensuite, vous pouvez les laisser ajuster quelque chose comme la manière d'ajuster une file d'attente Netflix :)

1

1) L'ordre augmente-t-il. La DB ne le fera que si elle fait partie d'un PK. Vous pouvez peut-être le pirater en créant une clé composite contenant la colonne de commande, mais cela n'en vaut pas la peine.

2) Renommez quiz_question en question (et quiz_quiz en quiz). Créez une nouvelle table de jointure de question-quiz appelée quiz_question. Il devrait avoir un ID de quiz et un ID de question, reliant un quiz à une question. Comme la même question aura des ordres différents sur différents quiz, mettre l'ordre des questions sur le nouveau quiz_question. Vous n'avez plus besoin d'un quiz sur la table des questions.