在 PostgreSQL 和 NodeJS 中擷取問題和投票
本文探討了使用 PostgreSQL 和 NodeJS 將問題及其相關投票作為單一 JSON 物件取得的有效方法。 我們將研究幾種方法,權衡它們的性能影響。
應用程式場景涉及使用者提問和投票(贊成或反對)。目標是檢索每個問題及其投票數組。
方法一:多次查詢(pg-promise)
此方法使用 pg-promise
執行多個查詢。 首先,它檢索所有問題。然後,對於每個問題,它都會獲得相應的投票。
<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>
或者,用 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>
方法二:單次查詢(PostgreSQL JSON 函數)
PostgreSQL 9.4 及更高版本提供了使用 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>
此查詢為每個問題建構一個 JSON 對象,包括投票的聚合數組。 與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>
效能比較
由於減少了資料庫往返次數,單一查詢方法(方法 2)明顯更快。 然而,方法1(多次查詢)提供了更好的可讀性和可維護性,特別是對於更複雜的場景。
為了在大型資料集上獲得最佳效能,請考慮連接子查詢等技術以最大限度地減少資料庫交互,如有關組合嵌套循環查詢的相關資源中所述。
以上是如何使用 NodeJS 在 PostgreSQL 中以單一 JSON 物件的形式高效檢索問題及其相關投票?的詳細內容。更多資訊請關注PHP中文網其他相關文章!