ホームページ >データベース >mysql チュートリアル >NodeJS を使用して PostgreSQL の単一の JSON オブジェクトとして質問とそれに関連する投票を効率的に取得する方法

NodeJS を使用して PostgreSQL の単一の JSON オブジェクトとして質問とそれに関連する投票を効率的に取得する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-11 07:11:42852ブラウズ

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

PostgreSQL と NodeJS での質問と投票の取得

この記事では、PostgreSQL と NodeJS を使用して質問とそれに関連する投票を単一の JSON オブジェクトとして取得する効率的な方法について説明します。 いくつかのアプローチを検討し、パフォーマンスへの影響を比較検討します。

アプリケーションのシナリオには、ユーザーが質問を作成し、投票 (賛成票または反対票) を行うことが含まれます。目標は、各質問とその投票の配列を取得することです。

方法 1: 複数のクエリ (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>

方法 2: 単一クエリ (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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。