2012-12-19 27 views
2

我有一個像下面兩個表:MySQL的計算領域的良好做法

ERD

我只是想知道這是否是使用這種結構,並把所有的發票金額加總的一個很好的做法父表爲了獲得更快的請求並避免一些經常性計算(結果將在發票表上後用觸發器更新)?

還是更好地得到一個規範化的表,並不緩存計算字段的種類?

回答

1

這不是壞習慣本身。 但是,在實施之前你應該三思而後行。非規範化可能會提高性能,但並非總是如此,並且在可維護性方面也存在成本。

平均每個項目有多少個 子項目 發票存在?如果只有少數,那麼計算總和的成本是微不足道的。在這種情況下不要去規範化。

對於一個給定項目, 子項目 發票的清單可能會多長時間更改一次?如果很少,那麼你應該預先整理總數。相反,如果 子項目 發票的清單很可能會「經常」更改(與您需要讀取/計算總和的頻率相比),那麼您很可能會花費更多時間重新計算總和不必要。底線:在確定真實瓶頸之前,不要非規範化。一旦確定了真正的性能問題,重寫應用程序以在稍後時間對重構進行說明應該是相對輕鬆的。

+0

基本上,一個項目基本上不會包含超過20個子項目和一個子項目不超過10個發票,但是選擇計算會比更新更頻繁因爲子項目將從包含這個總和列表的表格列表中打開,此外,驗證過的發票將不再可編輯,但是根據您的解釋,我認爲實施此計算字段並不是一個好主意,除非我能找到一個真正的低性能。謝謝! –

1

我沒有看到使用給定的結構存儲總計的任何問題。您有invoice_numberinvoice_date作爲鑰匙使用,因此沒有混淆的危險。只計算一次顯然更有效率。基本上,每次需要結果時爲什麼要進行計算?

+0

謝謝,這正是我的想法,但我只是想確保這不是一個壞習慣。例如,如果任何人手動編輯數據庫並且不更新父表上的總數,它會創建一個完整性錯誤('invoiced_sell_price_DF'將不再等於'invoice_total_DF'的總和。但是觸發器應該避免這個問題當我讀到一些網絡博客討論標準化表格時,我們只是變得偏執狂! –