在數據庫和應用程序代碼中執行計算的優缺點
- database
1.概述
通常,我們發現很難決定是否應該在數據庫(RDBMS)或應用程序代碼中執行計算以同時獲得良好的性能和便利性。
在本文中,我們將探討在數據庫和應用程序代碼中執行計算的優缺點。
我們將考慮一些可能影響此決策的因素,並討論哪個層(數據庫或應用程序)更適合處理它們。
2.數據庫中的計算
2.1 數據選擇與聚合
關係數據庫針對數據的處理,選擇和聚合進行了高度優化。我們可以使用SQL輕鬆地對數據進行分組,排序,過濾和聚合。
LEFT
和RIGHT JOIN
輕鬆地從多個表中選擇和取消選擇數據集。
同樣, **MIN
, MAX
, SUM
和AVG
類的聚合函數比Java實現要方便且快捷。
**
另外,我們可以在聚合數據時利用索引來調整磁盤IO的性能。
2.2 數據量
所有流行的RDBMS在處理表中的大量數據以進行計算時均提供無與倫比的性能。
但是,與數據庫相比,我們將需要大量資源(例如內存和CPU處理)來處理應用程序中類似數量的數據。
另外,為了節省帶寬,建議在數據庫中執行以數據為中心的計算,從而避免通過網絡傳輸大量數據。
3.應用中的計算
3.1 複雜計算
與數據庫不同,諸如Java之類的高級語言在處理複雜的計算方面非常精通。
例如,我們可以利用Java中的異步編程,並行執行和多線程來解決複雜的問題。
同樣,數據庫為日誌記錄和調試提供了最少的支持。但是,當今的高級語言為此類關鍵功能提供了出色的支持,這些功能通常在實現複雜的計算中非常方便。
例如,我們可以使用SLF4J輕鬆添加Java應用程序中的日誌記錄,並使用流行的IDE(例如Eclipse和IntelliJ IDEA)進行調試。因此,與數據庫相比,在應用程序中執行計算是開發人員的便捷選擇。
同樣,另一個論點是,我們可以輕鬆地在應用程序代碼中對計算進行單元測試,這在數據庫中執行起來相當複雜。
事實證明,單元測試非常方便,可以檢查實現中的更改。因此,在Java應用程序中執行計算時,我們可以使用JUnit添加單元測試。
3.2 先進的數據分析和轉換
該數據庫為高級數據分析和轉換提供了有限的支持。但是,使用應用程序代碼執行複雜的計算很簡單。
例如,Deeplearning4J,Weka和TensorFlow等各種庫可用於高級統計和機器學習支持。
另一個常見用例是,我們可以使用Hibernate等ORM技術輕鬆地對數據進行對象化,使用Java Streams等API來處理數據,並通過XML或JSON解析庫以各種格式生成結果。
3.3 可擴展性
由於RDBMS只能向上擴展,因此實現數據庫可伸縮性可能是一項艱鉅的任務。但是,應用程序代碼提供了更可擴展的解決方案。
我們可以使用負載平衡器輕鬆擴展應用服務器並處理大量請求。
4.數據庫與應用程序
現在,我們已經看到了在每一層上基於某些因素執行計算的優勢,讓我們總結一下它們之間的差異:
- 數據庫是數據選擇,聚合和處理大量數據的首選
- 但是,在考慮諸如復雜性,高級數據轉換,第三方集成和可伸縮性等因素時,在應用程序代碼中執行計算似乎是一個更好的選擇。
- 此外,高級語言還提供了其他好處,例如日誌記錄,調試,錯誤處理和單元測試功能。
混合併利用這兩層的優點來解決一個複雜的問題始終是一個好主意。
換句話說,使用數據庫進行數據的選擇和聚集,然後將有用的精益數據傳輸到應用程序,並使用高效的高級語言對應用程序執行複雜的操作。
5.結論
在本文中,我們探討了在應用程序和數據庫中執行計算的利弊。
首先,我們討論了在數據庫層和應用程序層中執行計算的優點。然後,我們總結了有關基於我們討論的所有因素進行計算的結論。