Sta*_*arx 30 data-access-layer 3-tier dbal doctrine-dbal
我实际上陷入了三层结构.我浏览了互联网,发现了两个术语"数据库抽象层"和"数据访问层".
两者有什么不同?
Cra*_*hie 39
数据访问层=特定于您的应用程序域的创建,读取,更新,删除(CRUD)操作
Data Abstraction Layer =执行通用数据库操作,如连接,命令,参数,使您与供应商特定的数据库隔离,并提供一个高级api来访问数据,无论您使用的是MySQL,Microsoft SQL Server,Oracle,DB2等...
Lot*_*tes 21
我的理解是数据访问层实际上并不抽象数据库,而是使数据库操作和查询构建更容易.
例如,数据访问层通常具有与SQL语法非常相似的API,这些API仍然需要知道数据库的结构才能编写:
$Users->select('name,email,datejoined')->where('rank > 0')->limit(10);
Run Code Online (Sandbox Code Playgroud)
数据抽象层通常是完整的ORM(对象关系映射器),理论上可以防止需要理解任何底层数据库结构或具有任何SQL知识.语法可能是这样的:
Factory::find('Users', 10)->filter('rank > 0');
Run Code Online (Sandbox Code Playgroud)
并且所有对象可能完全填充了所有字段,如果您以这种方式设置,则可能与任何父对象或子对象连接.
然而,这种抽象带来了代价.我个人认为ORM就像学说或推动不必要和低效.在大多数情况下,简单的数据访问层可以正常运行,手动SQL可以用于需要特别注意的任何事情,而不必破坏应用程序对某些语法糖的性能.这个领域是一个非常激烈的辩论,所以我不再讨论了.
如果你的意思是数据的基础抽象层,那么这将是沿着PDO线的东西,让你的代码可以用于数据库供应商的数量较多.我相信PDO可以与MySQL,PostgreSQL和mysqli一起使用.
来自维基:
计算机软件中的数据访问层(DAL)是计算机程序的一层,其提供对存储在某种类型的持久存储器中的数据的简化访问,例如实体 - 关系数据库.
例如,DAL可能返回对对象的引用(在面向对象的编程方面),其对象的属性而不是数据库表中的一行字段.这允许使用更高级别的抽象创建客户端(或用户)模块.可以通过创建一类直接引用相应的数据库存储过程集的数据访问方法来实现这种模型.另一种实现可能潜在地从文件系统检索或写入记录.DAL从外部世界隐藏了底层数据存储的这种复杂性.
例如,不是使用诸如插入,删除和更新之类的命令来访问数据库中的特定表,而是可以在数据库中创建类和一些存储过程.将从类中的方法调用过程,该方法将返回包含所请求值的对象.或者,插入,删除和更新命令可以在诸如存储在数据访问层内的registeruser或loginuser之类的简单函数中执行.
简而言之,您从Persistance/Storage层推送/拉出的业务对象的基本CRUD 功能/逻辑就在这里.对于大多数情况,您可能只想要这样.ORM映射,Model等业务对象的接口都落在这里.
数据库抽象层是一种应用程序编程接口,它统一了计算机应用程序与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和操作分开是没有意义的.