製品のセットがあり、各製品にはレビューのセットがあるとします。各レビューにはスコアがあります。実際のレビューが必要になるよりも、はるかに頻繁にスコアの平均が必要になります。平均を事前計算して休止状態で保存するためのベストプラクティス/クリーンな方法はありますか?
現在、商品テーブルにレビュー数とレビュー合計の列を追加し、add review メソッドを操作してカウントと合計を更新することを考えています。
これを行うためのよりクリーンな方法を聞いてとてもうれしいです。
製品のセットがあり、各製品にはレビューのセットがあるとします。各レビューにはスコアがあります。実際のレビューが必要になるよりも、はるかに頻繁にスコアの平均が必要になります。平均を事前計算して休止状態で保存するためのベストプラクティス/クリーンな方法はありますか?
現在、商品テーブルにレビュー数とレビュー合計の列を追加し、add review メソッドを操作してカウントと合計を更新することを考えています。
これを行うためのよりクリーンな方法を聞いてとてもうれしいです。
親テーブルに合計列を保持しないことをお勧めします。競合する 2 つのリクエストが合計列を更新しようとすると、1 つが失敗するか、古い読み取りで合計が上書きされる危険があります (システムに大量のトラフィックがない場合を除きます...)。
必要なクエリは非常に単純で、適切なデータベースであれば、しばらくの間は良好なパフォーマンスが得られるはずです (遅延疑似 SQL/HQL):
1) 製品の特定の平均レビュー スコア:
select sum(score)/count from reviews where product_id = ?
2) 製品とその平均レビュースコアのリスト
select product_name, sum(r.score)/count(r.score)
from products p
join reviews r
group by product_name
最初のクエリでは、reviews テーブルの product_id にある種のインデックスがあることを確認してください。
hibernate を使用すると、HQL またはCriteria オブジェクトを介して射影クエリを使用できます。それが十分に速くない場合は、第 2 レベルのキャッシングとクエリ キャッシングを検討します。
show_sql
TestTestTest をオンにして、休止状態がデータベースに 1 回だけヒットすること、および新しいアイテムが追加/更新されたときにキャッシュが無効になることを確認します。
より良い方法があると思います。バックグラウンド プロセスを時々実行し、レビュー テーブルに基づいて製品テーブルの評価のカウントと合計を更新します。
もう 1 つのアイデアは、レビュー/評価テーブルに更新があるたびにトリガーを使用し、それを考慮して (タイムスタンプを使用)、製品テーブルを更新することです。
Hibernate クエリ キャッシングが最適な方法かもしれません。それ以外の場合は、元のアイデアを使用してください。