2011-06-20 1 views
1

Je suis en train d'écrire une requête finder rails qui extrait les enregistrements pour les articles triés par les nombres les plus élevés de approuvé et public commentaires par article.Êtes-vous en faveur du filtrage en mémoire ou de l'utilisation de requêtes SQL sur un grand nombre d'enregistrements dans une application ruby ​​on rails?

Quelle est la meilleure façon d'exécuter une telle requête dans Ruby on Rails?

En règle générale, les développeurs sont-ils en faveur du filtrage en mémoire ou de l'exécution de requêtes SQL complexes?

Répondre

7

Laisser la base de données faire son travail est toujours le meilleur. Il suffit d'écrire la requête avec une clause where/join/etc. et utilisez un tri par pour ne renvoyer que les enregistrements dont vous avez besoin. En renvoyant plus d'enregistrements, puis en filtrant les données dans des rails, la quantité de données à travers le «fil» (entre la base de données et le serveur d'applications) et la mémoire est également gaspillée. Les bases de données sont optimisées pour ce genre de choses. Utilisez un index sur la table si nécessaire.

Un autre poste similaire: http://www.mail-archive.com/[email protected]/msg13484.html

+0

certainement d'accord ... juste après avoir posté ... +1 – apneadiving

+0

Gardez à l'esprit que si les résultats sont * donc * grand, comme si vous obteniez un millier de résultats, vous devriez LIMITER les résultats retournés, et éventuellement le paginer en fonction de votre cas d'utilisation. Mais laissez définitivement la DB faire son travail, pas de point int tirant dans 10.000 enregistrements en mémoire ruby ​​seulement pour afficher 25 d'entre eux. – nzifnab

2

La partie lente d'une application web est presque toujours la base de données.

  1. requêtes complexes vous en coûterait un peu dans le temps, mais les données fournies seront significatives et pas grand.

  2. L'exécution de requêtes de base vous permettra d'avoir un grand ensemble de données que vous aurez à traiter. Cette grande quantité de données pourrait également être longue à importer.

Je m'en tiens à 1 sachant que vous pouvez optimiser les requêtes et ajouter des index.

1

Presque toujours, vous devez utiliser SQL pour filtrer votre jeu de résultats. La base de données est beaucoup plus adaptée aux performances, et le tri dans le code peut souvent mener à des requêtes N + x, qui peuvent tuer les performances.

Un chercheur qui pourrait faire quelque chose comme ce que vous devez peut-être comme ceci:

Article.where('id in (
       SELECT article_id 
       FROM comments 
       WHERE approved = ? AND public = ? 
       ORDER BY count(article_id) DESC 
       LIMIT 10 
      )', true, true) 
Questions connexes