在 MVC 模型中啥是有效的数据访问的良好平衡?
Posted
技术标签:
【中文标题】在 MVC 模型中啥是有效的数据访问的良好平衡?【英文标题】:What is a good balance in an MVC model to have efficient data access?在 MVC 模型中什么是有效的数据访问的良好平衡? 【发布时间】:2009-04-09 19:49:50 【问题描述】:我正在开发一些使用 MVC 框架的 php 项目,虽然它们都有不同的方式从数据库中检索对象,但就速度和减少开销而言,似乎没有什么比手动编写 SQL 查询更好的了查询的数量。
例如,我的一个 Web 项目(由一名初级开发人员编写)执行 100 多个查询只是为了加载主页。原因是在一个地方,一个方法会加载一个对象,但在后面的代码中,它会加载一些与第一个对象相关的其他对象。
这导致了问题的另一部分,即在您有一个表的情况下,人们在做什么,其中一部分代码只需要几列的值,而另一部分需要其他东西?现在(在同一个项目中),每个对象都有一个 get() 方法,它执行“SELECT *”(或显式列出表中的所有列),因此无论何时您出于任何原因需要该对象,你得到了全部。
因此,换句话说,您听到所有关于 SELECT * 不好的讨论,但是如果您尝试使用框架附带的 ORM 类,它通常会这样做。您是否坚持选择使用 SELECT * 的 ORM 与手动编写特定的 SQL 查询?在我看来,我们在方便和效率之间陷入了困境,如果我手写查询,如果我添加一列,我很可能不得不将它添加到代码中的多个位置。
抱歉,这个问题太长了,但我在解释背景是为了从其他开发人员那里获得一些心态,而不是具体的解决方案。我知道我们总是可以使用像 Memcached 这样的东西,但我宁愿在开始之前优化我们所能做的。
感谢您的任何想法。
【问题讨论】:
感谢您的回答!它几乎证实了我已经在想的……ORM 的设计不是为了速度,而是为了易于使用……就像简化“编程”语言并因此希望有更好的程序员。 :) 【参考方案1】:首先,假设您精通 SQL 和架构设计,在极少数情况下,任何将您从 SQL 语句中移除的抽象层都会超过手工编写 SQL 的效率。通常情况下,您最终会得到次优的数据访问。
100 次查询没有理由仅仅为了生成一个网页。
其次,如果您使用 PHP 的面向对象特性,您将对对象集合以及映射到 SQL 连接的各种扩展属性有很好的抽象。但要记住的重要一点是尽可能编写最好的抽象对象,而不考虑 SQL 策略。
当我以这种方式编写 PHP 代码时,我总是发现我能够将每个网页的数据需求映射到非常少的、非常有效的 SQL 查询,如果我的架构是正确的并且我的类是正确的。不仅如此,我的经验是,这是最简单、最快的实现方式。将框架的东西放在 PHP 类和一个好的实体瘦 DAL 之间(注意:不是嵌入式 SQL 或 dbms 调用)是我能想到的最好的例子来说明“泄漏抽象”的概念。
【讨论】:
【参考方案2】:我对你的问题有点迷茫,但如果你正在寻找一种方法来进行数据库访问,你可以通过几种方式来做到这一点。您的 MVC 可以使用带有数据库访问抽象的 Zend 框架,您可以使用它。
另外请记住,您应该很好地设计您的系统,以确保数据库中没有争用,因为您的查询都分散在 php 页面中,并且可能会锁定表,从而导致整个 Web 应用程序的性能下降并变慢时间。
这就是为什么有时最好使用存储过程,因为它在一个地方并且可以在我们需要时进行调整,尽管其他人可能会争辩说如果查询语句位于前端则更容易调试。
【讨论】:
【参考方案3】:没有 ORM 框架在速度方面甚至可以接近手写 SQL,尽管 100 个查询似乎不切实际(也许你有点夸张),即使你有 ORM 框架的创建者写代码,总比老 SQL 的速度差很多。
我的建议是,不要只看速度:
该框架是否提高了代码的可读性?
您的团队是否愿意编写 SQL 并将其与代码混合?
您真的了解如何优化框架查询吗? (我认为每个对象的 get() 并不是检索它们的最佳方式)
框架的查询(优化后)是否存在瓶颈?
我从未使用 PHP 开发过任何东西,但我认为您可以混合使用这两种方法(ORM 和普通 SQL),也许在对应用程序进行彻底分析之后,您可以确定真正的瓶颈和只有这样 替换手写 SQL 的 ORM 代码(通常在 ruby 中你使用 ActiveRecord,然后你用新的遗物来分析应用程序,最后如果你有一个复杂的 AR 查询,你用一些 SQL 替换它)
问候
【讨论】:
【参考方案4】:相信您的经验。
为了不在代码中重复太多,您可以使用自己的 SQL 编写一些简单的模型函数。这就是我一直在做的事情,我对此很满意。
许多“方便”的东西是为需要魔法的人写的,因为他们不能用手或只是没有经验。
毕竟这是一个风格问题。
毫不犹豫地添加您自己的层或用您自己的东西交换或扩展给定的层。保持干净,做好设计和一些文档,以便您以后回来时有宾至如归的感觉。
【讨论】:
以上是关于在 MVC 模型中啥是有效的数据访问的良好平衡?的主要内容,如果未能解决你的问题,请参考以下文章