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
Mary-Kate OlsenOriginal
2025-01-11 07:11:42823Durchsuche

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.

<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>

Alternativ mit 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>

Methode 2: Einzelabfrage (PostgreSQL JSON-Funktionen)

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

<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>

Diese Abfrage erstellt ein JSON-Objekt für jede Frage, einschließlich eines aggregierten Arrays von Stimmen. Mit 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>

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!

Stellungnahme:
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