從資料結構+演算法分析ORM的末日
大家討論都挺好,我下面進行純粹分析一下,今天腦子比較好些。
物件和資料庫都是一種靜態的資料結構,而SQL與LinQ或Lambda表示式或Stream都屬於一種動態演算法過程。兩個分別對應記憶體和CPU,如同哼哈二將,陰陽一體,一個系統由這個兩個組成比較和諧。但是有時會組合錯誤。
和諧:
資料結構+演算法過程
不匹配阻抗:
資料結構+資料結構
演算法過程+演算法過程
使用ORM相當於物件和資料庫兩個資料結構,因此存在阻抗矛盾,相反,因為SQL屬於演算法過程,SQL+資料庫反而比較協調,但是做些CRUD還可以,應對複雜的業務,需要翻看各種資料表設計才能明白業務,資料庫表又混雜了各種技術效能最佳化等技術方言,相當於方言夾帶普通話,只通普通話(代表業務語言)的人不容易聽通,增加溝通的難度。
後來有了Java等物件語言,就有了SQL+資料庫+DTO資料Java物件,這就是大部分系統的特點,兩個資料結構發生阻抗,改了資料庫表還要改Java物件。
Hibernate試圖協調物件和資料庫兩種資料結構矛盾,其實是清官難斷家務事,搗漿糊而已,因為從邏輯上物件和資料表兩者本來就沒有必要搞到一起,搞個對映對應。
Hibernate出來很討人喜歡,但是做些簡單CRUD沒有問題,隨著專案深入,加上程式設計師資料庫思維影響,使用Hibernate覺得隔著靴子瘙癢,其實我一直認為,如果程式設計師有閱讀一個框架的原始碼衝動時,說明抽象洩漏已經發生,洩漏出來的壞味道已經讓使用者心神不寧了。最終現實是:使用Hibernate的人是SQL與Hibernate兩個要一起掌握,其實是增加學習成本。
EventSourcing是因為DDD這個用物件分析複雜業務的方法出現以後才出來,ES屬於演算法,領域物件聚合根實體屬於資料結構,兩種陰陽搭配協調,如同SQL+資料庫一樣乾淨。
當然,LinQ+集合或Stream+Collection都屬於和諧乾淨的陰陽合體。OO+函式也是。包括大資料分析中Stream+Cache都是這樣。
總之:只要一個系統只有一個資料結構+一個演算法過程,這個系統本身就乾淨和諧,只有系統架構乾淨簡單,才不至於因為架構複雜而導致專案失敗或導致專案維護困難。聰明的人不能因為自己發明解決問題的方法干擾了自己解決問題的目的。
物件和資料庫都是一種靜態的資料結構,而SQL與LinQ或Lambda表示式或Stream都屬於一種動態演算法過程。兩個分別對應記憶體和CPU,如同哼哈二將,陰陽一體,一個系統由這個兩個組成比較和諧。但是有時會組合錯誤。
和諧:
資料結構+演算法過程
不匹配阻抗:
資料結構+資料結構
演算法過程+演算法過程
使用ORM相當於物件和資料庫兩個資料結構,因此存在阻抗矛盾,相反,因為SQL屬於演算法過程,SQL+資料庫反而比較協調,但是做些CRUD還可以,應對複雜的業務,需要翻看各種資料表設計才能明白業務,資料庫表又混雜了各種技術效能最佳化等技術方言,相當於方言夾帶普通話,只通普通話(代表業務語言)的人不容易聽通,增加溝通的難度。
後來有了Java等物件語言,就有了SQL+資料庫+DTO資料Java物件,這就是大部分系統的特點,兩個資料結構發生阻抗,改了資料庫表還要改Java物件。
Hibernate試圖協調物件和資料庫兩種資料結構矛盾,其實是清官難斷家務事,搗漿糊而已,因為從邏輯上物件和資料表兩者本來就沒有必要搞到一起,搞個對映對應。
Hibernate出來很討人喜歡,但是做些簡單CRUD沒有問題,隨著專案深入,加上程式設計師資料庫思維影響,使用Hibernate覺得隔著靴子瘙癢,其實我一直認為,如果程式設計師有閱讀一個框架的原始碼衝動時,說明抽象洩漏已經發生,洩漏出來的壞味道已經讓使用者心神不寧了。最終現實是:使用Hibernate的人是SQL與Hibernate兩個要一起掌握,其實是增加學習成本。
EventSourcing是因為DDD這個用物件分析複雜業務的方法出現以後才出來,ES屬於演算法,領域物件聚合根實體屬於資料結構,兩種陰陽搭配協調,如同SQL+資料庫一樣乾淨。
當然,LinQ+集合或Stream+Collection都屬於和諧乾淨的陰陽合體。OO+函式也是。包括大資料分析中Stream+Cache都是這樣。
總之:只要一個系統只有一個資料結構+一個演算法過程,這個系統本身就乾淨和諧,只有系統架構乾淨簡單,才不至於因為架構複雜而導致專案失敗或導致專案維護困難。聰明的人不能因為自己發明解決問題的方法干擾了自己解決問題的目的。
[該貼被banq於2014-04-23 07:37修改過]
相關文章
- 資料結構:初識(資料結構、演算法與演算法分析)資料結構演算法
- 資料結構和演算法分析資料結構演算法
- 資料結構與演算法分析——棧資料結構演算法
- 資料結構與演算法分析——連結串列資料結構演算法
- 資料結構與演算法分析——佇列資料結構演算法佇列
- 《資料結構與演算法分析》筆記資料結構演算法筆記
- 資料結構與演算法分析 (雜湊)資料結構演算法
- 資料結構與演算法-資料結構(棧)資料結構演算法
- python之資料結構與演算法分析Python資料結構演算法
- 資料結構與演算法——複雜度分析資料結構演算法複雜度
- 跳躍表資料結構與演算法分析資料結構演算法
- javascript資料結構與演算法--基本排序演算法分析JavaScript資料結構演算法排序
- 【PHP資料結構】PHP資料結構及演算法總結PHP資料結構演算法
- 資料結構&演算法資料結構演算法
- 資料結構演算法資料結構演算法
- ArrayList 資料結構分析資料結構
- Unbound資料結構分析資料結構
- PHP7資料結構與演算法分析:前言PHP資料結構演算法
- 資料結構與演算法分析 (優先佇列)資料結構演算法佇列
- PHP7資料結構與演算法分析:第一章--資料結構和演算法簡介PHP資料結構演算法
- 資料結構與演算法分析——開篇以及複雜度分析資料結構演算法複雜度
- 從資料結構到演算法:圖網路方法初探資料結構演算法
- 演算法與資料結構,從入門到不放棄~演算法資料結構
- 末日演算法演算法
- 資料結構與演算法:圖形結構資料結構演算法
- 資料結構與演算法學習-複雜度分析資料結構演算法複雜度
- 樹 【資料結構與演算法分析 c 語言描述】資料結構演算法
- 資料結構與演算法分析 讀書筆記(樹)資料結構演算法筆記
- leetcode演算法資料結構題解---資料結構LeetCode演算法資料結構
- JavaScript 的資料結構和演算法JavaScript資料結構演算法
- Java的資料結構和演算法Java資料結構演算法
- 前端演算法 - 資料結構前端演算法資料結構
- 基本資料結構演算法資料結構演算法
- 資料結構——Floyd演算法資料結構演算法
- 資料結構和演算法資料結構演算法
- 資料結構及演算法資料結構演算法
- 演算法和資料結構演算法資料結構
- 資料結構演算法題資料結構演算法