【问题标题】:Best PHP DAL (data abstraction layer) so far [closed]迄今为止最好的 PHP DAL(数据抽象层)[关闭]
【发布时间】:2011-12-10 02:34:08
【问题描述】:

到目前为止,在我们可以善意重复使用的任何开源项目下开发的最好的 PHP DAL(数据抽象层)是什么?

我发现很难为我的应用程序选择一个充分支持对大多数常见数据库系统(MySQL、PostgreSQL、MSSQL、Oracle 等)的抽象的 DAL,并且是:

  1. 经过广泛测试,
  2. 具有良好的界面(可读的方法名称,良好的参数传递策略),
  3. 快,
  4. 轻量级,
  5. 提供缓存(例如与 Memcache 集成或支持良好的缓存机制),
  6. 开源许可证,
  7. 至少应该有适用于 MySQL/MySQLi(非 PDO)的适配器

需要考虑的一些库:

请不要考虑:

  • PDO
  • 所有 ORM(不过,Doctrine 似乎除了 ORM 之外还有一个单独的 DAL)

【问题讨论】:

  • @DrColossos,请查看我的编辑。我认为 ORM 在我的情况下对于 php 来说是太多的 OOP。我只需要出于上面列出的原因/功能的良好抽象,谢谢
  • 您能否解释一下为什么您认为面向对象的 DAL 不能成为解决方案?难道你不认为你的 DAL 列表没有维护并且缺少很多东西只是因为他们不使用 OOP 吗?我不知道今天有哪个认真的程序员会构建一个好的 DAL 并拒绝 OOP。检查 Zend_Db_Table(不仅是 Zend_Db)。
  • @regilero 我并没有说我不喜欢基于 OOP 的 DAL。当我说没有 ORM 时,你没有得到我的问题。当我们希望业务对象与数据库表耦合时,严格使用 ORM ..例如 Active Record 就是一个例子。我对业务对象+数据库耦合不感兴趣。我只想要一个没有 ORM(对象关系映射)部分的好 DAL。如果您有其他库建议您欢迎
  • 我只是好奇,为什么要排除 PDO ?这是一个非常好的系统,如果遵循路线图计划,它应该成为PHP官方默认的数据库机制(mysql_将被驱逐到PECL,mysqli_也将被驱逐)
  • 我也不理解 PDO 的仇恨。你能提供理由吗?

标签: php database database-abstraction


【解决方案1】:

如果您可以使用 PHP 5.3,我强烈推荐 Doctrine DAL,它构建在 PDO 之上,因此您可以获得相同的性能以及出色的 API。

更新:如果Doctrine不好,可以试试MDB2。它拥有适用于大多数流行 RDBMS 的驱动程序、强大的 API、出色的文档和庞大的用户群:

  • MySQL
  • MySQLi(仅限 PHP5)
  • PostgreSQL
  • 甲骨文
  • 前基地
  • Interbase/Firebird(仅限 PHP5)
  • MSSQL
  • SQLite

【讨论】:

  • 请正确阅读问题我明确提到不推荐 PDO,Docttrine 严格遵守 PDO_*,我无法为 Doctrine 找到 mysql/mysqli 的适配器。如果您可以指向 mysql/mysqli 适配器,我喜欢使用 Doctrine,谢谢
  • 实际上,Doctrine 抽象了 PDO API,因此您可以使用实现这些接口的自定义驱动程序。 (连接和声明)。
  • 来自 Doctrine DBAL 文档:The fact that the Doctrine DBAL abstracts the concrete PDO API away through the use of interfaces that closely resemble the existing PDO API makes it possible to implement custom drivers that may use existing native or self-made APIs. For example, the DBAL ships with a driver for Oracle databases that uses the oci8 extension under the hood.
  • @sakhunzai,你为什么不想要基于 PDO 的东西?你真的应该在这里和你的问题中概述这样一个原因。
  • 没有人试图说服你,你可以做任何你想做的事,我们只是想帮助你意识到你的决定可能会被误导。关于您的示例,无需查询INFORMATION_SCHEMA,您可以使用DESCRIBE table_name 获取该信息。
【解决方案2】:

在过去的 1 年里,我一直在将 Zend_Db 用于我的 Web 应用程序。我认为 Zend 框架是迄今为止最好的。

Zend 是由 PHP 的核心贡献者创建的。(1)

经过广泛测试

是的。它被数千个项目使用,并拥有活跃的开发者社区。​​p>

具有良好的界面(可读的方法名称,好 参数传递策略)

是的。所有组件都可以根据您的需要轻松定制。 Zend 中的每个组件都是松耦合的,这意味着您可以使用任何组件而不依赖于框架中的任何其他组件。

速度

是的。 Zend_Db 默认使用 PDO。

轻量级

是的

提供缓存(例如与 memcache 集成或支持良好的缓存机制)

Zend 有一个extensive caching system

开源许可证

是的

要访问数据库表,您只需通过将表名及其主键设置为其字段来为其创建一个类。

class User extends Zend_Db_Table {

    protected $_name = "users";  //tablename
    protected $_primary = "user_key"; //primary key column

    function addNewUser($name,$age,$email) {
          //Validate input and add Logic to add a new user
          //Methods are available to insert data like $this->insert($data)
          // where $data is an array of column names and values
          // Check links below for documentation
    }
}

这称为模型。在这个类中,您可以创建与“用户”实体相关的所有方法,例如添加新用户、编辑用户等。

在您的应用程序代码中,您可以将其用作,

$u = new User();
$u->addNewUser('Name','Age','email');

必读 - http://framework.zend.com/manual/en/zend.db.table.html

更多参考here。 查看此relation question 了解更多信息

【讨论】:

  • 感谢详细信息。如何在我的项目中使用 Zend_DB (DAL)(当然不使用整个 zend 框架组件)。你能给我一个链接/例子吗
  • @sakhunzai 在答案中添加了更多详细信息和链接..
【解决方案3】:

我对@9​​87654321@ 有很好的经验。 Doctrine 类似,听说不错但没有经验。

【讨论】:

    【解决方案4】:

    我在教义 DBAL 方面遇到了一些问题,主要是在模式/数据库/表创建方面,它有问题,并且一些文档与实际的接口和类方法不同(我确实阅读了 正确 版本的文档),我不得不对其中一些事情使用原始 sql 语句。
    其他一切似乎都很好,这是一个小项目,所以我没有使用 DBAL 提供的所有功能。

    注意: 大约一年前,我使用最新的稳定版本的学说 DBAL 和 php 做到了,也许现在所有这些问题都已解决。

    【讨论】:

      【解决方案5】:

      Doctrine 2.0 是市场上最好的版本,因为它受到 Zend 框架、Symfony 等顶级框架的支持。

      它还支持像mangodb等nosql db...

      它具有内置缓存系统,可以提升应用程序。

      它还具有分页、查询构建器等扩展支持

      以下是推进和学说的一些基准结果

                                     | Insert | findPk | complex| hydrate|  with  |
                                     |--------|--------|--------|--------|--------|
                        PDOTestSuite |    132 |    149 |    112 |    107 |    109 |
                   Propel14TestSuite |    953 |    436 |    133 |    270 |    280 |
              Propel15aLa14TestSuite |    926 |    428 |    143 |    264 |    282 |
                   Propel15TestSuite |    923 |    558 |    171 |    356 |    385 |
          Propel15WithCacheTestSuite |    932 |    463 |    189 |    342 |    327 |
                 Doctrine12TestSuite |   1673 |   2661 |    449 |   1710 |   1832 |
        Doctrine12WithCacheTestSuite |   1903 |   1179 |    550 |    957 |    722 |
                  Doctrine2TestSuite |    165 |    426 |    412 |   1048 |   1042 |
         Doctrine2WithCacheTestSuite |    176 |    423 |    148 |    606 |    383 |
      

      这些是 Doctrine 2 结果的关键观察结果。

      查看最后两条记录,在学说 2.0 中性能如何提高...

      【讨论】:

      • 感谢您的结果似乎很有希望,但您错过了我的观点。是否有任何适配器非 pdo 可用于 mysqli for Doctrine ?
      • @Prashanth Pratapagiri:如果您已经完成了测量数字的工作,那么最好写出这些数字是什么……是时候插入了? X插入的时间? X 每次插入次数 Y ?你知道,如果没有测量单位,数字就没有任何意义......
      【解决方案6】:

      如果您只需要使用 MySQL,DALMP Database Abstraction Layer for MySQL using PHP. 可以是一个选项

      与 cache/memcache/redis 一起使用,并且会话处理非常简单和轻便。

      【讨论】:

      • 似乎是一个不错的轻量级选项,感谢您的链接
      【解决方案7】:

      Zend_Db 呢?唯一需要 Zend_Cache 和轻量级缓存的东西是模糊的。我猜所有其他要求都符合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-16
        • 2015-01-09
        • 2016-04-29
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多