PostgreSQL と NodeJS での質問と投票の取得
この記事では、PostgreSQL と NodeJS を使用して質問とそれに関連する投票を単一の JSON オブジェクトとして取得する効率的な方法について説明します。 いくつかのアプローチを検討し、パフォーマンスへの影響を比較検討します。
アプリケーションのシナリオには、ユーザーが質問を作成し、投票 (賛成票または反対票) を行うことが含まれます。目標は、各質問とその投票の配列を取得することです。
方法 1: 複数のクエリ (pg-promise)
このアプローチでは、pg-promise
を使用して複数のクエリを実行します。 まず、すべての質問を取得します。次に、質問ごとに、対応する投票を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <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
を使用します:
1 2 3 4 5 6 7 | <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 関数を使用したより効率的な単一クエリ ソリューションが提供されます。
1 2 3 4 | <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
の場合:
1 2 3 4 5 6 7 | <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 サイトの他の関連記事を参照してください。