这里提供了pht中ORM中select n+1问题的简单例子,但是思路在其他语言的其他ORM中应该是一样的。
一个典型的解决方案是使用 eager loading 将其减少到 1 个查询,我认为这不是很难,但是,OTOH,它非常脆弱,因为后面的重构需要开发人员更改两个地方,否则这个 select n + 1个问题再次出现。
我的直觉是应该可以进行一些路径分析来确定这些子属性将在代码的后面部分使用,所以让我们生成查询以一次性收集所有必要的信息。
对于使用解释语言(如 ruby、php 等)实现的 ORM,这可能要求太多了。但是,无论是 Java(NHibernate)还是 C#(实体框架)都没有进行这种路径分析,AFAIK。为什么是这样?