在PHP MVC应用程序中,你在哪里“负载均衡”ORM?

3
问题: 使用ORM构建的对象模型通常需要执行多个查询才能完成单个操作。例如,“获取”操作可能会从多个表中提取信息,特别是在具有嵌套对象结构时。在复杂请求中,这些查询可能会累积,并且您的数据库将在手动编写SQL之前开始阻塞。

问题: 在哪里对ORM进行负载均衡以减少需要进行的查询次数,更重要的是,为什么选择这种方法?您是否有单独的模型来加载依赖于上下文的数据,或者在控制器中指定应加载哪些数据?还是其他方式?

3个回答

2

ORM真的有很好的理由存在——加快开发速度。

如果性能成为问题,我宁愿实现一些缓存机制,而不是退回到硬编码SQL。


1
我不会负载均衡那一部分,我会进行缓存。你在应用程序和数据库层之间获得的最大性能提升将是根本不触及数据库层,这就是缓存的情况。 - Brian Cline
缓存是一种强大的技术,但基本问题仍然存在。您是在模型中进行缓存还是在控制器中进行缓存? - Alana Storm
2
这要看你更喜欢缓存数据还是输出。分别在你的模型或控制器中实现。 - pestaa

1

我建议使用领域模型模式,以一种面向对象的方式提供数据接口。在领域模型类中实现持久性时,适当地使用ORM和SQL的混合。

例如,您将针对单个表执行一些简单的查询。为此,请使用方便的ActiveRecord模式。但正如您所描述的那样,您通常还需要针对多个表执行一些复杂的查询以获取更复杂的相关数据。在这种情况下,ActiveRecord是一个笨拙的解决方案,因此请使用纯SQL。当您需要具有关系运算符(如JOINGROUP BY)的复杂查询时,它是最好的工具。

@pestaa提到了缓存,这是另一个好工具。这里还有一个可以考虑的工具:Identity Map。重点是您应该学习多种工具,并考虑在任何给定情况下哪个工具最好。

试图在每种情况下仅使用一种模式就像在一档挡位上开车一样。


它被称为“身份映射”吗?我怎么能在不知道它的名字的情况下使用它这么长时间呢...?谢谢,比尔。 - pestaa
@pestaa:我强烈推荐Martin Fowler的书《企业应用架构模式》和Eric Evans的书《领域驱动设计》(有一份免费PDF涵盖了DDD概念,可以在谷歌上搜索“快速领域驱动设计”)。 - Bill Karwin

0
很多取决于ORM、其哲学和功能。但是假设您在ORM和应用程序的其余部分之间有一组良好的模型类,您可以执行以下操作:
  1. 在模型中提供适合大多数情况的正确深度的方法。如果您的ORM不允许您高效地指定事物,请考虑使用其他ORM(如果您有这个奢侈)
  2. 规划并实现缓存。由于我们正在谈论一个以数据为中心的上下文,这意味着在您的模型中编写/利用数据缓存。
  3. 拥有将读取与写入分离的计划。要么在您的模型中,要么在ORM配置中。特别是如果读取是瓶颈,使用一些复制创建一组只读从节点可极大地提高效率。但是,如果您没有计划,很容易将自己设计成一个痛苦的局面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接