データベースから最も人気のある場所を選択するアルゴリズム
-
01-10-2019 - |
質問
場所のデータベースを含むWebサイトがあります。各場所について、ユーザーは記録するフォローアクションの1つを取得できます。
- ビュー - ビューそれはプロファイルです
- 評価 - 1〜5つ星のスケールで評価する
- レビュー - レビューしてください
- 完了 - 彼らがそこにいたことをマークします
- ウィッシュリスト - 彼らがそこに行きたいとマークする
- お気に入り - それが彼らのお気に入りの一つであることをマーク
データベースの場所のテーブルには、各場所には、上記のアクションが取られた回数の数と、ユーザーが提供する平均評価が含まれています。
- ビュー
- 評価
- avg_rating
- 完了しました
- ウィッシュリスト
- お気に入り
上記の情報を使用して、上部の場所のリストを生成することです。理想的には、追加のフィールドやスタックランクの場所を互いに計算するためにレッグワークを行う必要なく、比較的単純なSQLクエリを使用してこのリストを生成できるようにしたいと考えています。そうは言っても、私たちは約50,000の場所しか持っていないので、毎晩のクロンジョブを実行して、トップの場所の全体的な結果に意味のある違いをもたらす場合、さまざまなカテゴリのランキングなどのフィールドを計算できます。
トップの最高の場所を泡立てることについて考える方法についていくつかの提案をすることができれば幸いです。どの基準をより重くする必要があり、その情報を考慮してください - MySQLクエリがどのように見えるかを示唆しています上位10の場所を選択します。
注意すべきことの1つは、現時点では、人気がある場所の最新性にあまり関心がないということです。つまり、集計情報を見ることは問題なく、より最近のデータをより重くする必要がないことを意味します。
あなたの助けとアドバイスを前もってありがとう!
解決
お気に入りの正確な式はあなたから来る必要があります、私たちはそれをf(x)と呼びます。
実際の実装では、各行のf(x)を使用して毎晩のクロンジョブから言ったように、計算する人気_scoreフィールドを追加します。
次に、単に「人気_Score DESCによるテーブルオーダーから選択した選択名」を実行する場合です。
OK -Stabing optoluity_score =(お気に入り * 3 +完了 * 2 +ウィッシュリスト) * rating * view / avg_views_of_all_profiles
他のヒント
私は物事を比較検討する方法について意見を持っていません。
とはいえ、ロケーションテーブルに人気列を追加してみませんか?突然、SQLクエリは非常に簡単です。
もちろん、トリッキーな部分は、その価値をどのように、いつ更新するかを考え出すことです。ただし、すべてのアクティビティデータを保存しているため、ログエントリから人気値をいつでも再生できます。
そうすれば、「最も人気のある」場所の素晴らしい高速クエリを取得します。人気の計算方法を変えたい場合は、自由にできます。
あなたが賢いなら、あなたは人気をリアルタイムで追跡できるように、十分に単純な式を考案できるかもしれません。たとえば、平均評価のみを気にかけている場合、3つの変数のみで平均評価を変更できます。現在の平均評価、オブジェクトの評価回数、および新しい評価値です。
もちろん、オブジェクトの表示、レビュー、好意などの回数でミキシングを開始すると、事態はより複雑になります...しかし、全体的な人気を更新できるように計算的に安価な方法を考案できることがわかります。ほぼすべてのアクションの価値。