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!