星期日, 12月 11, 2011

DAO vs ORM

看到一篇有趣的文章
比較了 model, orm, dao和active record

個人覺得寫得不錯,將他翻成繁中記錄在此

  --

在做web開發中,經常會碰到這樣幾個概念:

  • Model
  • DAO,data access object,數據訪問對象
  • ORM,object-relational mapping,對象關係映射
  • Active Record

這些概念都是和數據相關的,然而他們之間有怎樣的區別呢?

首先來看Model,模型。模型是MVC中的概念,指的是數據和改變數據的操作(業務邏輯)。模型通常指代現實生活中的某樣實體。以訂單為例,每個訂單都包含許多數據,如客戶、價格、明細等等,這些數據都叫做訂單這個模型的屬性,此外,和訂單相關的一些列操作,比如當購買時,你可能需要先檢查庫存,給與一定的優惠,再更新賬戶餘額和積分等等,這些就叫做業務邏輯,也是模型的一部分,從代碼上來講,是要放在模型中的。

當模型執行完業務邏輯後,我們便要把模型中的數據保存到數據庫中。如果我們直接把和數據庫相關的代碼放在模型裡,會使得以後的維護相當的麻煩。在我之前的一個項目中,我們用戶的增長相當快,導致一台數據庫無法支撐所有的訪問,不得不使用分庫來解決問題。然而前人把SQL語句直接寫在了模型這一層裡,這導致分庫相當的麻煩,我們只能先把這些SQL語句抽出來,才能把分庫進行下去。我們把這些抽出來的SQL代碼放到單獨的一層,這一層便是DAL,Data Access Layer,數據訪問層,它由許多DAO組成,目的便是把和數據庫相關的代碼封裝起來,這樣當我們執行分庫時,便只用調整DAO的代碼了,模型根本不用關心它使用的數據是放在A庫還是B庫。

DAO其實是來源於J2EE的一個設計模式,當初的目的也是使得企業更換數據庫時,不用影響模型層的代碼。

與DAO類似,ORM也是一種封裝數據訪問的概念。然而ORM不像DAO只是一種軟件設計的指導原則,強調的是系統應該層次分明。ORM更像是一種工具,有著成熟的產品,比如JAVA界非常有名的Hibernate,以及很多PHP框架裡自帶的ORM庫。他們的好處在於能將你程序中的數據對象自動地轉化為關係型數據庫中對應的表和列,數據對象間的引用也可以通過這個工具轉化為表之間的join,而Hibernate甚至提供一套他們自己的數據查詢語言HQL來解決複雜的查詢問題。

使用ORM的好處就是使得你的開發幾乎不用接觸到SQL語句。創建一張表,聲明一個對應的類,然後你就只用和這個類的實例進行交互了,至於這個對象裡的數據該怎麼存儲又該怎麼獲取,通通不用關心。

Active Record則是隨著ruby on rails的流行而火起來的一種ORM模式,它是把負責持久化的代碼也集成到數據對象中,即這個數據對象知道怎樣把自己存到數據庫裡。這與以往的ORM有不同,傳統的ORM會把數據對象和負責持久化的代碼分開,數據對象只是一個單純包含數據的結構體,在模型層和ORM層中傳遞。而在Active Record中,模型層集成了ORM的功能,他們既代表實體,包含業務邏輯,又是數據對象,並負責把自己存儲到數據庫中,當然,存儲的這一部分代碼是早已在模型的父類中實現好了的,屬於框架的一部分,模型只需簡單的調用父類的方法來完成持久化而已。


 --


引用這裡的說法:「DAO層是軟件開發演變過程中對於分層概念的產物,目的是更清晰合理的管理軟件開發過程過的代碼和邏輯;而ORM是對數據操作思想的一種改變,不再是面對關係數據庫中的表,而是統一視作對象。」

 --

其他參考:
如何規劃? - DAO模式與ORM概念




沒有留言:

張貼留言