2010-05-15 93 views

回答

18

我的理解是數據訪問層並不實際抽象數據庫,而是使數據庫操作和查詢建立更容易。

例如,數據訪問層通常具有的API非常類似於SQL的語法仍然需要數據庫的結構的知識才能寫出:

$Users->select('name,email,datejoined')->where('rank > 0')->limit(10); 

數據抽象層通常是完全成熟的ORM的(對象關係Mappers),理論上可以防止需要了解任何底層數據庫結構或具有任何SQL知識。語法可能是這樣的:

Factory::find('Users', 10)->filter('rank > 0'); 

而且所有的對象可能與所有的領域,可能與父母或子女參加,如果你設置它的方式反對完全填充。

但是,這種抽象帶有價格。我個人發現ORM的教義或推動是不必要的和低效的。在大多數情況下,一個簡單的數據訪問層將會很好,對於需要特別關注的任何事情,都可以使用手動SQL,而不必爲了某些語法糖而破壞應用程序的性能。這個領域是一個非常激烈的辯論,所以我不會再進入它了。

如果你的意思是數據基地抽象層,那麼它將沿着PDO的線,這樣你的代碼就可以用於更多的數據庫供應商。我相信,PDO可以與MySQL,PostgreSQL和mysqli一起工作。

+0

我有點困惑你的答案。你能讓它更簡單一點嗎?可能會有更多的例子可能有所幫助。我很困惑。 – kamal 2011-07-15 13:00:46

29

數據訪問層=創建,讀取,更新,刪除(CRUD)特定於應用程序域

數據抽象層操作=執行通用的數據庫操作,如連接,命令,參數,從供應商的特定數據庫絕緣你提供一個用於訪問數據的高級API,無論您使用的是MySQL,Microsoft SQL Server,Oracle,DB2等...

+2

短而甜。做得好。 – 2013-02-07 19:56:15

5

來自維基:

Data Access Layer

在計算機軟件的數據訪問層(DAL),是一種 計算機程序,它提供對存儲在一些 持久存儲的數據的簡化訪問層比如實體關係型的數據庫。

例如,DAL可能返回到一個對象的引用(在術語面向對象編程的 )完成與它的屬性從數據庫表字段的行代替 。這允許客戶端(或 用戶)模塊以更高級別的抽象創建。這種類型的模型可以通過創建一類數據訪問方法來實現,該方法直接引用相應的一組數據庫存儲的程序。另一個實現可能會檢索或寫入文件系統中的記錄或從文件系統中寫入記錄 。 DAL隱藏了來自外部世界的底層數據存儲的這種複雜性。

例如,可以不使用諸如insert,delete和 更新之類的命令來訪問數據庫中的特定表,而是可以在數據庫中創建一個類和幾個 存儲過程。程序 將從該類中的方法調用,該方法將返回包含請求值的 對象。或者,插入,刪除和更新命令可以在存儲在數據訪問層內的簡單函數(如 registeruser或loginuser)中執行。

總之,你的基本的CRUD 功能/邏輯在業務對象上推,從持久性/存儲層/拉在這裏落下。對於大多數情況下,您可能只需要這個。 ORM映射,Model等業務對象的接口屬於這裏。

Database Abstraction Layer

數據庫抽象層是應用程序編程接口 ,其統一的計算機應用和數據庫 如SQL Server,DB2,MySQL和PostgreSQL,Oracle或 SQLite的之間的通信。傳統上,所有數據庫供應商都會爲其產品量身定製其自己的接口,並將其留給 應用程序員來實現他或她願意支持的所有數據庫接口 的代碼。數據庫抽象層通過向開發者提供一致的API來減少工作量,並且儘可能地隱藏該接口後面的數據庫細節。 在衆多編程語言中,存在許多具有不同接口的抽象層。

基本上,它的抽象的附加層,讓你CRUD對供應商無關的接口和少擔心各種數據庫廠商的實現細節。只有在您需要支持多個數據庫的情況下,您才需要使用它。 ORM,微型ORM,包裝,通用驅動程序類,無論名稱是什麼等處理連接建立,參數處理,執行等在這裏落下。這只是Persistence/Storage層之前的附加層。在三層術語中,這兩個層次都屬於一個層次,因爲它們在邏輯上不是分開的。


總之,DAL是關於數據的,DbAL是關於數據庫的。 DAL定義了操作,DbAL操作。 DAL位於實際Db後面的DbAL後面。 DAL調用DbAL。 DAL是將業務邏輯(模型中)與CRUD邏輯分開的好東西,而DbAL很少需要(但我喜歡它)。 DAL是更高層次的設計映射,DbAL是更低層次的架構和實現。兩者分離責任。 ORMs是爲你而做的大型結構。我不確定在使用ORM時如何區分它們。您不需要,因爲ORM爲您處理所有這些。理想情況下,我會在一個項目中使用DAL,在另一個項目中使用DbAL,因爲沒有必要將Db和操作分開,所以我簡單地調用Persistence層。