2010-05-15 90 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层。