[英]Sum one table and update other with result, or just do `sum` on select?
可能是一個愚蠢的問題,但我正在創建一個系統,在該系統中,用戶不能在他們可以上傳的圖片中超過 X 個 kb 安裝量。
上傳圖片時,我會使用圖片大小(以 KB 為單位)和其他信息更新images
表。
現在,我還應該跟蹤users
表上每個用戶圖像的總大小嗎? 或者我應該select sum(size) from images where user = xxx
每次我想檢查限制時select sum(size) from images where user = xxx
? 每次新上傳可能會出現哪些情況?
從關系的角度來看,最好的方法是什么?
您可以使用任一方法。
但是,因為您有一個與大小總和相關的業務規則,我可能建議您使用觸發器來維護用戶級別的總和。 雖然這對於insert
s/ update
s/ delete
s 有一些額外的開銷,但在返回有關用戶的信息時它的開銷要小得多。
這還有其他一些優點:
users
表中實現檢查約束(好吧,您可以在最新版本的 MySQL 中執行此操作)。將 SUM 存儲在users
表中是一種非規范化。
如果您需要經常查詢總和,並且每次需要時都進行聚合查詢太慢,那么這可能是值得的。
但是您接受這樣的風險,即users
表中存儲的總和將與相關圖像的實際SUM(size)
不同步。
您不會認為這會很困難,但在實踐中,存在許多邊緣情況,即存儲的總和無法更新。 您將最終在后台定期運行聚合查詢,以覆蓋存儲的總和,以防萬一它不同步。
作為一名編碼人員,非規范化對你來說是更多的工作,因為你必須編寫代碼來糾正這樣的異常。 對於您創建的非規范化案例的數量要保守,因為每個案例都要求您做更多的工作。
但是,如果您對總和的查詢比運行聚合查詢更快地返回結果非常重要,那么這就是您必須做的。
根據我的經驗,所有優化都是有代價的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.