Maison >base de données >tutoriel mysql >Comment récupérer efficacement les questions et leurs votes associés en tant qu'objet JSON unique dans PostgreSQL avec NodeJS ?
Récupération de questions et de votes dans PostgreSQL et NodeJS
Cet article explore des méthodes efficaces pour récupérer les questions et leurs votes associés en tant qu'objet JSON unique à l'aide de PostgreSQL et NodeJS. Nous examinerons plusieurs approches, en pesant leurs implications en termes de performances.
Le scénario d'application implique que les utilisateurs créent des questions et votent (votes positifs ou négatifs). Le but est de récupérer chaque question ainsi qu'un tableau de ses votes.
Méthode 1 : requêtes multiples (pg-promise)
Cette approche utilise pg-promise
pour exécuter plusieurs requêtes. Premièrement, il récupère toutes les questions. Ensuite, pour chaque question, il récupère les votes correspondants.
<code class="language-javascript">function buildTree(t) { const v = q => t .any('SELECT id, value FROM votes WHERE question_id = ', q.id) .then((votes) => { q.votes = votes; return q; }); return t.map('SELECT * FROM questions', undefined, v).then((a) => t.batch(a)); } db.task(buildTree) .then((data) => { console.log(data); }) .catch((error) => { console.log(error); });</code>
Alternativement, en utilisant ES7 async/await
:
<code class="language-javascript">await db.task(async (t) => { const questions = await t.any('SELECT * FROM questions'); for (const q of questions) { q.votes = await t.any('SELECT id, value FROM votes WHERE question_id = ', [q.id]); } return questions; });</code>
Méthode 2 : requête unique (fonctions PostgreSQL JSON)
PostgreSQL 9.4 et versions ultérieures offrent une solution de requête unique plus efficace utilisant les fonctions JSON :
<code class="language-sql">SELECT json_build_object('id', q.id, 'content', q.content, 'votes', (SELECT json_agg(json_build_object('id', v.id, 'value', v.value)) FROM votes v WHERE q.id = v.question_id)) FROM questions q;</code>
Cette requête construit un objet JSON pour chaque question, y compris un tableau agrégé de votes. Avec pg-promise
:
<code class="language-javascript">const query = `SELECT json_build_object('id', q.id, 'content', q.content, 'votes', (SELECT json_agg(json_build_object('id', v.id, 'value', v.value)) FROM votes v WHERE q.id = v.question_id)) json FROM questions q`; const data = await db.map(query, [], (a) => a.json);</code>
Comparaison des performances
L'approche à requête unique (méthode 2) est nettement plus rapide en raison de la réduction des allers-retours dans la base de données. Cependant, la méthode 1 (requêtes multiples) offre une meilleure lisibilité et maintenabilité, notamment pour les scénarios plus complexes.
Pour des performances optimales avec des ensembles de données volumineux, envisagez des techniques telles que la concaténation des requêtes enfants pour minimiser les interactions avec la base de données, comme indiqué dans les ressources connexes sur la combinaison de requêtes en boucle imbriquée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!