2017-04-27 7 views
2

J'ai une API REST Node.js, travaillant directement avec une base de données MySQL via node-mysql.Comment gérer le filtrage des résultats sur un point de terminaison API REST?

Je suis à la recherche d'un moyen de filtrer les résultats de la base de données sur un critère d'évaluation de la manière la plus performatic.

Actuellement, j'ai un point d'extrémité /api/v2/matches, où mon code API interroge la base de données et affiche les résultats sous la forme d'une réponse JSON.

Je prévois d'utiliser des filtres sur ce point final. par exemple. /api/v2/matches?filter[team]=TeamId

Quelle est la meilleure façon/moyen le plus performatic pour filtrer les résultats de la base de données dans mon code?

Dois-je:

  • Interrogation la base de données pour tout et utiliser Array.prototype.filter() ou similaire sur mon tableau de résultats pour filtrer les données correctement.

  • Assembler ma chaîne de requête par programme, en fonction de ce qui est passé sur l'objet req.query.filters et interroger la base de données.

S'il vous plaît garder à l'esprit que ma requête en cours pour ce paramètre (celui qui renvoie tous les résultats) a quelques INNER JOINS en cours. J'utilise également LIMIT 50 sur cette requête.

Répondre

1

temps d'accès disque et le transfert de données sont les principaux goulots d'étranglement ici. Cependant, le LIMIT 50 a une implication intéressante à ce sujet. Vous devez utiliser les filtres dans la requête DB car cela limitera la durée de recherche de la base de données et limitera également la quantité de données transférées si votre base de données est distante (si votre base de données n'est pas distante, les gains seront plus faibles). toujours là). Le léger surcoût encouru par la construction de la requête est négligeable par rapport à cela.

SELECT * requêtes sont certainement conçu pour la vitesse, mais votre SGBD devront couvrir l'ensemble des données. Vous pouvez obtenir un meilleur temps d'exécution avec SELECT WHERE surtout si vous fournissez les index appropriés dans votre schéma de DB puisque vous êtes limité à 50 résultats, même avec JOINs.

En outre, gardez à l'esprit que les requêtes SELECT WHERE ont des années de recherche derrière eux et astuces pour les accélérer, alors que Array.prototype.filter est probablement une implémentation très simple de "if (lambda (x)) arr. ajouter (x) "ou quelque chose comme ça. Il y a une bonne raison à peu près toutes les entreprises l'utilisent au lieu de filter.