2

我正在研究一些使用MVC框架的PHP项目,尽管它们都有不同的从数据库中检索对象的方式,但似乎没有什么比用手写SQL查询更快,并且减少查询数量。什么是MVC模型中有效的数据访问的良好平衡?

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

这导致了问题的其他部分,人们在表格的某个部分只需要几列数值而另一部分需要其他部分的情况下正在做什么?现在(在同一个项目中),每个对象都有一个get()方法,它会执行一个“SELECT *”(或者明确列出表中的所有列),以便在任何时候因为任何原因需要该对象时,你得到了整个事情。

因此,换句话说,你听到所有人都在谈论如何SELECT *是坏的,但如果您尝试使用自带的框架ORM类,它要做到这一点,通常。你坚持选择ORM与SELECT *手动编写特定的SQL查询?在我看来,我们坚持在便利和效率之间,如果我手写查询,如果添加一列,我很可能不得不将它添加到代码中的多个位置。

很抱歉的长期问题,但我解释的背景,得到其他开发商的一些思维方式,而不是可能是具体的解决方案。我知道我们总是可以使用像Memcached这样的东西,但我宁愿在进入之前优化我们所能做的。

感谢您的任何想法。

+0

感谢您的回答!它几乎证实了我的想法...... ORM并不是为速度而设计的,而是为了便于使用......就像贬低“编程”的lanuners并希望更好的程序员一样。 :) – Poldon 2009-04-30 20:57:23

回答

2

首先,假设你是在SQL和架构设计精通,也有极少数情况下,任何抽象层,消除你的SQL语句将超过手工编写SQL的效率。通常情况下,最终会导致数据访问不理想。

对于仅仅生成一个网页的100个查询,没有任何理由。

第二,如果你正在使用PHP的面向对象的功能,你将有对象的集合好抽象,并映射到SQL加入了各种扩展属性。但要记住的重要一点是编写最好的抽象对象,而不考虑SQL策略。

当我写PHP代码这种方式,我总是觉得我能够映射每个网页的数据要求非常少,如果非常有效的SQL查询我的模式是正确的,我的类是适当的。不仅如此,而且我的经验是,这是最简单,最快速的实施方式。将框架内容放在PHP类和一个很好的精简DAL(注意:不嵌入SQL或dbms调用)之间的中间是我可以想到的最好的例子来说明“泄漏抽象”的概念。

0

我对你的问题有点遗憾,但是如果你正在寻找一种数据库访问的方式,你可以通过几种方式来完成。您的MVC可以使用随数据库访问抽象提供的Zend框架,您可以使用它。

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

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

0

没有ORM框架,甚至会接近手写SQL速度方面,虽然100次的查询显得不现实的(也许你有一点夸张),即使你有ORM框架编写代码的创造者,它总是远离优秀的旧SQL的速度。

我的建议是,看一下整个画面不仅速度:

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

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

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

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

我从来没有开发的PHP什么,但我认为你可以在应用程序的深入剖析后可能混合了这两种方法(ORM和普通的SQL),你能确定真正的瓶颈和然后替换手写SQL的ORM代码(通常在ruby中使用ActiveRecord,然后用一些新的文档分析应用程序,最后如果你有一个复杂的AR查询,你替换某些SQL)

Regads

0

相信你的经验。

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

许多“便利”的东西是为那些需要魔法的人编写的,因为他们不能亲手做,或者没有经验。

毕竟这是一个风格问题。

不要犹豫,添加自己的图层或与自己的东西交换或扩展给定的图层。保持清洁,做出好的设计和一些文件,以便稍后再回来时感觉到家。

相关问题