1

もちろん結果を表示する必要があるテニスサイトを作成しています。現在、ランキングを取得するには、1 人のプレーヤーの結果のみが必要な場合でも、各プレーヤーのスコアを合計して並べ替える必要があります。システムのプレイヤー数が増えると本当に遅くなると思います。そのため、結果をキャッシュし、何かが変更された場合にのみ更新する方法が必要です (または、結果を更新する必要がある場合に何らかのタイムアウトを追加します)。

また、その他の要件として、合計スコアを計算できる必要があります。つまり、いくつかの大会があり、すべての大会のスコアと、各大会のスコアを個別に表示する必要があります。

私が現在考えているのは、すべてを格納する単一のテーブルです。そのスキーマは次のようになります。

ranking_tbl シーマ

rank_type (競技、チーム、選手など)

rank_owner (誰がそれらのランクを所有しているか、チーム プレーヤーのランクになることができます - 所有者はチームになります)

rank_item (誰がランク付けされているか、チームの例では player )

スコア(ランク付けする実際のスコア)

ランク(事前にキャッシュされたランク、新しいスコアが追加された場合にのみ更新)

ランキングは私のシステムの重要な部分であり、頻繁に使用されるため、できるだけ効率的にする必要があります。

質問:テーブル スキーマを使用するよりもランキングを達成するための良い方法はありますか?

4

1 に答える 1

1

あなたのスキーマはうまくいくと思います。目的の機能を実現するために使用できる 3 つの解決策を確認できます。

  1. Cron - Cron ジョブ (スケジュールされたタスク) を使用して夜間にランキングを更新すると、オフピーク時間 (たとえば午前 2 時) に一括処理を行うことができます。プレーヤーをスコア順に並べ替え、ランクを割り当て、これをデータベースに保存するスクリプトをスケジュールします。
  2. シングル セーブの再計算 - 一度に 1 人のプレイヤーのスコアを挿入する場合は、スコアを保存した後にランクを再計算することを検討できます。これにより、最新の優れたランクが提供されますが、多くのスコアを追加するとパフォーマンスが低下する可能性があります。
  3. マルチ セーブの再計算- スコアを、プレーヤー ID とスコアを含む CSV ファイルにコンパイルします。その後、スクリプトを記述して CSV を解析し、すべてのプレーヤーのスコアを更新できます。スコアが保存されると、すべてのプレイヤーのランクを再計算できます。

私は個人的には 3 番目のオプションを好みますが、最初のセットアップに時間がかかるため、オーバーヘッドが少し増える可能性があります。

お役に立てれば。

于 2013-08-23T09:51:32.483 に答える