良い一日、親愛なるhabrosociety。
1つのプロジェクトを作成する過程で、ユーザー評価を実装する問題に遭遇しました。 原則として、Habrとの類似性を引き出すことができます。 実際、ユーザーは未知のアルゴリズムに従ってランク付けされ、何らかの種類のインジケーターを受け取ります(habrasila、これをランクと呼びます)。 その後、シートが作成され、このインジケーターの降順に並べ替えられます。 すべてがシンプルなようです。
- ランクが依存するn個のパラメーターがあります。 パラメータを変更する場合、ランクを再計算します。
- トップリストを表示するために、ランク順でデータベースから簡単に選択します。
すべてが見えるように見えますが、どこも簡単ではありません。 しかし、ここにはいくつかの問題があります。
- ランキングにおけるユーザーの位置を事前に知りたい。 たとえば、プロファイルに表示するには、個人情報提供者などを作成します。
- プロフィールからリンクをクリックすると、ユーザーが含まれているトップシートのページにアクセスしたいと思います(これはHabréでもありません)。
理論的には、2番目の問題は最初の問題に依存します。 結局のところ、ユーザーの位置とページに表示される数字を知っていれば、評価のどの部分に位置するかを計算できます。
_ = ___( / __ )
しかし、その後、問題が発生し、位置を計算する方法は? 他のすべてのユーザーに関連する必要があります。
解決策の1つは、一定の期間に1回実行される別個のスクリプトです。これにより、ランクごとにデータベースから膨大な選択が行われます(常に関連することを意味します)。 その後、各レコードにシリアル番号を割り当てて、データベースに保存します。 このオプションは機能していますが、重大な欠点があります。
- 大量の場合、スクリプトはデータベースに大きな負荷をかけます。
- このような評価は、スクリプトの実行時にのみ関係します。 ランキングでのユーザーの移動速度が速いと、スクリプトが作業を完了する前でも実際の位置が変わる場合があります。
位置計算は、ユーザープロファイルを開くときに行う必要があることを思い浮かべます。 同時に、彼はデータベースに対して複雑なクエリを行うべきではありません。 これですべてのタスクが解決しますが、実装方法がわかりません。 Harazhitelamiのタスクに対処するためにトピックを投稿してください。 助けてくれる人はたくさんいますが、それだけでなく、知りたい人もいます。 だからコメントを待っています。 何かが明らかになったらテキストを更新します。
UPD。
Eyesは、その場で位置決めするためのソリューションを提案しました。 ユーザーテーブルには、rankパラメーターを持つフィールドが既にあるため、ユーザーの位置を判断するには、select count(*)... where ... and rank> user_rankを実行するだけです。
UPD 2見つかったソリューションに新しい問題があります。 同じ評価のユーザーを分割する方法は? 結局のところ、評価のあるユーザーの数は多く、同じです。
あなたは単にそれに注意を払って、彼らに同じ場所を与えることができません。 それはhabrで作られています。 例として、これらのユーザーのプロファイルを見ることができます:
NooLと
Zada 。 彼らがどれだけ対等な立場に立つかはわかりませんが、ポイントはどちらもランキングで983位だということです。
理論的には、それはさらに正確で、同じ評価のユーザー間で差別はありませんが、正確な位置を知らずにリストの中央を参照する方法はありますか?
PS私は、Habrがフォーラムではないことを知っていますが、タスクを解決することに非常に興味があり、それによってカルモリスクが正当化されます。