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 ?

Comment récupérer efficacement les questions et leurs votes associés en tant qu'objet JSON unique dans PostgreSQL avec NodeJS ?

Mary-Kate Olsen
Libérer: 2025-01-11 07:11:42
original
828 Les gens l'ont consulté

How to Efficiently Retrieve Questions and Their Associated Votes as a Single JSON Object in PostgreSQL with 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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal