2

我正在处理一些使用 MVC 框架的 PHP 项目,虽然它们都有不同的方式从数据库中检索对象,但就速度和减少数量而言,似乎没有什么比手动编写 SQL 查询更好的了。查询。

例如,我的一个 Web 项目(由初级开发人员编写)执行 100 多个查询只是为了加载主页。原因是在一个地方,一个方法会加载一个对象,但稍后在代码的更深处,它会加载与第一个对象相关的一些其他对象。

这导致了问题的另一部分,即人们在您有一个表的情况下在做什么,该表在代码的一部分中只需要几列的值,而另一部分需要其他东西?现在(在同一个项目中),每个对象都有一个 get() 方法,它执行“SELECT *”(或显式列出表中的所有列),因此无论何时您出于任何原因需要该对象,你得到了整个事情。

所以,换句话说,你听到了所有关于 SELECT * 不好的讨论,但是如果你尝试使用框架附带的 ORM 类,它通常会这样做。您是否坚持选择使用 SELECT * 的 ORM 与手动编写特定的 SQL 查询?在我看来,我们陷入了便利和效率之间,如果我手写查询,如果我添加一列,我很可能不得不将它添加到代码中的几个位置。

很抱歉这个问题很长,但我正在解释背景以从其他开发人员那里获得一些心态,而不是具体的解决方案。我知道我们总是可以使用像 Memcached 这样的东西,但我宁愿在开始之前优化我们可以做的事情。

感谢您的任何想法。

4

4 回答 4

2

首先,假设您精通 SQL 和模式设计,很少有任何将您从 SQL 语句中移除的抽象层会超过手工编写 SQL 的效率的情况。通常情况下,您最终会得到次优的数据访问。

100 个查询没有任何借口只是为了生成一个网页。

其次,如果您使用 PHP 的面向对象特性,您将对对象集合以及映射到 SQL 连接的各种扩展属性有很好的抽象。但要记住的重要一点是尽可能编写最好的抽象对象,而不考虑 SQL 策略。

当我以这种方式编写 PHP 代码时,我总是发现如果我的模式和类都正确,我能够将每个网页的数据需求映射到非常少的非常高效的 SQL 查询。不仅如此,我的经验是,这是最简单、最快的实现方式。将框架的东西放在 PHP 类和一个好的实体瘦 DAL 之间(注意:不是嵌入式 SQL 或 dbms 调用)是我能想到的最好的例子来说明“泄漏抽象”的概念。

于 2009-04-09T20:01:51.513 回答
0

我对你的问题有点迷茫,但如果你正在寻找一种方法来进行数据库访问,你可以用几种方法来做。您的 MVC 可以使用带有数据库访问抽象的 Zend 框架,您可以使用它。

还要记住,您应该很好地设计您的系统,以确保数据库中没有争用,因为您的查询都分散在 php 页面中,并且可能会锁定表,从而导致整个 Web 应用程序的性能下降并随着时间的推移变得更慢。

这就是为什么有时最好使用存储过程,因为它在一个地方,并且可以在需要时进行调整,尽管其他人可能会争辩说,如果查询语句在前端,则更容易调试。

于 2009-04-09T20:03:15.507 回答
0

没有 ORM 框架在速度方面甚至可以接近手写 SQL,尽管 100 个查询看起来不切实际(也许你有点夸大其词),即使你让 ORM 框架的创建者编写代码,它也永远不会良好的旧 SQL 的速度。

我的建议是,不仅要看速度,还要看全貌:

  • 该框架是否提高了代码的可读性?

  • 您的团队是否愿意编写 SQL 并将其与代码混合?

  • 你真的了解如何优化框架查询吗?(我认为每个对象的 get() 不是检索它们的最佳方式)

  • 框架的查询(优化后)是否存在瓶颈?

我从来没有用 PHP 开发过任何东西,但我认为你可以混合使用这两种方法(ORM 和普通 SQL),也许在对应用程序进行彻底分析之后,你可以确定真正的瓶颈,然后才能将 ORM 代码替换为手写 SQL (通常在 ruby​​ 中你使用 ActiveRecord,然后你用新的 relic 来分析应用程序,最后如果你有一个复杂的 AR 查询,你用一些 SQL 替换它)

Regads

于 2009-04-09T20:22:52.680 回答
0

相信你的经验。

为了不在代码中重复太多,您可以使用自己的 SQL 编写一些简单的模型函数。这就是我一直在做的事情,我对此很满意。

许多“方便”的东西是为需要魔法的人写的,因为他们不能用手或者只是没有经验。

毕竟这是一个风格问题。

不要犹豫,添加您自己的层或用您自己的东西交换或扩展给定的层。保持干净,做好设计和一些文档,这样你以后回来时就有宾至如归的感觉。

于 2009-04-09T20:44:09.713 回答