【问题标题】:Database abstraction layer - What is that?数据库抽象层 - 那是什么?
【发布时间】:2019-07-24 09:18:08
【问题描述】:

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

  • MySQL Shell 是否已经是更深层次的 dbal? 我给你一个例子,下面的命令将打印结果,我可以在我的脚本上处理它。所以在我看来它就像一个 api,一个非常糟糕的,但它会起作用。

    mysql --batch -u root -p -e "select * from foobar"

  • MySQL 改进扩展和 PHP 数据对象也是 dbal 吗? 我会说是的,因为它为我提供了一个很好的 api 来处理 PHP 中与数据库相关的东西。

  • 很长时间以来,我一直认为在一个 api 中处理不同的数据库是 dbal 背后的主要思想。但是我意识到这是与数据库无关的,而不是 dbal。因此,当 dbal 可以处理多个数据库时,它与数据库无关,我是对的吗?

  • 最后一个问题。在我参与这个话题之后,我意识到 dbal 是门面。那么每个 dbal 都是一个编程接口,这一定意味着,每个 api 都是设计模式意义上的外观?是这样吗?

感谢您的帮助:)

【问题讨论】:

  • 我从未听说过 DBAL 这个词,而且我从事软件工作已有 20 多年了。但是,我可以评论您强调的一些内容。软件中一个潜在的主要问题是它需要访问数据库,但更愿意以不与任何特定供应商(例如 MySQL 或 SQL Server)紧密耦合的方式进行访问。因此,开发人员希望使用一些数据库接口,而不用担心实际使用的是哪个数据库。

标签: php mysql database dbal


【解决方案1】:

虽然您可能会争辩说,任何隐藏与数据库的低级通信细节的 API 都是字面意义上的“抽象层”,但术语“数据库抽象层”通常用于指代更具体的API 类型。

我希望 DBAL 至少有可能支持不止一种类型的 DBMS;名称中的“抽象”意味着 API 没有与一个底层协议或驱动程序紧密耦合。

MySQLi PHP extension 将自己称为“连接器”,它封装了一个较低级别的“驱动程序”,尽管这个术语并不是特别普遍。对于大多数 PHP 用户来说,它只是“MySQL 驱动程序”,与 DBMS 的特性密切相关。

PHP 的 PDO 扩展当然可以看作是一个 DBAL,因为它统一了对各种数据库驱动程序的访问,并抽象了查询参数等一些概念。另一方面,它是一个相当“低级”的抽象,因为它暴露了底层系统的许多复杂性。 The introduction in the manual 将其称为“数据访问抽象层”,不同于“成熟的数据库抽象层”。

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

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

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

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2011-02-19
    • 2011-11-14
    • 2011-07-15
    • 2012-11-22
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多