簡體   English   中英

匯總一張表並用結果更新其他表,或者只是在選擇時執行“sum”?

[英]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 有一些額外的開銷,但在返回有關用戶的信息時它的開銷要小得多。

這還有其他一些優點:

  • 您可以對大小強加業務規則。 例如,您可以將大小四舍五入到最接近的 1k,然后將它們相加。 您不希望這樣的業務邏輯通過多個查詢傳播。
  • 您可以直接在users表中實現檢查約束(好吧,您可以在最新版本的 MySQL 中執行此操作)。
  • 您可以索引總圖像大小,以便您輕松查看誰最接近他們的限制。

將 SUM 存儲在users表中是一種非規范化。

如果您需要經常查詢總和,並且每次需要時都進行聚合查詢太慢,那么這可能是值得的。

但是您接受這樣的風險,即users表中存儲的總和將與相關圖像的實際SUM(size)不同步。

您不會認為這會很困難,但在實踐中,存在許多邊緣情況,即存儲的總和無法更新。 您將最終在后台定期運行聚合查詢,以覆蓋存儲的總和,以防萬一它不同步。

作為一名編碼人員,非規范化對你來說是更多的工作,因為你必須編寫代碼來糾正這樣的異常。 對於您創建的非規范化案例的數量要保守,因為每個案例都要求您做更多的工作。

但是,如果您對總和的查詢比運行聚合查詢更快地返回結果非常重要,那么這就是您必須做的。

根據我的經驗,所有優化都是有代價的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM