iT邦幫忙

1

DAO與ORM的差異

  • 分享至 

  • twitterImage

DAO和ORM都是可以對DB操作的技術,請問兩者差異在哪呢?

--
DAO	                數據訪問對象           	         
ADO	                存取資料來源的COM元件,DAO的一個方法 
--
ORM	                物件關聯對應,以OOP的觀念操作DB     
EntityFramework	    微軟支援的ORM	                框架
Dapper	            輕量級的ORM	                    框架
這問題的答案是
DAO是針對數據存取的封存.
ORM是針對物件持久化的封裝.
此外ORM還衍生出Repository設計模式,而Repository是針對 "聚合" 持久化的封裝
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2019-03-29 15:45:33
最佳解答

嗯~~~~很難跟你說明就是了。

啊~~~我想到了。其實就像是貨運一樣。
用飛機用火車用船或是用汽車。

這些全都可以算是一種資料讀取的協議(能用協議論嗎??好像也怪怪的)或方法。
要說差異跟優劣,其實很難說。

因為依照環境或是作用的不同。還有能使用的元件。
都是有其允許及不允許的。

我覺我說的有點亂。但又不想照本宣科的回答。
你看看能意會多少算多少吧。

看更多先前的回應...收起先前的回應...
froce iT邦大師 1 級 ‧ 2019-03-29 15:50:53 檢舉

https://www.jianshu.com/p/00a7ca8d6bea
看這說明,DAO似乎只是把存取資料庫的程式碼封裝成接口,以便後續維護。

ORM則是更進一步的把資料庫的欄位和操作用物件去映射。
然後DAO和ORM基本上層級就不同了。

不過我也沒經過DAO的時代,所以也不是很清楚。

anniecat iT邦新手 3 級 ‧ 2019-03-29 16:01:25 檢舉

所以,一般只會選擇一種方法來對DB做操作嗎?

一定啊??看你的系統需求能用什麼方法就用。
很少看到會同時用兩種方式的。但也不太一定啦。

就有看過web server跟java同步的東西。兩者使用的方法就不相同了。

froce iT邦大師 1 級 ‧ 2019-03-29 16:06:44 檢舉

看我給你的那個連結,他有提到,ORM後面要存取資料庫,也是透過DAO的概念。

一般來說你在寫程式的確只會用一種,但是偶爾有可能會混用。
比如說你有時候ORM用一用,發現ORM不容易寫,還是得寫SQL,這時候你有可能會把SQL封裝成一個lib,這應該就算是簡易的DAO。

anniecat iT邦新手 3 級 ‧ 2019-03-29 16:08:20 檢舉

好的~謝謝你們,我有一個概念了!

weiclin iT邦高手 4 級 ‧ 2019-03-29 18:30:21 檢舉

froce
是不是說反了? 原文意思是 DAO 裡頭使用 ORM 存取資料庫

DAO 本身就是一個抽象化, 底層用什麼方式存取 DB 都被封裝起來, 因此你在底層可以用 ORM, 也可以用 SQL 語法, 或是任何你想用的方式, 只要 DAO 這層沒變, 外面的程式就都不用變

froce iT邦大師 1 級 ‧ 2019-03-29 19:34:45 檢舉

就算是一个应用中采用了ORM框架,也是需要DAO层的。只不过采用ORM后,DAO是跟ORM框架打交道,再由ORM跟数据库打交道;而没有采用,就是DAO层直接访问数据库。

應該沒說反吧。
ORM是把資料庫更進一步封裝,將欄位映射成物件的屬性和方法。
再透過DAL中介,實際去操作資料庫。

不過剛剛看了一下他原文寫的,好像真的有點問題。

froce iT邦大師 1 級 ‧ 2019-03-29 20:01:03 檢舉

以我平常在用的Django ORM為例好了:

# ORM的映射
class Example(models.Model):
    test = models.TextField()
# 實際操作資料庫
e = Example.objects.filter(test="test")

這樣的操作只要你設定好backend是啥就好,不用管你用啥資料庫,寫出來的code都一樣。
那filter這個函數一定背後是透過DAO去看你使用的backend,然後去得到相對應的SQL,送給資料庫。

所以我覺得應該是原文表達有點怪。

weiclin iT邦高手 4 級 ‧ 2019-03-29 20:10:36 檢舉

froce 原文的意思應該是 ORM 不能取代 DAO, 用了 ORM 你還是得在外頭加一層 DAO, 形成 DAO -> ORM -> DB 這樣的架構

他的文法用的比較奇怪, 但是我看確實是這個意思

froce iT邦大師 1 級 ‧ 2019-03-29 20:27:11 檢舉

喔,的確是我搞錯了。
DAO模式的範例:
https://openhome.cc/Gossip/CodeData/PythonTutorial/ObjectSerializationPy3.html

以上面為例,前面Example那邊是ORM,然後用filter這個DAO去操作資料庫。

anniecat iT邦新手 3 級 ‧ 2019-04-01 11:30:16 檢舉

不好意思,不知道我理解的對不對呢?
DAO類似一個框架、容器; ORM類似一門技術、物件,
其架構就像weiclin所說的 : DAO -> ORM -> DB
而ORM與DAO都可以對DB做操作,
只是要看自己的需求怎麼去規劃層級與應用?

要這樣說明也算對啦。
ORM認真來說,可以當物件或是協議。
你可以也將它視為一種工具。它的用處在於口語化及操作方便。

weiclin iT邦高手 4 級 ‧ 2019-04-01 17:12:22 檢舉

anniecat
DAO 實際上是用在系統設計上, 三層式架構的資料存取層(DAL), 是你想把資料保存的細節做抽象化隱藏起來, 讓架構簡單清楚用的

ORM 就是那個要被隱藏起來的細節, 在 DAL 底下到底是用什麼方式存取資料庫的, 甚至到底有沒有用資料庫? 還是只用個 csv 檔在存? 甚至是透過雲端存到 AWS 去了? 實作的細節全部都藏在 DAL 裡面, 你在寫 DAL 以外的部份時完全不用考慮, 只要知道呼叫 DAL 它就會萬事處理好就行

所以這兩者一個是系統設計層面的東西, 另一個是操作資料庫的一種風格或工具, 你只要想想 DAO 底下不一定是關聯式資料庫, 而 ORM 則(實務上)是為資料庫操作用的, 大概會清楚一點

參考: https://stackoverflow.com/questions/8060742/is-a-dao-only-meant-to-access-databases

anniecat iT邦新手 3 級 ‧ 2019-04-02 09:23:46 檢舉

現在已有初步了解,之後在實作時應該會更清楚,謝謝大家的幫忙~

1
Luke
iT邦研究生 5 級 ‧ 2019-04-01 18:38:55

資料存取物件(data access object,DAO)是為某種類型的資料庫或其他永續性機制提供一個抽象介面的物件

物件關聯對映(英語:Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程式設計技術,用於實現物件導向程式語言裡不同類型系統的資料之間的轉換

我要發表回答

立即登入回答