Комментарии

Таблицы соответствий SQL
( 1 Проголосовало )

Внешние ключи отлично подходят для связывания одной строки из одной таблицы с одной строкой в другой таблице. Но иногда требуется установить соответствие нескольких строк из одной таблицы с несколькими строками в другой таблице. Рассмотрим в данном примере взаимосвязь между таблицами учащихся и классов. Каждый учащийся может пройти обучение во многих классах, а каждый класс может быть назначен многим учащимся. Это так называемое отношение "многие ко многим". Такое отношение обычно реализуется с помощью таблицы соответствий. В данном случае можно создать таблицу соответствий student_class_map с двумя столбцами student_id и class_id, а также первичный ключ, объединяющий оба этих столбца. Иными словами, отдельный класс может быть назначен конкретному учащемуся только один раз.

Всякий раз, когда учащийся вводится в класс, система автоматически добавляет в таблицу соответствий строку со столбцами идентификаторов учащегося и класса. Если же учащийся пропускает класс, эта строка может быть удалена автоматически. С помощью таблицы соответствий можно легко выполнить два вида запросов. В частности, список учащихся в одном классе (class id = 123) можно получить по следующему запросу:

SELECT  c.class_name,   s.student_name
FROM student_class_map AS m
INNER JOIN classes AS  с ON m.class_id =  c.id
INNER JOIN students AS  s  ON m.student_id =  s.id
WHERE m.class_id =  123
ORDER BY  s.student_name;

Аналогично список всех классов, на обучение в которых записан учащийся (id = 234), может быть получен по следующему запросу:

SELECT s.student_name, с.class_name
FROM student_class_map AS m
INNER JOIN classes AS с ON m.class_id = c.id
INNER JOIN students AS s ON m.student_id = s. id
WHERE m.student_id =234
ORDER BY c.class_name;

Следует заметить, что таблица соответствий studentclassmap служит в качестве главной в обоих приведенных выше запросах, хотя отображаемые столбцы извлекаются из других таблиц. Дело в том, что для каждой строки из этой таблицы по запросу требуется получить лишь одну строку. Аналогичным образом можно создать таблицу соответствий для преподавателей и классов. Она также будет отражать отношение "многие ко многим". Аналогично справочным таблицам, таблицы соответствий можно проиндексировать по столбцам class_id и student_id, чтобы ускорить обработку запросов, в которых эти столбцы указываются как внешние ключи.


Понравился материал? Пригодилась информация? Плюсани в социалки!


 
Похожие новости