Я реализовал шаблон Data Mapper с шаблоном Identity Map. Вкратце: когда я хочу получить 2000 объектов из базы данных, картограф проверяет набор результатов по хеш-карте, которая содержит ссылки на уже созданные объекты. Если идентификатор уже находится в хэш-карте, старый объект добавляется в массив возврата. В противном случае новый объект создается и добавляется в возвращаемый массив. Возвращаемый массив будет содержать 2000 объектов.
Примечание: это цифры теоретические! Платформа может часто посещаться, поэтому это может происходить много раз в минуту или даже секунду.
Вопрос: Какой вариант лучше и почему?
A) Получить все 2000 объектов из базы данных. Выполните итерацию по набору записей (2000 строк) и проверьте каждый идентификатор на соответствие карте идентификации. Если он там, добавьте ссылочный объект карты идентификации в массив объектов. Если нет, создайте новый объект и добавьте его в массив результатов.
B) Создайте (возможно ОГРОМНЫЙ) SQL-запрос, который исключает все идентификаторы, которые есть в карте идентичности. Получить набор записей, который содержит только данные для новых объектов. Создавайте новые объекты, не проверяя карту идентичности для каждой строки. Включает в себя множество операций конкатенации строк для построения запроса, но может сохранить целую кучу поисков хеш-карты.
Какой подход вы бы выбрали?
(да, я знаю, я должен просто реализовать обе версии и провести тест производительности, но, возможно, кто-то может ответить на этот вопрос из практического опыта)