Я занимаюсь разработкой многоуровневого веб-приложения на основе базы данных - реляционной базы данных SQL, Java для среднего уровня обслуживания, веб-интерфейса для пользовательского интерфейса. Язык на самом деле не имеет значения.
Средний уровень обслуживания выполняет фактические запросы к базе данных. Пользовательский интерфейс просто запрашивает определенные данные и не имеет понятия, что он поддерживается базой данных.
Вопрос в том, как обрабатывать большие наборы данных? Пользовательский интерфейс запрашивает данные, но результаты могут быть огромными, возможно, слишком большими, чтобы поместиться в памяти. Например, приложение для уличных знаков может иметь уровень обслуживания:
StreetSign getStreetSign(int identifier)
Collection<StreetSign> getStreetSigns(Street street)
Collection<StreetSign> getStreetSigns(LatLonBox box)
Уровень пользовательского интерфейса просит, чтобы все дорожные знаки соответствовали некоторым критериям. В зависимости от критериев набор результатов может быть огромным. Слой пользовательского интерфейса может разделить результаты на отдельные страницы (для браузера) или просто представить их все (обслуживая вплоть до Goolge Earth). Потенциально огромным набором результатов может быть проблема производительности и ресурсов (нехватка памяти).
Одно из решений - не возвращать полностью загруженные объекты (объекты StreetSign). Скорее возвращает какой-то набор результатов или итератор, который лениво загружает каждый отдельный объект.
Другое решение - изменить API службы, чтобы он возвращал подмножество запрошенных данных:
Collection<StreetSign> getStreetSigns(LatLonBox box, int pageNumber, int resultsPerPage)
Конечно, пользовательский интерфейс все еще может запросить огромный набор результатов:
getStreetSigns(box, 1, 1000000000)
Мне любопытно, что является стандартным шаблоном промышленного дизайна для этого сценария?