各ユーザーが「foo」に賛成票または反対票を投じることができる、PostgreSQL に実装された投票システムを考えてみましょう。foo
すべての「foo 情報」を格納するテーブルと、 +1 または -1である、、およびvotes
を格納するテーブルがあります。user_id
foo_id
vote
vote
各 foo の投票集計を取得するには、次のクエリが機能します。
SELECT sum(vote) FROM votes WHERE foo.foo_id = votes.foo_id;
ただし、次の場合も同様に機能します。
(SELECT count(vote) FROM votes
WHERE foo.foo_id = votes.foo_id
AND votes.vote = 1)
- (SELECT count(vote) FROM votes
WHERE foo.foo_id = votes.foo_id
AND votes.vote = (-1))
現在、 にインデックスがありますvotes.foo_id
。
より効率的なアプローチはどれですか? (つまり、どちらがより速く実行されますか?) PostgreSQL 固有の回答と一般的な SQL の回答の両方に興味があります。
編集
vote
多くの回答では、nullの場合が考慮されています。言い忘れていましたがNOT NULL
、投票欄には制約があります。
また、最初の方がはるかに読みやすいと多くの人が指摘しています。はい、確かにそうです。もし同僚が 2 番目のものを書いた場合、パフォーマンスの必要性がない限り、私は怒りで爆発するでしょう。とはいえ、問題は依然として 2 つのパフォーマンスにあります。(技術的には、最初のクエリがかなり遅かったとしても、2 番目のクエリを書いてもそれほど問題にはなりません。)