2012-03-06 28 views
0

私は各プレイヤーにスコアがあるゲームを持っています。私は選手が自分のスコアを比較し、彼らがどの位うまく配置されているかを見て、スコアボードをブラウズできるグローバルスコアボードを持っていたいと思います。PythonとSQLを使ったスコアボード

残念ながら私はこれをプログラムする効率的な方法が見つからない:スコアボードに現在のプレイヤーの位置を格納するということは、プレイヤーがスコアを上げたときにスコアボードの大部分を更新しなければならず、私が必要とするたびにそれを再計算する必要があります(これには多くの計算が必要です)。

この問題の解決策がありますか?または、上記のソリューションの1つは、多くのユーザーと多くの更新プログラムで実際に使用するのに十分な "十分な"ものですか?

+0

HMH。私はほとんどこれをSQLを使用しないと考えています。XQUF拡張機能(文書を変更する)を持つXQueryデータベースは、 "$ FARを$ BARのすぐ上の位置に移動"(または "$ FOO 2を移動兄弟姉妹 ")または"この文書の$ BAZの位置を検索する "。 –

+1

...これは、ランキングは本当にリアルタイムである必要があると言いましたか?バッチプロセスとしてそれらを更新します。 SELECT INTOを実行するたびに、あなたの人生が楽になります。 –

答えて

0

ORDER BY句が作成されていて、それほど遅く見えません。

+0

ORDER BYは私の問題を解決することはできません:私はそれを持つプレーヤーのランクを得ることができません。 –

0

実装を簡単にするために、2番目のソリューションの使用を検討します。プロジェクトの規模に応じて、ORDER_BYを使用してソリューションを注文することができます。

「十分な」かどうかは、おそらくあなたのニーズに大きく左右されます。最悪の場合、更新を実行するたびにデータをソートするのはコストがかかる可能性がありますが、ORDER_BYが遅い場合は、書き直しを検討することをお勧めします。

あなたに質問するのに最適な質問は、どの操作をさらに実行するかです。あなたが非常にめったに執筆しておらず、頻繁に読んでいるのであれば、ソートは良いアイデアかもしれません。 ORDER_BYを使用することをお勧めします。

ポジションを実装している限り、データモデルでこれを持ち、出力時にそれを追跡する理由はありますか?行を出力している間にカウンタを書くのはかなり簡単で、これをテーブルに格納するよりもかなり難しいようです。

リクエストでこれを行うには、this SO questionのストアドプロシージャを使用する解決策があるようです。

+0

'O(n)'ランクの検索をすると、1Kを超えるユーザーがいるとすぐに遅くなることが心配です。さらに、データベースの外部で順位を計算するためにすべてのデータを照会する必要がある場合は、次のようにします。/とにかく、良い解決策を見つけたと思います。 –

0

最終的には、各スコアの更新時にスコアボード全体を再計算する必要がないソリューションを見つけたと思います。基本的には、擬似SQLコードで:

ランキングは唯一の古いスコア、まだ多くのことができる新しいスコア(間のプレーヤーのために更新されますが、再計算の「ナイーブ」ソリューションな限りされていない
max_rank = SELECT MIN(rank) FROM scoreboard WHERE score <= $new_score AND score >= $old_score 
UPDATE scoreboard SET rank = rank + 1 WHERE score < $new_score AND score >= $old_score 
UPDATE scoreboard SET rank = $max_rank, score = $new_score WHERE player = $player 

全体のスコアボードSQLデータベースは、ほとんどの作業を処理します。。すべてのランクの更新は1つのクエリで行われ

私は、誰かがそれについての問題を発見していない限り、このいずれかで行くつもりです:)

+0

重要なことは、スコアボードに追加される新しいプレーヤーのケースを確実に処理しなければならないことです。しかし、古いスコアが0であると見なされれば、ロジックはそれをうまく処理するはずです。 – fluffy

関連する問題