在做web開發(fā)中塘幅,經(jīng)常會碰到這樣幾個概念:
Model
DAO昔案,data access object尿贫,數(shù)據(jù)訪問對象
ORM,object-relational mapping爱沟,對象關(guān)系映射
Active Record
這些概念都是和數(shù)據(jù)相關(guān)的帅霜,然而他們之間有怎樣的區(qū)別呢匆背?
首先來看Model呼伸,模型。模型是MVC中的概念钝尸,指的是數(shù)據(jù)和改變數(shù)據(jù)的操作(業(yè)務(wù)邏輯)括享。模型通常指代現(xiàn)實(shí)生活中的某樣實(shí)體。以訂單為例珍促,每個訂單都包含許多數(shù)據(jù)铃辖,如客戶、價格猪叙、明細(xì)等等娇斩,這些數(shù)據(jù)都叫做訂單這個模型的屬性,此外穴翩,和訂單相關(guān)的一些列操作犬第,比如當(dāng)購買時,你可能需要先檢查庫存芒帕,給與一定的優(yōu)惠歉嗓,再更新賬戶余額和積分等等,這些就叫做業(yè)務(wù)邏輯背蟆,也是模型的一部分鉴分,從代碼上來講,是要放在模型中的带膀。
當(dāng)模型執(zhí)行完業(yè)務(wù)邏輯后志珍,我們便要把模型中的數(shù)據(jù)保存到數(shù)據(jù)庫中。如果我們直接把和數(shù)據(jù)庫相關(guān)的代碼放在模型里垛叨,會使得以后的維護(hù)相當(dāng)?shù)穆闊┎耆埂T谖抑暗囊粋€項目中,我們用戶的增長相當(dāng)快点额,導(dǎo)致一臺數(shù)據(jù)庫無法支撐所有的訪問舔株,不得不使用分庫來解決問題。然而前人把SQL語句直接寫在了模型這一層里还棱,這導(dǎo)致分庫相當(dāng)?shù)穆闊┰卮龋覀冎荒芟劝堰@些SQL語句抽出來,才能把分庫進(jìn)行下去珍手。我們把這些抽出來的SQL代碼放到單獨(dú)的一層办铡,這一層便是DAL辞做,Data Access Layer,數(shù)據(jù)訪問層寡具,它由許多DAO組成秤茅,目的便是把和數(shù)據(jù)庫相關(guān)的代碼封裝起來,這樣當(dāng)我們執(zhí)行分庫時童叠,便只用調(diào)整DAO的代碼了框喳,模型根本不用關(guān)心它使用的數(shù)據(jù)是放在A庫還是B庫。
DAO其實(shí)是來源于J2EE的一個設(shè)計模式厦坛,當(dāng)初的目的也是使得企業(yè)更換數(shù)據(jù)庫時五垮,不用影響模型層的代碼。
與DAO類似杜秸,ORM也是一種封裝數(shù)據(jù)訪問的概念放仗。然而ORM不像DAO只是一種軟件設(shè)計的指導(dǎo)原則,強(qiáng)調(diào)的是系統(tǒng)應(yīng)該層次分明撬碟。ORM更像是一種工具诞挨,有著成熟的產(chǎn)品,比如JAVA界非常有名的Hibernate呢蛤,以及很多PHP框架里自帶的ORM庫惶傻。他們的好處在于能將你程序中的數(shù)據(jù)對象自動地轉(zhuǎn)化為關(guān)系型數(shù)據(jù)庫中對應(yīng)的表和列,數(shù)據(jù)對象間的引用也可以通過這個工具轉(zhuǎn)化為表之間的join顾稀,而Hibernate甚至提供一套他們自己的數(shù)據(jù)查詢語言HQL來解決復(fù)雜的查詢問題达罗。
使用ORM的好處就是使得你的開發(fā)幾乎不用接觸到SQL語句。創(chuàng)建一張表静秆,聲明一個對應(yīng)的類粮揉,然后你就只用和這個類的實(shí)例進(jìn)行交互了,至于這個對象里的數(shù)據(jù)該怎么存儲又該怎么獲取抚笔,通通不用關(guān)心扶认。
Active Record則是隨著ruby on rails的流行而火起來的一種ORM模式,它是把負(fù)責(zé)持久化的代碼也集成到數(shù)據(jù)對象中殊橙,即這個數(shù)據(jù)對象知道怎樣把自己存到數(shù)據(jù)庫里辐宾。這與以往的ORM有不同,傳統(tǒng)的ORM會把數(shù)據(jù)對象和負(fù)責(zé)持久化的代碼分開膨蛮,數(shù)據(jù)對象只是一個單純包含數(shù)據(jù)的結(jié)構(gòu)體叠纹,在模型層和ORM層中傳遞。而在Active Record中敞葛,模型層集成了ORM的功能誉察,他們既代表實(shí)體,包含業(yè)務(wù)邏輯惹谐,又是數(shù)據(jù)對象持偏,并負(fù)責(zé)把自己存儲到數(shù)據(jù)庫中驼卖,當(dāng)然,存儲的這一部分代碼是早已在模型的父類中實(shí)現(xiàn)好了的鸿秆,屬于框架的一部分酌畜,模型只需簡單的調(diào)用父類的方法來完成持久化而已。