Heim > Datenbank > MySQL-Tutorial > Wie kann man mit NodeJS Fragen und die dazugehörigen Stimmen effizient als einzelnes JSON-Objekt in PostgreSQL abrufen?

Wie kann man mit NodeJS Fragen und die dazugehörigen Stimmen effizient als einzelnes JSON-Objekt in PostgreSQL abrufen?

Mary-Kate Olsen
Freigeben: 2025-01-11 07:11:42
Original
875 Leute haben es durchsucht

How to Efficiently Retrieve Questions and Their Associated Votes as a Single JSON Object in PostgreSQL with NodeJS?

Fragen und Abstimmungen in PostgreSQL und NodeJS abrufen

In diesem Artikel werden effiziente Methoden zum Abrufen von Fragen und den damit verbundenen Stimmen als einzelnes JSON-Objekt mithilfe von PostgreSQL und NodeJS untersucht. Wir werden verschiedene Ansätze untersuchen und ihre Auswirkungen auf die Leistung abwägen.

Das Anwendungsszenario besteht darin, dass Benutzer Fragen erstellen und Stimmen abgeben (Upvotes oder Downvotes). Das Ziel besteht darin, jede Frage zusammen mit einer Reihe ihrer Stimmen abzurufen.

Methode 1: Mehrere Abfragen (pg-promise)

Dieser Ansatz verwendet pg-promise, um mehrere Abfragen auszuführen. Zunächst werden alle Fragen abgerufen. Anschließend werden für jede Frage die entsprechenden Stimmen abgerufen.

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);
    });
Nach dem Login kopieren

Alternativ mit ES7 async/await:

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;
});
Nach dem Login kopieren

Methode 2: Einzelabfrage (PostgreSQL JSON-Funktionen)

PostgreSQL 9.4 und höher bieten eine effizientere Einzelabfragelösung mit JSON-Funktionen:

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;
Nach dem Login kopieren

Diese Abfrage erstellt ein JSON-Objekt für jede Frage, einschließlich eines aggregierten Arrays von Stimmen. Mit pg-promise:

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);
Nach dem Login kopieren

Leistungsvergleich

Der Einzelabfrage-Ansatz (Methode 2) ist aufgrund der geringeren Datenbank-Roundtrips deutlich schneller. Methode 1 (mehrere Abfragen) bietet jedoch eine bessere Lesbarkeit und Wartbarkeit, insbesondere für komplexere Szenarien.

Für eine optimale Leistung bei großen Datensätzen sollten Sie Techniken wie die Verkettung untergeordneter Abfragen in Betracht ziehen, um Datenbankinteraktionen zu minimieren, wie in den entsprechenden Ressourcen zum Kombinieren von Abfragen mit verschachtelten Schleifen erläutert.

Das obige ist der detaillierte Inhalt vonWie kann man mit NodeJS Fragen und die dazugehörigen Stimmen effizient als einzelnes JSON-Objekt in PostgreSQL abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage