数据库抽象层和数据库之间有什么区别?数据访问层?

时间:2010-05-15 02:23:45

标签: data-access-layer 3-tier dbal doctrine-dbal

我实际上陷入了三层结构。我在互联网上浏览了两个术语“数据库抽象层”& “数据访问层”。

两者有什么区别?

3 个答案:

答案 0 :(得分:39)

数据访问层=特定于您的应用程序域的创建,读取,更新,删除(CRUD)操作

数据抽象层=执行通用数据库操作,如连接,命令,参数,使您与供应商特定的数据库隔离,并提供一个高级API来访问数据,无论您使用的是MySQL,Microsoft SQL Server,Oracle,DB2等。 ..

答案 1 :(得分:20)

我的理解是数据访问层实际上并不抽象数据库,而是使数据库操作和查询构建更容易。

例如,数据访问层通常具有与SQL语法非常相似的API,这些API仍然需要了解数据库的结构才能编写:

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

数据抽象层通常是完整的ORM(对象关系映射器),理论上可以防止需要理解任何底层数据库结构或具有任何SQL知识。语法可能是这样的:

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

并且所有对象都可以使用所有字段完全填充,如果您按照这种方式设置,可能与任何父对象或子对象连接。

然而,这种抽象带来了代价。我个人认为ORM就像学说或推动不必要和低效。在大多数情况下,简单的数据访问层可以正常运行,手动SQL可以用于需要特别注意的任何事情,而不必破坏应用程序对某些语法糖的性能。这个领域是一个非常激烈的辩论,所以我不再讨论了。

如果你的意思是数据 base 抽象层,那么它就像PDO一样,所以你的代码可以用于更多的数据库供应商。我相信,PDO可以与MySQL,PostgreSQL和mysqli一起使用。

答案 2 :(得分:6)

来自维基:

Data Access Layer

  

计算机软件中的数据访问层(DAL),是一层   计算机程序,提供对存储的数据的简化访问   某种持久性存储,例如实体关系   数据库中。

     

例如,DAL可能会返回对象的引用(以术语表示)   面向对象编程的完成与其属性相反   数据库表中的一行字段。这允许客户端(或   user)使用更高抽象级别创建的模块。这个   可以通过创建一类数据访问来实现某种模型   直接引用存储的相应数据库集的方法   程序。另一种实现可能会检索或写入   记录到文件系统或从文件系统记录。 DAL隐藏了这种复杂性   来自外部世界的基础数据存储。

     

例如,不使用插入,删除和等命令   更新以访问数据库,类和一些中的特定表   可以在数据库中创建存储过程。程序   将从类中的方法调用,它将返回一个   包含请求值的对象。或者,插入,删除和   更新命令可以在简单的函数中执行   存储在数据访问层中的registeruser或loginuser。

简而言之,您在Persistance / Storage层推送/拉出的业务对象上的基本CRUD 功能/逻辑落在这里。对于大多数情况,您可能只想要这样。 ORM映射,Model等业务对象的接口落在这里。

Database Abstraction Layer

  

数据库抽象层是应用程序编程接口   它统一了计算机应用程序之间的通信   数据库,如SQL Server,DB2,MySQL,PostgreSQL,Oracle或   SQLite的。传统上,所有数据库供应商都提供自己的   根据他们的产品量身定制的界面   应用程序员为所有数据库接口实现代码   他或她想支持。数据库抽象层减少   通过向开发人员提供一致的API来完成工作量   尽可能隐藏此接口背后的数据库细节。   存在许多具有不同接口的抽象层   众多编程语言。

基本上,它是一个额外的抽象层,因此您可以针对独立于供应商的接口 CRUD ,而不用担心各种数据库供应商的实现细节。只有当您想要支持多个数据库时,才需要这个。 ORM,微型ORM,包装器,通用驱动程序类,无论名称是什么,等等处理连接建立,参数处理,执行等等。它只是Persistance / Storage层之前的附加层。在3层术语中,这两个层都属于一层,因为它们在逻辑上不是分开的。


总结一下,DAL是关于数据的,DbAL是关于数据库的。 DAL定义操作,DbAL操作。 DAL位于DbAL后面,仅落后于实际Db。 DAL调用DbAL。 DAL是将业务逻辑(在模型中)与CRUD逻辑分离的好东西,而DbAL很少需要(但我喜欢它)。 DAL是更高级别的设计映射,DbAL是更低级别的架构和实现。两者都分开了责任。 ORM是庞大的结构,可以为您完成。我不确定在使用ORM时如何将它们分开。你不需要,因为ORM为你处理所有这些。理想情况下,无论如何,我会在一个项目中使用DAL,而在另一个项目中使用DbAL,我会简单地将其称为持久层,因为在它上面分离Db和操作是没有意义的。