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 | 

,我有Restaurant Profile webpage每個餐廳這說明「數據」像用戶的餐廳'average rating'

用戶可以評論&爲有限次數的餐廳每天計算一次,因此單個餐館每天/每天可能會收到許多新的評分行,僅由一名用戶單獨提供。

我的問題是:

  1. 我應該每天(?或每週)運行一個cronjob到每家餐館更新餐館的「評分」的SELECT AVG(rating_value),這會消耗很多的內存?

  2. 我應該只保留最近的'收視率'的X數量,並使用cronjob到SELECT AVG(rating_value)它每天爲每家餐廳?

3.或者,當提交新的「評級」時,我應該只運行SELECT AVG(rating_value)

回答

0

聽起來好像您希望將數據庫中的負載保持爲一個不會更改的值,除非爲該餐廳提交了新評級。

我建議將這些信息緩存在memcache或redis中,因爲在數據庫中重複這個平均值是多餘的。然後,您可以在此設置過期時間(比如說一個小時),如果該值不在緩存解決方案中,則只能將該值設置到數據庫中。

如果你想要一個實時解決方案,那麼你應該掛鉤你的評論提交邏輯來刷新餐廳的緩存平均值。這將保證您的應用程序始終顯示最準確的平均評分。

如果您想要將數據存儲到數據庫中,那麼我會建議使用數據庫觸發器來更新存儲此平均評級字段的表格,或使用緩存解決方案,提交檢查掛鉤以更新此值。

0

有很多方法可以處理這種查詢。 像一些: -

您可以運行在添加新的評價SELECT AVG(rating_value)(使列索引和獨特獲取快速結果)

二: -

您可以運行SELECT AVG(rating_value)上添加新的評級,並將其保存在 緩存的餐廳ID或任何其他方式。

三: -

添加新的等級,你可以按小時計算 上運行通過的cronjob該查詢並將其保存在緩存中,這樣的負荷數據庫將減少。

謝謝

相關問題