【问题标题】:Why are there so many PHP sites that only provide for MySQL as a database?为什么有这么多 PHP 站点只提供 MySQL 作为数据库?
【发布时间】:2023-03-27 08:43:01
【问题描述】:

我曾涉足过 MySQL,而且我个人认为它远不如 Postgres 等更好的 RDBMS;虽然我承认它已经走了很长一段路并得到了改进,但据我所知,即使是最新版本甚至不支持 CHECK 约束来验证数据完整性(它允许使用关键字,但对它没有任何作用)。

作为一个正在考虑从 Microsoft 技术转向开源的人,我对 PHP 支持的应用程序的数量感到震惊,这些应用程序仅使用 MySQL 作为底层数据库。其中许多应用程序非常好,可以节省大量开发工作,但事实上它们并没有被抽象为与数据库无关,这对我和我的技术同事来说通常是一个交易杀手。

所以我很好奇 - 我明白为什么 MySQL 如此受欢迎以及为什么它几乎总是与 PHP 一起使用,但是为什么这么多 PHP 支持的网站拒绝正确开发以允许其他数据库,而是在那里强制使用 MySQL那里有更好和更多“类似数据库”的选项吗?我对这些我想使用的应用程序越来越感到沮丧,但它们只适用于 MySQL,我不会让自己使用它,因为我个人认为 Postgres 是一个更好的数据库,而且我个人认为你的数据库应该强制执行它自己的约束,而不是仅在代码级别执行此操作。

我知道 MySQL 很受欢迎,而且它不是一个糟糕的系统,但我讨厌当我找到一个很棒的应用程序时,它只会在数据库是 MySQL 时工作,因为开发人员使用的是 MySQL 特定的模块和/或语法。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    我相信这也是有这么多只支持 MSSQL 的 ASP.NET 东西的原因。它是按照惯例与语言配对的传统数据库。另外,使用/构建独立于数据库的解决方案很困难,而且当大多数其他人都遵循该约定时,这是“你不需要”的事情之一。当它需要它时,它可能会出现“页面错误”。

    如果你需要一个 php 应用程序来使用另一个数据库,php 可能是开源的,也许你可以自己做。

    【讨论】:

    • 还有其他数据库的提供程序,例如,我使用了用于 MS SQL Server 的提供程序。 us.php.net/mssql
    • "如果你需要一个 php 应用程序来使用另一个数据库......也许你可以自己完成这项工作。"除非您使用自己构建的数据库,否则您永远不需要这样做。 PHP.net 列出了 20 家现有 php 扩展的供应商:us.php.net/manual/en/refs.database.vendors.php。
    • 我同意,但该数据库的 SQL 语法会有所不同。
    【解决方案2】:

    Cross-platform support,只要对SQL而言,就像一只鸭子。

    你知道,鸭子会走路、会飞、会游泳——而且做这一切都一样糟糕。

    最好还是坚持一个平台,开发一个优化好的应用,然后努力让大家都满意,实际上让没人满意。

    【讨论】:

    • 同意。也许这就是为什么有这么多蹩脚的、被黑客入侵的 PHP 应用程序存在的部分原因。由于 OP 所述的原因,IMO MySQL 是一个玩具数据库。
    【解决方案3】:

    大多数 PHP 开发人员使用 PHP 进行开发,因为它免费、易于上手且功能强大。所有相同的品质都与 MySQL 共享,所以它很自然。

    话虽如此,许多专业开发人员创建了数据抽象层,使他们能够轻松地与其他后端集成。但大多数项目不需要这些类型的东西。

    【讨论】:

    • PostgreSQL 早在 MySQL 真正免费之前就已经免费了。
    【解决方案4】:

    这主要是因为几乎所有支持 PHP 的共享托管服务都提供 MySQL 并且只有 MySQL。当几乎没有人使用应用程序需要时,通常认为没有必要抽象数据库的额外工作。

    【讨论】:

      【解决方案5】:

      LAMP 是一种极为常见的开发堆栈。很常见,即使不使用 PHP 的人也知道 LAMP 代表什么。

      对于那些不知道的人(你们所有人),LAMP 最常代表 Linux、Apache、M ySQL 和 PHP。

      【讨论】:

        【解决方案6】:

        我认为关键点正是您所说的,“它几乎总是与 PHP 一起使用”。通过为 MySQL 开发,他们最大限度地扩大了目标受众。是的,如果他们将其开发为能够与多个数据库一起工作,那将是理想的,但这可能是相当多的额外工作。许多这些项目只是从某人的个人项目中发展而来的,该项目最初可能不是为了与多个引擎兼容而设计的。一旦他们走得很远,重写代码以支持多个数据库系统就开始变成一项主要工作,而且通常还有他们的用户希望拥有的其他功能/修复。

        我也非常喜欢 pgsql,但我认为如果您打算使用其他人的 PHP 应用程序(论坛、博客等),那么您可能不得不运行 MySQL 来支持它们,这只是现实.

        【讨论】:

          【解决方案7】:

          在过去,易用性存在巨大差异。 MySQL 易于使用,并且对于简单的任务非常快速。那时它没有提供完整的 ACID、触发器、子选择和过程。另一方面,你有 PostgreSQL(当时称为 Postgres),它速度慢得多,安装和维护起来很复杂,但提供了真正的 RDBMS 的全部功能。问题是,Web 应用程序并不真正需要 RDBMS 的全部功能,因此 MySQL 获得了极大的普及,而 PostgreSQL 则很少有人使用。

          啊,还有一件事:从 PHP5 开始嵌入 SQLite。所以我预计很快会有很多不需要完整 RDBMS 的新 PHP 应用程序将使用 SQLite,而不是 MySQL。

          【讨论】:

            【解决方案8】:

            你说得对,PostgreSQL 对 SQL 和其他高级特性的支持要好得多,所以有一个很好的例子来说明为什么 PostgreSQL 优于 MySQL。

            然而,对于刚入门的人来说,MySQL 更容易安装和管理,因此相对于 PostgreSQL,它获得了很多采用。与 MySQL 相比,在 PostgreSQL 服务器上配置登录和赋予特定权限等简单任务非常令人困惑。

            此外,早在几年前,MySQL 就为 Windows 提供了本机二进制文件,但 PostgreSQL 没有。你可以让它在 Cygwin 下工作,但这对于真正的 Windows 开发人员来说很难令人满意。到 PostgreSQL 确实原生支持 Windows 时,MySQL 在市场份额和知名度方面已经遥遥领先。

            顺便说一句:http://www.postgresql.org/support/professional_hosting_northamerica

            【讨论】:

              【解决方案9】:

              IMO 有这么多只支持 MySQL 的网站,最大的问题是 MySQL 不支持“真实”数据库的一半功能,所以如果您需要数据完整性,那您就大错特错了,必须自己编写软件而不是利用现有解决方案,或者破坏您的应用程序并且在数据库级别没有任何真正的完整性检查。你最终会陷入困境和艰难的境地。

              【讨论】:

              • 2000 呼叫,它想要回复。虽然 MySQL 在某些功能上还欠缺,但你描述的情况更让人想起上述年份而不是今天。
              • 并非如此。虽然 MySQL 操作系统现在比以前好得多,但 MySQL 仍然缺少任何数据库系统中的基本功能,如 CHECK 约束。我坚持我的主张,并恭敬地不同意你的主张。
              • @Wayne M 提出了一个很好的观点。 MySQL 的默认存储引擎 MyISAM 不支持 RI 约束或 ACID。 InnoDB 有,但该技术不属于 MySQL。 MySQL 没有存储引擎支持 CHECK 约束。他们已经走了很长一段路,但仍有一些巨大的差距。
              【解决方案10】:

              我们想要我们的蛋糕,并带着这个问题吃掉它。首先,我们需要数据库抽象。然后,我们希望在我们选择在该抽象背后使用的 RDBMS 中进行 CHECK 约束。

              嗯?这意味着我们将忽略在 PHP 本身中进行数据检查,并且使用没有 CHECK 的数据库会出现问题。要么这样,要么我们将在 PHP 中实现检查以支持没有检查的抽象数据库,做两倍的工作。

              我认为完全数据库抽象不值得付出努力,主要是寻找问题的解决方案。

              【讨论】:

              • IMO 在数据完整性方面做“两倍的工作”是值得的。将完整性保持在一个级别或另一个级别是一种错误的安全感。
              猜你喜欢
              • 2016-05-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-07-10
              • 1970-01-01
              • 1970-01-01
              • 2019-11-14
              • 1970-01-01
              相关资源
              最近更新 更多