1

私のサイトの 1 つで、ユーザーは互いに投票できます。Votes各行が与えられた投票に対応するテーブルがあります。

ユーザーに合計投票スコアを表示したいと思います。これは、単にそのVotesテーブルで受け取った投票の合計です。これをリアルタイムで計算するか、1 日 1 回計算するか。このタイプのシナリオの「ベストプラクティス」は何ですか (数十万の投票と成長を想定)?

リアルタイムは簡単ですが、1日1回はそう簡単ではありません。Cronジョブを実行する必要があると思いますが、これを行うにはどうすればよいですか? 各ユーザーを繰り返し処理し、そのテーブルで受け取った投票の合計を計算する必要があることはわかっていVotesますが、最初の投票から始めて毎日完全な合計を計算して保存する必要がありますか? (最後の更新以降の) 新しい投票を既存の合計に追加するだけで、代わりにそれを保存しますか?

後者の場合、どのように正確にそれを行い、すべてを追跡して、投票が見逃されたり、2 回追加されたりしないようにしますか?

4

1 に答える 1

1

これに対処する標準的な方法は非正規化です。これは基本的に、クエリによって決定できるデータを格納することを意味します。これは本当にスケーラブルな唯一のソリューションであるだけでなく、非常にシンプルで優れたパフォーマンスをもたらします。実装方法は次のとおりです。

total_votesテーブルに列を追加しusers、投票データが変更されたときに起動するトリガーによって正しい状態に保ちます。

このようなもの:

delimiter //

create trigger vote_trigger
after insert on votes
for each row
begin
    update users set
    total_votes = total_votes + 1
    where users.user_id = new.user_id;
end; //

delimiter ;

行の削除と行の更新のための他の同様のトリガーを作成します。


最初に、クエリを実行してすべての値を設定します。次のようなクエリは、システムがオフラインまたは読み取り専用モードのときに一度だけ実行されます

update users set
total_votes = (select count(*) from votes where user_id = users.user_id);

ただし、このクエリを実行すると、トリガーは正しい値を保持しtotal_votesます (つまり、テーブルと同期しvotesます)。

于 2012-09-12T18:44:59.857 に答える