如果您正在執行min/max/avg查詢,那麼您更喜歡使用聚合表還是僅查詢原始表中的一系列行?要聚合還是不聚合,那就是數據庫模式設計問題
這顯然是一個非常開放的問題,沒有一個正確的答案,所以我只是尋找人們的一般建議。假設原始數據表由一個時間戳,一個數字外鍵(比如用戶ID)和一個十進制值(比如購買金額)組成。此外,假設表中有數百萬行。
我已經完成並且被撕裂了。一方面,聚合表爲我提供了更快的查詢速度,但代價是增加了額外的表。顯示聚合範圍的當前值要麼完全返回到原始數據表或組合更多細粒度聚合。我發現在應用程序代碼中追蹤哪個聚合表要查詢何時需要更多的工作,並且需要更改模式,因爲原始聚合範圍總是不夠用(「但我想看看我們在過去3個薪酬階段的銷售額!「)。
另一方面,從原始數據查詢可能會受到懲罰,但讓我對數據範圍非常靈活。當範圍邊界發生變化時,我只需更改查詢而不必重新生成聚合表。同樣,應用程序代碼也需要更少的更新。我懷疑如果我的索引更聰明(即總是有很好的覆蓋索引),我可以減少從原始數據中選擇的懲罰,但這決不是萬能藥。
無論如何我能擁有兩全其美?
這是幹什麼用的數據庫? – 2009-12-23 23:33:55
我通常使用MySQL,但希望人們的提示適用於所有SQL數據庫。 – pr1001 2009-12-23 23:46:15
@ pr1001:這在一定程度上是一個普遍問題,但是一些數據庫提供了使這個問題更容易的機制(例如Oracle的「物化視圖」),所以這樣做「正確」將會是數據庫特定的程度 – skaffman 2009-12-24 10:41:44