你在哪里“负载平衡”一个 PHP MVC 应用程序中的 ORM
Posted
技术标签:
【中文标题】你在哪里“负载平衡”一个 PHP MVC 应用程序中的 ORM【英文标题】:Where do you "Load Balance" an ORM in a PHP MVC Application 【发布时间】:2009-11-04 21:40:40 【问题描述】:问题:使用 ORM 构建的对象模型通常需要执行多个查询才能执行单个操作。例如,“获取”操作可能会从多个表中提取信息,尤其是当您具有嵌套对象结构时。在复杂的请求中,这些查询可能会累加起来,并且您的数据库将在您手动编写 SQL 之前很久就开始阻塞。
问题:你在哪里对 ORM 进行负载平衡,以减少需要进行的查询数量,更重要的是你为什么这样做选择这种方法? 您是否有单独的模型来根据上下文加载数据,或者您是否指定应在控制器中加载哪些数据?还是别的什么?
【问题讨论】:
【参考方案1】:ORM 的存在是有充分理由的——加速您的开发。
如果性能成为我的问题,我宁愿实现一些缓存机制,而不是退后一步,硬编码 SQL。
【讨论】:
对此回复+1。我不对那部分进行负载平衡;我缓存。应用程序层和数据库层之间的最大性能改进将来自根本不接触数据库层,就像缓存一样。 缓存是一种强大的技术,但基本问题仍然存在。您是在模型中缓存,还是在控制器中缓存? 视情况而定。你更喜欢缓存数据还是输出?分别在您的模型或控制器中执行此操作。【参考方案2】:我推荐使用Domain Model 模式,以OO 友好的方式提供数据数据接口。作为在域模型类中实现持久性的一部分,混合使用 ORM 和 SQL 是合适的。
例如,您将对单个表进行一些简单的查询。为此使用方便的 ActiveRecord 模式。但正如您所描述的,您通常还需要对多个表进行一些复杂的查询,以获取更复杂的相关数据。在这种情况下,ActiveRecord 是一个笨拙的解决方案,因此请使用普通 SQL。当您需要使用 JOIN
或 GROUP BY
等关系运算符进行复杂查询时,它是最佳工具。
@pestaa 提到缓存是另一个好工具。这是您可以考虑的另一个:Identity Map。关键是您应该学习多种工具,并考虑在任何特定情况下哪种工具最好。
试图在每种情况下只使用一种模式,就像在任何地方都开着一档的车。
【讨论】:
它叫“身份图”吗?我怎么能在不知道它的名字的情况下使用它很久......?谢谢你,比尔。 @pestaa:我强烈推荐 Martin Fowler 的书“企业应用程序架构的模式”和 Eric Evans 的书“域驱动设计”(有一个免费的 PDF 涵盖了可用的 DDD 概念;google Domain Driven Design Quickly )。【参考方案3】:这在很大程度上取决于 ORM、它的理念和特性。但是假设您的 ORM 和应用程序的其余部分之间有一组很好的模型类,您可以执行以下操作:
-
在您的模型中提供能够为大多数情况提供适当深度的方法。如果您的 ORM 不允许您有效地指定事物,请考虑使用不同的 ORM(如果您有这种奢侈)
规划和实施缓存。由于我们是在以数据为中心的环境中讨论的,这意味着在模型中编写/利用数据缓存。
有一个将读取与写入分开的计划。在您的模型或 ORM 配置中。特别是如果读取是您的瓶颈,使用一些复制来创建一组只读从属可能非常有用。但是,如果您不为此做好计划,您可以轻松地将自己设计成一个痛苦的位置。
【讨论】:
以上是关于你在哪里“负载平衡”一个 PHP MVC 应用程序中的 ORM的主要内容,如果未能解决你的问题,请参考以下文章
使用php读取/写入负载平衡-mongodb vs mysql [关闭]