0

私は場所を評価するシステムを開発していますが、これが私の質問です。データベースに次のようなテーブルがあるとします。

places : id, name, description
place_marks : id, user_id, place_id, value, comment

ユーザーが場所の調査を行うとき、私は彼に料金の降順で並べられた場所のリストを送信したいと考えています。これを達成する最良の方法は何ですか?

解決策 1

  1. 名前に対応するすべての場所を取得
  2. 各場所について、マークを計算します
  3. 新しい番号付きリストを作成する

解決策 2

  1. 場所テーブルに列マークを追加する
  2. ユーザーがマークを追加するたびに、マークを計算します
  3. 検索の場合、データベースを正しくクエリするだけです

解決策 1 では、問題はパフォーマンスの問題である可能性があり (クエリでマークを計算しても)、解決策 2 では、マークを計算するときに競合を確実に回避するにはどうすればよいですか?

MySQLでPlay2を使用しています。助けてくれてありがとう。

4

1 に答える 1

2

解決策 2 で、どのような競合を恐れていますか? マークを計算していて、その間に新しいマークが提供され、最初の計算の前に 2 番目の計算が格納されている同じ計算を再度開始する可能性について言及していると思います。つまり、最新の平均を取得していません。

答えを出す前に、コードを最も簡単な方法で動作させるべきだと思います。問題が発生した場合にのみ、最適化を検討します。最適化のメリットを実際に得るには、かなりの数のマークと訪問者 (Web インターフェースを想定) が必要です。後で最適化するのが私のアドバイスです。

答えには、3つのオプションを検討します。私は Play2 を知らないので、答えは一般的なものにします。

1) 気にしない: これが発生する変更はかなり制限されており、トラフィックが非常に多い場合にのみ問題になります。あなたは一時的な値を計算しているだけなので(新しいマークができるまで)、その可能性は無視します。次に誰かがマークを付けたとき、あなたの統計は正しいでしょう。1a) 毎晩平均値を再計算して、翌日の平均値が正しいことを確認できます。

2) 計算が同期されていることを確認します。つまり、2 つの計算が同時に開始されないようにしてください。それには複数のオプションがあり、私は Play2 を知らないので、より多くの情報を提供することから参照します。

3) これが最も良い方法です。大量のトラフィックが予想されるため、確実に顧客にサービスを提供できるようにしたいと考えています。たとえば、CPU パワーの 50% を計算に費やすことは、最も避けたいことです。1 つのオプションは、時折マーク テーブルをチェックするバックグラウンドで別のプロセスを実行することです。新しいマークが検出されると、平均が計算されます。プロセスが 1 つしかないため、必要な CPU 時間とデータベースの負荷を制限できます。負荷が高いときは計算が少し遅れるかもしれませんが、負荷が低くなると速度が上がります。

本当にトラフィックが多い場合は、オプション 3) を選択してください。あなたの質問に基づいて、あなたの製品についてオプション 1) を採用し、オプション 2 を調べてセマフォなどについて学び、オプション 3) を学習演習として検討することをお勧めします。

幸運を。

于 2013-07-27T21:25:08.667 に答える