2010-08-02 7 views
1

Je suis ici pour concevoir un schéma de base de données relationnelle modélisant l'interrogation et les utilisateurs. Chaque catégorie peut comporter une ou plusieurs questions. Chaque utilisateur peut participer seulement une fois à chaque catégorie, et peut interroger (ou non) exactement une fois sur chaque question. Chaque sondage est oui, non ou s'abstient (pas de vote).Suggestion pour un meilleur schéma relationnel DB

J'ai conçu mon schéma avec quatre tables:

users, [userId, IP] 
category, [catId, catTitle] 
question, [queId, queTitle] 
polls [pollId, queId, userId, answer] 

est meilleur ou

users, [userId, IP] 
category, [catId, catTitle] 
question, [queId, queTitle] 
polls [pollId, catId, userId] 
pollAnswers [pollAndId, queId, pollId, answer] 

Je voudrais savoir quel est le meilleur et pourquoi? Par moi depuis que j'ai des informations supplémentaires sur les sondages, je suis directement rejoindre les utilisateurs et les questions avec réponse.

je aussi besoin de trouver combien d'utilisateurs ont été abstiendra a) tout b catégorie de questions) catégorie particulière c) question particulière

Je moi comme pour le choix d'un schéma:...

select U1.*, Q1.*, P2.*, C1.* 
from 
    (users U1, 
    questions Q1) 
    Left outer Join polls P2 on 
     Q1.queId = P2.queId AND U1.userId = P2.userId 
    Left Outer Join category C1 on 
     Q1.catId = C1.catId 

J'essaye d'inquiéter utilisant la question ci-dessus avec la jointure croisée entre les utilisateurs et la question perdra mon exécution ou pas?

Si le deuxième schéma est meilleur, pouvez-vous suggérer des options pour mes résultats?

+1

cela ne permet pas vraiment votre schéma, mais je pense Les noms de champs abrégés sont épouvantables. Aussi, pourquoi préfixer chaque nom de champ avec le nom de la table? Pourquoi pas les utilisateurs (id, ip), les questions (id, body), les sondages (id, question_id, user_id, answer)? –

+0

thxn pour suggestion de supprimer les noms de champs abrégés. Ensuite, je vais vous dire "cela n'aide pas vraiment votre schéma" qu'est-ce que cela signifie – KoolKabin

+0

ils signifient enlèvement des préfixes n'aide pas votre schéma mais il le rend plus lisible. Et vous devriez utiliser "ne pas" au lieu de "dun". – User123342234

Répondre

0

utilisateurs: changer le nom à l'utilisateur si toutes les entités sont singulières (ou renommer les Singuliers au pluriel)

Catégorie: OK

question: Vous avez besoin d'une clé étrangère de la question à la catégorie

pollAnswers: Renommer en pollAnswer, et en faire une table de référence avec trois lignes: Oui, Non, Abstain

Sondages: Renommer pour interroger, et en faire une transaction d'un utilisateur interroger une question, avec des clés étrangères à l'utilisateur, question, et pollAnswer.

(Options: soit valider sur l'insertion que l'utilisateur n'a aucun sondage existant pour les questions de la catégorie, soit dénormaliser PollAnswers avec la clé étrangère de la question à la catégorie et mettre une contrainte unique sur l'utilisateur/question. cette option car elle pose des problèmes si vous modifiez la catégorie d'une question)

Ensuite, une requête pour une catégorie particulière pourrait ressembler à ceci:.

select * 
from category c 
LEFT OUTER JOIN question q ON q.catID = c.catID 
LEFT OUTER JOIN poll p ON p.queId = q.queId 
LEFT OUTER JOIN user u ON u.userId = p.UserID 
WHERE c.catID = 'blah blah' 
Questions connexes