数据库抽象层——那是什么?

Database abstraction layer - What is that?

我有一些关于数据库抽象层 (dbal) 的基本问题。我想对此有更好的理解。我已经知道 dbal 是一个应用程序编程接口。我使用 PHP 作为我的基本编程语言,MySQL 作为数据库,所以我的问题将基于它。让我们开始吧...

感谢您的帮助:)

虽然您可能会争辩说任何隐藏了与数据库的低级通信细节的 API 是字面意义上的 "abstraction layer",但术语 "Database Abstraction Layer" 通常是用于指代更具体的 API.

类型

我希望 DBAL 至少具有支持不止一种类型的 DBMS 的潜力;名称中的 "abstraction" 意味着 API 没有紧密耦合到一个底层协议或驱动程序。

MySQLi PHP extension 将自己称为 "connector",它包裹了较低级别的 "driver",尽管这个术语并不是特别普遍。对于 PHP 的大多数用户来说,它只是 "the MySQL driver",与该 DBMS 的功能密切相关。

PHP的PDO扩展当然可以看作是一个DBAL,因为它统一了对各种数据库驱动的访问,并且抽象了一些查询参数等概念。另一方面,它是相当 "low level" 的抽象,因为它暴露了底层系统的许多复杂性。 The introduction in the manual 将其称为 "data-access abstraction layer",与 "full-blown database abstraction layer" 不同。

另一方面,

Doctrine DBAL 为交易等功能提供了更丰富的 API,并包含一个查询构建器,它抽象了 SQL 语法中的差异。为使用 PDO 编写的代码仍然需要为特定的 DBMS 使用正确的语法和选项,而为使用 Doctrine DBAL 编写的代码理论上可以 运行 在任何支持的 DBMS 上无需修改。

更丰富的抽象是可能的,例如对象关系映射器,例如 Doctrine ORM。这些通常不会被称为 DBAL,尽管严格来说它们确实提供了一个抽象数据库的层。

请记住,所有这些只是为了方便引用事物 - 没有法律规定应用程序必须使用一组特定的层,或者这些层必须属于特定类别。设计模式也是如此,因此在一般情况下,您关于 Facade 模式的问题并不能真正回答——如果您正在实施 DBAL,您可能会使用 Facade 模式作为如何构建它的指南;但您可能在这样的环境中工作,而这不是理解架构的有用方法。