为啥在 PHP 中使用 ORM?

Posted

技术标签:

【中文标题】为啥在 PHP 中使用 ORM?【英文标题】:Why use an ORM in PHP?为什么在 PHP 中使用 ORM? 【发布时间】:2011-04-08 08:04:37 【问题描述】:

我最近开始学习ORM,突然想到一个问题:

php 应用程序主要使用 mysql 和 Sqlite,几乎所有 PHP 服务器都安装了它,那么 PHP 中的 ORM 是否值得在数据库中使用?

性能怎么样?

【问题讨论】:

【参考方案1】:

数据库独立性不是使用 ORM 的主要原因。您想要的是数据库的一般抽象。这可能意味着:使用简单、开发速度更快、数据库独立……在任何情况下,通常都值得使用 ORM。如果您的应用程序耗尽了您所有的 cpu 能力,那么您可能会使用一些普通的 sql 来优化某些查询。不过,我想这是一种罕见的情况。

您可能想阅读以下内容: What are the advantages of using an ORM?

【讨论】:

我个人认为不值得花时间学习它。是的,很少有可能使用它的例子,但是编程的第一条规则是需求会改变,你最终会用 SQL 优化一切,你会后悔的,所以为什么要首先打扰。无论如何,您可以(而且应该!)使用架构模式抽象数据库层。 为了实现数据库独立,还可以使用PDO、JDBC、ADO、ODBC...等数据库API,速度更快,内置【参考方案2】:

您可能选择使用 ORM 的原因有几个,我能想到的几个:

大多数 ORM 都可以让您验证 INSERT 和 UPDATE 的数据。 ORM 将允许您将数据库中的列名映射到数据库中的工作字段名称。如果您使用的是其他人设计且列名奇怪的数据库,这会很方便。 他们也会很好地为您处理人际关系。 (例如,如果您在其中一个列上获取具有 1:m 关系的行,您将获得相关项目的子数组,而无需手动执行另一个查询)。

使用 ORM 的大多数原因与开发速度/易用性有关。

在性能方面,我之前在 php 中使用过学说,与仅获取行相比,水合会产生巨大的开销。

【讨论】:

【参考方案3】:

对于数据库独立性(和性能),请使用PDO。它是内置的,它的预处理语句非常适合防止 SQL 注入漏洞。

如果您被 O/RM 困住,它甚至带有一点 OO 风格...请参阅 PDOStatement::fetch(以及其他一些 fetchXxx 方法)。

【讨论】:

【参考方案4】:

使用 ORM 减少了编写与打开数据库连接、连接池、准备语句、执行语句、将执行语句的结果映射到更有意义的结果以及最后关闭连接相关的样板代码的冗余。

像实例化一个对象,设置它的属性,然后在对象上调用一个保存操作这样的事情要干净得多。与手动编码与数据库交互所需的许多步骤相比,仅这种值就值得使用 ORM。

此外,使用干净的 ORM 可以在对应用程序进行最小更改的情况下交换数据库。

希望对您有所帮助。

【讨论】:

【参考方案5】:

ORM 有点浪费时间。这很奇怪,因为它旨在节省您的时间:) 但这是真的。我有机会在几种语言中使用 ORM,这不值得。基本上有两种类型的项目:

    具有少量表(有时甚至 1 个表)、没有身份验证等的简单项目,可以说只是简单的独立表

    具有许多连接表、视图和其他内容的复杂项目。可能还有更多的数据库。

      是的,如果您熟悉设置以及如何使用它,您可以随意使用 ORM,但您永远不知道项目需求是否会发生变化,并且您最终会后悔自己曾经踏入 ORM 领域 :) 不要使用 ORM,因为您将花费更多时间来修复 ORM 提供的“自动生成”的东西。我相信现在有些 ORM 相当先进,但 ORM 就像(疯狂猜测)10 年(实际上我相信它更多)?很明显它有点死胡同。它不会在未来取代标准方式,今天的趋势是 NOSQL 数据库等。

在我看来,ORM 之所以存在,是因为框架在内部使用它。和性能?我不确定(因为我不再使用它)但我相信性能也可能是一个问题。您必须为从数据库查询中抽象出来的事实付出至少一些代价,对吧?我认为 ORM 在纸面上是个好主意,但效果不佳。

【讨论】:

【参考方案6】:

如果您的服务器运行 PostgreSql 或 SQL Server - 另外两个非常常见的数据库引擎会怎样。

如果您想连接到旧数据库怎么办?

另外,您是否维护过任何直接连接到数据库的大型项目?当我打开一个满是mysql_query 电话的文件时,我会颤抖。

性能方面...取决于所讨论的 ORM。我在 .NET 环境中更熟悉它们,当然在那种环境中,性能存在很大差异,但这通常是与功能的权衡。

使用 ORM 将增加您的代码和数据库之间的正交性 - 这将使其更易于开发和维护。在数据库之间切换的能力是这样做的好处,但肯定不是唯一的原因。

【讨论】:

以上是关于为啥在 PHP 中使用 ORM?的主要内容,如果未能解决你的问题,请参考以下文章

为啥CQRS Query端不使用ORM

为啥 eloquent orm 上的查询语句结果返回空值

ORM:我为啥要使用它? [复制]

如何在 PHP 中使用 ORM

如果我使用类似 NHibernate 的 ORM,为啥需要 LINQ?

在 ORM 设计器中,为啥服务器对象不能通过新的更改正确刷新?