目前,我的工作项目循环效率非常低,在很大程度上遇到了n + 1
问题。 (6n + 1
,我认为。)目前,许多Web服务实例化一个对象,其构造函数构建了一个ORM对象的规范表示 - 称之为Foo
和FooView()
。有许多地方建立了Foo
的集合; Foo
的每个实例都传递给FooView
,并在另一个数据库中查询其(伪)外键字段以构建文本表示形式,例如,我们可以返回<fooColor>Blue</fooColor>
而不是<fooColor>5</fooColor>
。这些属性的集合 - 颜色,形状和其他类似的一般属性 - 相对较小,显然应该被拉入内存。
还有另一个更复杂的查询,它会导致6n + 1
问题。这是一组元数据字段。每个Foo
都有一个Source
。每个Source
可以为其Foos
子集定义一个,无或多个元数据字段。应用于给定Foo
的{{1}}的元数据字段需要空XML标记。目前,用于构建此XML的四个(!)ORM查询(!)位于Source
构造函数中,这意味着它们将针对每个FooView
执行。
我的目标如下:
Foo
,Color
等。Shapes
的集合。将主键存储在列表中。Foo
。Foo.Metadata
,提供FooView
的集合以及包含步骤1和3中构建的项的上下文对象。Foo
将使用上下文对象提供交错逻辑而不是数据库查找。这是一种合理的做法吗?它肯定会解决生成FooView
时的一些性能问题,但这个东西应该存在于哪里?我应该叫它FooView
吗? FooHelper
? FooContext
?这是一种设计模式,还是我应该用它来使这更合乎逻辑?
谢谢!