Одним из примеров является многоуровневая
Одним из примеров является многоуровневая итерация, в которой несколько уровней многозначных зависимостей включается в результаты запросов. Такой паттерн иллюстрируется на рис. 5. Даже если коллекции родственных элементов загружаются в одном запросе, запросу требуется загрузить служащих каждого отдела и проекты каждого служащего. Если в Остине имеется n отделов, и в каждом отделе в Остине в среднем работают m служащих, то потребуется выполнить 1 + n + nm запросов.
Можно загрузить требуемые данные за три запроса: один для загрузки отделов в Остине, один для загрузки служащих, работающих в этих отделах, и один для загрузки проектов, в которых участвуют эти служащие. В каждый из этих запросов должно дублироваться условие из верхней части цикла. Если все результаты должны возвращаться в правильном порядке, то требуется поддерживать вложенный порядок сортировки. Наконец, клиент должен сопоставлять связанные элементы одной таблицы и соответствующие поднаборы во вложенных таблицах. Заметим, что возможен и одиночный запрос, хотя названия отделов и имена служащих будут дублироваться.
for each Department d in DB.getDepartments() sorted by size if d.city = ‘Austin’ then print( d.name ); for each Employee e in d.employees sorted by e.name print( e.name ); for each Project p in e.projects sorted by p.date print( p.name );
Рис. 5. Псевдокод для многоуровневой итерации
Этот стиль невозможно выразить на SQL, хотя это можно сделать на языке OQL. При пересмотре SQL следует обращать большее внимание на виды запросов, требуемых для поддержки объектно-реляционного отображения []. Если проводить аналогию с разработкой RISC-процессоров, SQL можно рассматривать как разновидность языка ассемблера: вместо того, чтобы разрабатывать понятный, удобный для человеческого восприятия интерфейс, более эффективным оказывается определять распространенные паттерны, генерируемые клиентскими программами, для разработки оптимизированного интерфейса. Проводилось исследование по обнаружению многоуровневой итерации и повышению ее эффективности с использованием упреждающего чтения [], но ни в одной коммерческой системе этот тип упреждающего чтения не реализован.
Содержание Назад Вперед