淺談model, Orm, Dao和active Record的區(qū)別

在做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)用父類的方法來完成持久化而已。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卿叽,一起剝皮案震驚了整個濱河市桥胞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌附帽,老刑警劉巖埠戳,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件井誉,死亡現(xiàn)場離奇詭異蕉扮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)颗圣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門喳钟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人在岂,你說我怎么就攤上這事奔则。” “怎么了蔽午?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵易茬,是天一觀的道長。 經(jīng)常有香客問我及老,道長抽莱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任骄恶,我火速辦了婚禮食铐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僧鲁。我一直安慰自己虐呻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布寞秃。 她就那樣靜靜地躺著斟叼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪春寿。 梳的紋絲不亂的頭發(fā)上朗涩,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機(jī)與錄音堂淡,去河邊找鬼馋缅。 笑死扒腕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萤悴。 我是一名探鬼主播瘾腰,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼覆履!你這毒婦竟也來了蹋盆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤硝全,失蹤者是張志新(化名)和其女友劉穎栖雾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伟众,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡析藕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了凳厢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片账胧。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖先紫,靈堂內(nèi)的尸體忽然破棺而出治泥,到底是詐尸還是另有隱情,我是刑警寧澤遮精,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布居夹,位于F島的核電站,受9級特大地震影響本冲,放射性物質(zhì)發(fā)生泄漏准脂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一眼俊、第九天 我趴在偏房一處隱蔽的房頂上張望意狠。 院中可真熱鬧,春花似錦疮胖、人聲如沸环戈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽院塞。三九已至,卻和暖如春性昭,著一層夾襖步出監(jiān)牢的瞬間拦止,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汹族,地道東北人萧求。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像顶瞒,于是被迫代替她去往敵國和親夸政。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容