2011-12-16 51 views
5

在我使用數據庫的所有應用程序中,我通常會將計算值與計算該值所需的變量一起存儲。例如,如果我有tonnagecost我會乘以他們來計算total。我可以在每次需要時重新計算價值,我只是想知道是否有標準方法。無論哪種方式對我都很好,我只想做最常見的事情。我應該將計算值與變量一起存儲在數據庫中嗎?

如果我保存它使我的域類稍微複雜的計算變量,但讓我控制器邏輯清潔,如果我不存儲計算的變量,它是周圍的其他方式。

的計算不會是非常頻繁的,但可能是適度頻繁,但數學是便宜吧?

回答

7

的標準方法是不要存放這種計算值的 - 它打破正常化。

有要存儲計算的值,如果時間過長,重新計算的情況下,或者你正在運行一個數據倉庫等。在你的情況,你要堅持規範化規則。

1

以我的經驗,做的最常見的就是一個)存儲計算的值,b)沒有問題,保證值是正確的數據庫中的任何CHECK約束。

的事情或者是

  • 不存儲計算
  • 存放在列中的計算值與CHECK約束驗證的結果。

MySQL不支持CHECK約束。所以選項

  • 不存儲計算的結果
  • 切換到DBMS支持CHECK約束,如PostgreSQL的。
0

簡單的數學運算相對便宜,但是當存儲這些值時,您需要權衡額外的存儲成本與性能節省。另一件你可能要考慮的事情是數據更新會產生什麼樣的影響,你只能更新字段值,你也需要更新計算值。

1

這一切都取決於哪些資源環境中的稀缺。如果您預先計算了該值,則可以節省CPU時間,但需要增加網絡使用量和DB存儲空間。現在,CPU時間通常比網絡帶寬和數據庫存儲更豐富,所以我會猜測只要計算不太複雜,那麼預先計算該值就不值得。

在另一方面,也許你正在計算中的值將CPU的大量。在這種情況下,您可能需要在數據庫中緩存該值。

所以,這取決於你有什麼,你缺少什麼。

3

這違反範式有這個計算值。除非有理由去規範化(通常是性能約束),那麼你應該儘可能規範化你的表,這將使你的數據庫更容易維護/改進,並且非規範化可能會將你鎖定到一個難以改變的設計中,並且暴露您的數據不一致和冗餘。

相關問題