1

カウント/合計などの保存に関するベストプラクティスは何ですか? 各ページの読み込み時にその場で計算するのは大したことではありませんか?

複数のソースからの製品と販売レポートを含む Rails アプリがあります。これらの販売レポートの中には、1 日あたり 10 万行以上に及ぶものもあります。現時点では、ページの読み込みごとにオンザフライで計算しています。これは明らかに非常に遅いです。

売上レポートはほぼ確実に 1 回書き込まれ、何度も読み取られるため、製品テーブルに合計列を追加し、新しい売上が書き込まれるたびにインクリメントする方がよいでしょうか? これにより明らかにはるかに高速になることがわかりますが、日付フィルタリングを提供する能力が大幅に制限されます。「過去 7 日間のトップ 10」など

フィルタリングを可能にする別の解決策は、各製品の毎日の合計を含む 3 番目のテーブルを作成することでしょうか? メインの販売テーブルには、毎日の製品ごとに複数の、場合によっては数千の行が含まれている可能性があるため、メインの販売テーブルの要約バージョンがどのように高速化できるかをもう一度確認できます。

before/after_save コールバックを使用してこれらの計算を実行する必要がありますか、またはインポート中に実行する必要がありますか?それとも、スケジュールされたタスクをバックグラウンドで実行する必要がありますか?

私を正しい道に導き、恥ずかしいほど遅いページ読み込み時間を改善するのに役立つ提案や推奨読書を誰かが提供できますか?

前もって感謝します!

4

1 に答える 1

1

素晴らしい質問です。

一般的には、その場でカウントと合計を生成することから始めるのが良いと思います。これは Codd の規則などに従います。問題は、これが時間の経過とともに遅くなる可能性があることです。どのように対処するかは、かなりの数の事柄によって異なります。販売データを処理するためのソリューションと、これが理想的である理由を説明します。

販売データは重要です。なぜなら、しばらくしてからしばらくの間は調整できる場合もありますが、反則行為がなければ、それ以上調整されることはないからです (これは帳簿が閉じられた後です)。販売帳簿は、多くの場合、月次または年次で締め切られます。

できることは、集計を日付や最大 ID などの決算エントリに入れ、トリガーを入れて、決算期間にエントリが追加されないようにすることです。これにより、既知の適切な値から集計をロール フォワードできます。この場合、クロージング間の期間またはオープン期間のみを集計する可能性があります。

于 2013-04-26T14:42:44.560 に答える