Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mendapatkan Soalan dan Undian Berkaitannya dengan Cekap sebagai Objek JSON Tunggal dalam PostgreSQL dengan NodeJS?

Bagaimana untuk Mendapatkan Soalan dan Undian Berkaitannya dengan Cekap sebagai Objek JSON Tunggal dalam PostgreSQL dengan NodeJS?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-11 07:11:42823semak imbas

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

Mendapatkan semula Soalan dan Undian dalam PostgreSQL dan NodeJS

Artikel ini meneroka kaedah yang cekap untuk mengambil soalan dan undian yang berkaitan sebagai objek JSON tunggal menggunakan PostgreSQL dan NodeJS. Kami akan mengkaji beberapa pendekatan, menimbang implikasi prestasinya.

Senario aplikasi melibatkan pengguna membuat soalan dan membuang undi (undi naik atau turun). Matlamatnya ialah untuk mendapatkan semula setiap soalan bersama-sama dengan susunan undiannya.

Kaedah 1: Berbilang Pertanyaan (pg-promise)

Pendekatan ini menggunakan pg-promise untuk melaksanakan berbilang pertanyaan. Pertama, ia mendapatkan semula semua soalan. Kemudian, untuk setiap soalan, ia memperoleh undian yang sepadan.

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

Sebagai alternatif, menggunakan 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>

Kaedah 2: Pertanyaan Tunggal (Fungsi JSON PostgreSQL)

PostgreSQL 9.4 dan kemudian menawarkan penyelesaian pertanyaan tunggal yang lebih cekap menggunakan fungsi 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>

Pertanyaan ini membina objek JSON untuk setiap soalan, termasuk tatasusunan undian agregat. Dengan 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>

Perbandingan Prestasi

Pendekatan pertanyaan tunggal (Kaedah 2) adalah lebih pantas dengan ketara disebabkan oleh pengurangan perjalanan pergi dan balik pangkalan data. Walau bagaimanapun, Kaedah 1 (berbilang pertanyaan) menawarkan kebolehbacaan dan kebolehselenggaraan yang lebih baik, terutamanya untuk senario yang lebih kompleks.

Untuk prestasi optimum dengan set data yang besar, pertimbangkan teknik seperti menggabungkan pertanyaan anak untuk meminimumkan interaksi pangkalan data, seperti yang dibincangkan dalam sumber berkaitan tentang menggabungkan pertanyaan gelung bersarang.

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Soalan dan Undian Berkaitannya dengan Cekap sebagai Objek JSON Tunggal dalam PostgreSQL dengan NodeJS?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn