求解时自动选择n+1
本文关键字:选择 n+1 | 更新日期: 2023-09-27 18:26:05
这提供了一个在pht中的ORM中选择n+1问题的简单示例,但在其他语言的其他ORM中应该是相同的想法。
一个典型的解决方案是使用急切加载将其减少到1个查询,我认为这不是很难,但是,OTOH,它非常脆弱,因为后一次重构需要开发人员更改两个位置,否则会再次出现这种选择n+1的问题。
我的直觉是,应该可以进行一些路径分析,以确定这些子属性将在代码的后面部分使用,所以让我们生成查询,一次性收集所有必要的信息。
对于使用解释语言(如ruby、php等)实现的ORM来说,这可能太过分了。然而,Java(NHibernate)和C#(Entity framework)都没有进行这种路径分析,AFAIK。为什么会这样?
我不明白,如果你使用EntityFramework,你可以使用Include(….)来指定在同一查询中加载哪些可延迟加载的子relationship实体,如果你指定了一个子句来考虑所包含实体上的某个字段,你会得到一个请求(换句话说,只需在linq查询中使用联接)
顺便说一句,你可以在这里找到一个古老而相关的问题,比如:什么是SELECT N+1?
正如我在下面评论的那样,一种方法可以是有一个方法,你可以调用它来添加所有需要的Include,这样当你添加一个新的可导航属性/集合时,你只需要记住在那里添加,这个答案就会向你展示这个概念:https://stackoverflow.com/a/14520939/1716620