В настоящее время мой проект на работе имеет очень неэффективный цикл, который в значительной степени страдает от проблемы n + 1
.(6n + 1
, я думаю.) В настоящее время ряд веб-сервисов создает экземпляр объекта, конструктор которого создает каноническое представление одного из наших объектов ORM, - вызывая их Foo
и FooView()
.Есть ряд мест, где собрана коллекция Foo
;каждый экземпляр Foo
передается в FooView
, и его (псевдо) поля внешнего ключа запрашиваются в другой базе данных для построения текстового представления, так что, например, мы можем вернуть <fooColor>Blue</fooColor>
а не <fooColor>5</fooColor>
.Наборы этих свойств - «Цвета», «Формы» и другие аналогичные общие свойства - относительно невелики и, очевидно, должны быть извлечены в память.
Существует также другой, более сложный запрос, который способствует6n + 1
проблема.Это набор полей метаданных.Каждый Foo
имеет Source
.Каждый Source
может иметь одно, ни одно или несколько полей метаданных, определенных для их подмножества Foos
.Пустые теги XML требуются для полей метаданных, которые применяются к данному Foo
Source
.В настоящее время четыре (!) Запроса ORM (!), Использованные для построения этого XML, находятся внутри конструктора FooView
, что означает, что они выполняются для каждого Foo
.
Моя цель заключается в следующем:
- Запрос общих свойств, таких как
Color
, Shapes
и т. Д., Прежде всего. - Запустите запрос, чтобы сгенерировать коллекцию
Foo
.Сохраните первичные ключи в списке. - Используя список первичных ключей, запустите ужасный многопользовательский необработанный SQL-запрос для генерации
Foo.Metadata
. - Вызова
FooView
, предоставивнабор Foo
вместе с объектом контекста, содержащим элементы, встроенные в шаги 1 и 3. FooView
обеспечит логику чередования, используя объект контекста, а не поиск в базе данных.
Является ли этоздоровая практика?Это определенно решит некоторые проблемы с производительностью при генерации FooView
, но где эта вещь должна жить?Должен ли я назвать это FooHelper
?FooContext
?FooService
?Это шаблон проектирования или я должен его использовать, чтобы сделать его более логичным?
Спасибо!