39

我实际上被困在三层结构中。我在网上冲浪,发现了两个术语“数据库抽象层”和“数据访问层”。

两者有什么区别?

4

3 回答 3

48

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

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

于 2010-05-15T02:50:16.657 回答
28

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

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

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

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

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

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

然而,这种抽象是有代价的。我个人认为 ORM 之类的教义或推进是不必要且低效的。在大多数情况下,一个简单的数据访问层就可以了,对于需要特别注意的任何事情都使用手动 SQL,而不必为了某些语法糖而破坏应用程序的性能。这个领域是一个非常激烈的争论,所以我不会再讨论了。

如果您的意思是数据库抽象层,那么它将类似于 PDO,以便您的代码可以用于更多的数据库供应商。我相信 PDO 可以与 MySQL、PostgreSQL 和 mysqli 等一起使用。

于 2010-05-15T02:50:47.710 回答
11

来自维基:

数据访问层

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

例如,DAL 可能会返回对对象的引用(就面向对象编程而言)及其属性,而不是数据库表中的一行字段。这允许创建具有更高抽象级别的客户端(或用户)模块。这种模型可以通过创建一类直接引用相应的数据库存储过程的数据访问方法来实现。另一种实现可能会从文件系统中检索或写入记录。DAL 对外部世界隐藏了底层数据存储的这种复杂性。

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

简而言之,您在业务对象上的基本 CRUD功能/逻辑以推送到/从持久性/存储层拉出。在大多数情况下,您可能只需要这个。ORM 映射、Model 的业务对象接口等都属于这里。

数据库抽象层

数据库抽象层是一种应用程序编程接口,它统一了计算机应用程序与数据库(如 SQL Server、DB2、MySQL、PostgreSQL、Oracle 或 SQLite)之间的通信。传统上,所有数据库供应商都提供针对其产品量身定制的自己的接口,这让应用程序程序员为他或她想要支持的所有数据库接口实现代码。数据库抽象层通过向开发人员提供一致的 API 来减少工作量,并尽可能地将数据库细节隐藏在该接口后面。许多编程语言中存在许多具有不同接口的抽象层。

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


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

于 2013-01-19T12:14:25.520 回答