2010-02-19 2 views
4

Mon application Web traite des sondages (sondages). En ce moment, j'ai 2 tables dans le cadre de la base de données. Le problème avec ceci est que sur certains sondages j'ai beaucoup de réponses (> 1000). Les gens peuvent voir les résultats des sondages et montrer combien d'utilisateurs ont voté oui, non ou peut-être combien d'utilisateurs anonymes ont voté oui, non ou peut-être. Le problème avec ceci est que chaque fois qu'un utilisateur consulte les résultats du sondage, il doit parcourir toutes les réponses et compter le nombre total de réponses, le nombre de réponses pour chaque choix, le nombre de réponses pour chaque choix effectué par les utilisateurs, et Nombre de réponses pour chaque choix effectué par tracker_id (utilisateurs anonymes) et calculer les pourcentages et les afficher dans un graphique à barres. Cela rend le chargement de la page très lent. Je pensais à dénormaliser la base de données pour augmenter les performances afin que nous ayons quelque chose comme çaBesoin de conseils sur la dénormalisation d'une base de données qui traite des réponses aux sondages

polls 
    id 
    question 
    choices (ex: yes,no,maybe) 
    total_responses (ex: 10,3,3,4) 
    user_responses (ex: 5,2,2,1) 
    anon_responses (ex: 5,1,3,1) 
    created 

polls_responses 
    poll_id 
    user_id 
    tracker_id 
    response 

C'est, pour la valeur total_responses, le 10 est le total, 3 est le nombre de réponses pour le choix yes, 3 est le nombre de réponses pour le choix no, et 4 est le nombre de réponses pour le choix maybe. Le même format s'applique aux champs user_responses et anon_responses. Si je pouvais avoir quelques opinions sur cette méthode, ce serait grandement apprécié! Merci pour votre temps.

EDIT: J'utilise MySQL

Répondre

3

Premièrement, je ne pense pas que vous ayez besoin de boucler pour compter ça.

Jetez un oeil à quelque chose comme ça

SELECT poll_id, 
     COUNT(response) Total, 
     SUM(CASE WHEN response = 'Y' THEN 1 ELSE 0 END) TotalYes, 
     SUM(CASE WHEN response = 'N' THEN 1 ELSE 0 END) TotalNo, 
     SUM(CASE WHEN response = 'M' THEN 1 ELSE 0 END) TotalMaybe, 
     SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'Y' THEN 1 ELSE 0 END) UserYes, 
     SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'N' THEN 1 ELSE 0 END) UserNo, 
     SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'M' THEN 1 ELSE 0 END) UserMaybe, 
     SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'Y' THEN 1 ELSE 0 END) TrackerYes, 
     SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'N' THEN 1 ELSE 0 END) TrackerNo, 
     SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'M' THEN 1 ELSE 0 END) TrackerMaybe 
FROM polls_responses 
GROUP BY poll_id 

Cela devrait vous obtenir les résultats respectifs par poll_id, d'où vous pouvez rejoindre à la table pour récupérer les détails du sondage.

0

Ne pas avoir peur d'utiliser la base de données pour faire un peu de levage de charges lourdes pour vous. Vous n'avez pas besoin de parcourir toutes les réponses dans votre sortie.

Vous n'avez pas spécifié votre plate-forme de base de données, mais vous pourriez probablement gérer cela dans la base de données en utilisant certaines jointures et fonctions d'agrégation, ou certains sous-sélections.

Questions connexes