0

私のようなレストランの評価を保存するMySQLのテーブルがあります。Mysql:レストランの平均格付けなどのデータを扱う最良の方法?

id | user_id | res_id | rating_value | review_id | 
1 | 102 | 5567 |   4.0 |  26 | 
2 | 106 | 5543 |   3.5 |  27 | 
3 | 112 | 5567 |   3.0 |  31 | 

と私はユーザーによるレストランの'average rating'のような「データ」を示し、各レストランのRestaurant Profile webpageを持っています。

ユーザーは確認できます&レストランは1日あたりの料金を限られた回数で評価するため、1人のレストランでは1人のユーザーだけが1日あたり多くの新しい評価行を受け取ることがあります。

私の質問は:

  1. は、私は、これはメモリの多くを消費するレストランの格付け」を更新するために、各レストランのSELECT AVG(rating_value)に毎日(?または毎週)cronジョブを実行すべきか?

  2. Xの最近の「評価」の数をそのまま維持し、cronjobをSELECT AVG(rating_value)に各レストランごとに毎日使うのはどうですか?

3.Or新しい「評価」が提出されたとき、私は唯一のSELECT AVG(rating_value)を実行する必要がありますか?

答えて

0

データベースに負担をかけると、そのレストランに新しい評価が送信されない限り変更されない値になります。

この情報をmemcacheやredisのようなものにキャッシュすることをお勧めします。これは、データベースのこの平均を複製することが冗長であるためです。これで有効期限を設定することができます(たとえば1時間)。キャッシングソリューションにない場合は、値のDBに移動します。

リアルタイムソリューションが必要な場合は、レビュー提出ロジックに接続して、レストランのキャッシュ平均値をリフレッシュする必要があります。これにより、アプリケーションで常に最も正確な平均評価が表示されます。

データをデータベースに保存する場合は、この平均評価フィールドを格納しているテーブルを更新するDBトリガーか、キャッシングソリューションのようにこの値を更新するためのレビューフックを提出することをお勧めします。

0

この種のクエリを処理する方法はたくさんあります。あなたはSELECT AVG(rating_value)を実行することができます

- :あなたは(カラムがインデックス化し、迅速結果フェッチ一意に)新しいレーティングを追加

第二にSELECT AVG(rating_value)を実行することができます

- :いくつかのように 新しい評価を追加して、 キャッシュにレストランidまたは他の方法で保存してください。

サード: -

に新しいレーティングを追加し、あなたは時間ごと にcronジョブによって、そのクエリを実行し、キャッシュに保存し、そのデータベースへの負荷が軽減されますすることができます。

ありがとうございます。

関連する問題