J'utilise des rails et MySQL, et j'ai une question d'efficacité basée sur le comptage de la ligne. P>
j'ai un projet code> modèle code> que Je veux compter le nombre de donateurs uniques pour un projet. P>
a un champ dans la table code> code> appelé ou est quelque chose comme La même réponse porte-t-elle pour résumer la quantité totale donnée? p> has_many: dons code>. p>
num_donors code> et l'incrémentation quand un nouveau donneur est créé une bonne idée? P>
@num_donors = donor.count (: select => 'user_id distinct') code> va être similaire ou identique en termes d'efficacité grâce à l'optimisation de la base de données? Cela vous obligera-t-il à créer des index pour
user_id code> et de tout autre champs que je veux compter? P>
5 Réponses :
Bien que cela dépend de la taille de votre base de données, ce sont les types d'opérations que les bases de données se spécialisent afin de pouvoir être rapides. C'est probablement un cas d'optimisation prématurée ici - vous devez commencer par ne pas stocker les totaux, ce qui le rend plus simple - et optimiser ultérieurement si nécessaire. P>
Pour répondre à la question du titre. Oui, il est redondant, mais si vous devriez le faire dépend de votre situation. P>
sauf si vous avez connu des problèmes de performance, calculez les comptes et les totaux à la volée de votre application et ne les stockez pas. Autrement dit, ne stockez pas les valeurs calculées à moins que vous n'ayez aucun autre choix. P>
Dans la plupart des situations, vous n'aurez pas à recourir à cela et ne devrait pas. P>
+1 pour ne pas essayer d'augmenter / décrémenter. S'il y a un certain niveau de complexité au comptage, cela vous évitera un mal de tête.
Les réponses de Peter's et Johnfx sont sonores, ce que vous proposez est le dénormalisation de votre Schema de base de données, qui peut améliorer les performances de lecture, mais au détriment des écritures tout en mettant en outre la limite de l'ONUS sur le développeur (ou des cigests SDBM supplémentaires) afin d'empêcher les incohérences dans votre ensemble de données. P>
ActionCord a une fonctionnalité intégrée pour gérer automatiquement les comptes sur has_many code> relations. Consultez ce Railscast sur Counter Caches . P>
N'oubliez pas que la maxime "Un homme avec une montre sait toujours l'heure. Un homme avec deux montres n'est jamais sûr." em> Je ne stockerais que le nombre dérivé si: p>
Les problèmes de performance vous empêchent d'obtenir les numéros dérivés lorsque vous en avez besoin (ce qui ne devrait pas être un problème dans ce cas car la réponse est susceptible d'être disponible dans les index) P>
ou p>
Vous avez des raisons de croire que vous perdez des enregistrements de la table principale via une erreur de programmation ou une action d'utilisateur délibérée ou accidentelle. Dans ce cas, vous pouvez utiliser votre numéro dérivé pour vérifier le numéro actuellement calculé. P>
J'adore la maxime - je ne l'ai pas entendu auparavant. Gardera à l'esprit :)
J'aime la citation, ça m'a vraiment aidé
Savez-vous qu'un drapeau simple fait l'activeCord Magic?
class ThingOwner # it has a column like # t.integer things_count, :default => 0 has_many :things, :counter_cache => true end