270 Часть II. Типовые решения
отображением внешних ключей (Foreign Key Mapping, 258), указав в "многозначной сторо-
не" ссылки внешний ключ "однозначной стороны". Однако данное типовое решение не
может применяться для отображения связи типа "многие ко многим", поскольку одно-
значной стороны здесь нет. Как же тогда представить подобную связь?
Ответом на этот вопрос является классическое решение, применяемое в реляционных
базах данных на протяжении уже нескольких десятилетий: создать дополнительную таб-
лицу отношений, а затем воспользоваться типовым решением отображение с помощью
таблицы ассоциаций, чтобы отобразить многозначное поле на таблицу отношений.
П ринцип действия
Основной идеей, лежащей в основе отображения с помощью таблицы ассоциаций, яв-
ляется хранение ассоциаций в таблице отношений. Последняя содержит только значения
внешних ключей двух таблиц, связанных отношением. Таким образом, каждой паре
взаимосвязанных объектов соответствует одна строка таблицы отношений.
Таблице отношений не соответствует объект приложения, вследствие чего у нее нет
идентификатора объекта. Первичным ключом данной таблицы является совокупность
двух первичных ключей таблиц, которые связаны отношениями.
Чтобы загрузить данные из таблицы отношений, необходимо выполнить два запроса.
Для большей наглядности представьте себе загрузку списка профессиональных качеств
служащего. В этом случае выполнение запросов (по крайней мере концептуально)
выполняется в два этапа. На первом этапе запрос находит все строки таблицы от-
ношений skillEmployees, которые ссылаются на нужного служащего. На втором этапе
запрос находит все профессиональные качества, соответствующие их идентификаторам в
найденных строках таблицы skillEmployees.
Описанная схема работает хорошо, если вся необходимая информация уже загружена
в память. Если же это не так, реализация подобного алгоритма может привести к огром-
ным расходам, связанным с количеством запросов, потому что для определения каждого
профессионального качества, идентификатор которого содержится в таблице отноше-
ний, придется выполнять отдельный запрос. Для сокращения расходов к таблицам ссы-
лок и профессиональных качеств можно применить операцию соединения, что позволит из-
влекать все данные посредством одного запроса, хотя и увеличит сложность отображения.
Обновление данных об ассоциациях связано с массой сложностей, касающихся вы-
полнения обновлений многозначных полей. К счастью, с таблицей отношений можно
обращаться так же, как и с отображением зависимых объектов (Dependent Mapping, 283),
что значительно упрощает дело. На таблицу отношений не должна ссылаться никакая
другая таблица, поэтому вы можете свободно добавлять и удалять отношения по мере не-
обходимости.
Назначение
Каноническим примером использования отображения с помощью таблицы ассоциаций
является связь типа "многие ко многим", поскольку альтернативы данному решению
просто нет.
Отображение с помощью таблицы ассоциаций может быть использовано и для других
типов связей. Разумеется, поскольку данное типовое решение является более сложным,
чем отображение внешних ключей, а также требует дополнительной операции соединения,