0

私は2つのモデルを持っています- ScoreWeight

これらの各モデルには、約5つの属性があります。

基本的に* 、*などの製品であるweighted_score自分用のを作成できる必要があります。UserScore.attribute_AWeight.attribute_AScore.attribute_BWeight.attribute_B

3番目のモデルを作成する方が良いですか?たとえばWeighted_Score、各属性の製品値をで行に格納し、特定の(たとえば)user_idが必要なときはいつでもそのテーブルにクエリを実行する方が良いですか、それともその場で計算を行う方が良いですか?毎回?weighted_scoremy_user.weighted_score.attribute_A

効率の観点からお願いします。

ありがとう。

4

2 に答える 2

1

答えは非常に状況に依存すると思います。3 番目のテーブルを作成することは、計算が非常に高価で、システムの残りの部分を停止させたくない場合に良い考えであり、計算が次の場所で行われるというメッセージでユーザーにすぐに応答しても問題ありません。未来。その場合、処理をバックグラウンド ワーカーにオフロードし、3 番目のモデルのインスタンスを非同期で作成できます。さらに、体重/スコア レコードを検索せずにテーブルに直接アクセスできるように、テーブルを非正規化する必要があります。

その他のアイデア:

  1. 多くのレコードを持つモデルに最適化を集中させます。たとえば、Weight には 100 レコードしかなく、Score には無限のレコードがある場合、Weight をメモリにロードし、Score クエリの最適化にすべての労力を集中させます。
  2. calc メソッドでメモ化を使用する
  3. 最もコストのかかるアクション/メソッドでキャッシュを使用します。値が更新される頻度をあまり気にしない場合は、毎晩キャッシュを明示的にスイープできます。
于 2012-10-08T23:39:56.663 に答える
0

計算されたスコアを保存する必要がない限り(スコアが変更され、変更を保存したいとしましょう)、複雑さを追加して別のテーブルに保存するメリットはありません。

于 2012-10-08T23:34:38.673 に答える