Межтабличные связи связывают две таблицы с помощью общего поля, которое имеется в обеих таблицах. Существуют три типа связей: один к одному (1:1), один ко многим(1:M) и многие ко многим (M:M). Если две таблицы связаны отношением один к одному, то это значит, что каждая запись первой таблицы связана с одной единственной записью второй таблицы. В связи один ко многим каждая запись в первой таблице может быть связана с несколькими записями во второй таблице.
В качестве примера рассмотрим таблицы Студенты и Успеваемость. В таблице Студенты каждому студенту соответствует свой № студенческого билета. Так как один студент сдает несколько экзаменов, то в таблице Успеваемость может быть несколько одинаковых номеров студенческих билетов. Следовательно, между этими таблицами существует связь типа один ко многим.
Связь многие ко многим означает, что каждая запись в первой таблице может быть связана со многими записями во второй таблице и, наоборот, каждая запись во второй таблице может быть связана со многими записями в первой таблице. Реляционные БД не поддерживают такие связи. Так как в реальной жизни они встречаются достаточно часто, их реализуют через вспомогательные таблицы, используя связи один ко многим.
Для связей между таблицами используют внешние ключи. В таблицах ключевое поле используется для однозначной идентификации каждой записи. В таблице Студенты поле № студенческого билета является главным ключом. Если включить это поле в таблицу Успеваемость, то оно становится внешним ключом. Поле внешнего ключа должно иметь тот же тип, что и главный ключ в родительской таблице, но с одним исключением. Если главный ключ имеет тип Счетчик, то поле внешнего ключа в связанной таблице должно иметь тип Числовой.
В Access есть два способа образования связей: созданием поля подстановок или путем установления прямых связей в окне Схема данных.
Окно Схема данных можно открыть с помощью пункта меню Сервис, Схема данных(рис. 16).
Рисунок 16. Установление связи один ко многим
Установим связь между таблицей Студенты и Успеваемость. Для установки связей нужно в таблице Студенты перетащить поле главного ключа № студенческого билета на поле № студенческого билета таблицы Успеваемость. Откроется диалоговое окно Изменение связей, в котором можно задать параметры связей (рис.17). Для задания параметров связей используются флажки Обеспечение целостности данных, каскадное обновление связанных полей, каскадное удаление связанных записей.
Рисунок 17. Диалоговое окно Изменение связей
Обеспечение условий целостности данных
Условие целостности служит для обеспечения соответствия записей в подчиненной таблице записям главной таблицы. Условие целостности предотвратит непреднамеренное удаление пользователем тех записей в главной таблице, которые связаны с записями в подчиненной таблице. Если при создании связи между таблицами Студенты и Успеваемость мы задали требование соблюдения условий целостности, то при работе с данными система Access наложит три ограничения:
Во-первых, СУБД не позволит в таблице Успеваемость зарегистрировать студента, № студенческого которого не встречается в таблице Студенты.
Во-вторых, значения внешнего ключа № студенческого билета, использованные в подчиненной таблице Успеваемость, защитят соответствующие записи в главной таблице Студенты, так что пользователи не смогут удалить в главной таблице записи о студентах, которые сдали экзамены, т. е. тех которые встречаются в таблице Успеваемость.
В-третьих, сами данные первичного ключа защищены. Нельзя изменить № студенческого студента в таблице Студенты, если на него есть ссылка в таблице Успеваемость. Если попробовать ввести, удалить или изменить данные, нарушающие условие целостности, программа Access выдаст на экран предупреждение и проигнорирует внесенные изменения.
Каскадное обновление и каскадное удаление данных
Преодолеть второе и третье ограничения и при этом обеспечить удовлетворение условия сохранения целостности данных все же можно, если предоставить возможность выполнения каскадного обновления связанных полей и каскадного удаления связанных записей. Если допускается каскадное обновление связанных полей, то при изменении значений первичного ключа в главной таблице происходит автоматическое обновление значений внешнего ключа в подчиненной таблице. В этом режиме мы можем изменить № студенческого билета в главной таблице Студенты. При этом автоматически произойдет изменение этого же кода во всех записях таблицы Успеваемость. Если разрешено каскадное удаление связанных записей, то удаление записи в главной таблице приводит к удалению всех связанных записей в подчиненной таблице. Удаление записи о студенте из таблицы Студенты приведет к удалению записей о нем в таблице Успеваемость.
Принимать решение о том, надо ли использовать условие сохранения целостностей данных и разрешать каскадное обновление и каскадное удаление, необходимо самостоятельно. Рассматривая такую возможность, необходимо ответить на следующие вопросы.
1. Надо ли ограничивать значения в подчиненной таблице только теми значениями, которые уже включены в главную таблицу? Например, нужна ли уверенность в том, что при вводе в таблицу Успеваемость сведений о студенте, этот студент уже присутствует в таблице Студенты? Если ответ положительный, то надо использовать условие сохранения целостности данных.
2. Имеет ли поле первичного ключа тип данных Счетчик? Если ответ положительный, то нет смысла допускать использование каскадного обновления связанных полей, поскольку мы все равно не сможем изменить значения в поле типа Счетчик. Надо ли предоставлять возможность изменения существующих значений в поле первичного ключа? Если необходимо сохранить информацию о № студенческого студента на все время его учебы в вузе, не предоставляйте возможность изменять значение первичного ключа: оставьте каскадное обновление связанных полей недоступным. Если же изменение № студенческого допустимо, тогда предоставьте возможность каскадного обновления.
3. Можно ли разрешить удалять записи в главной таблице и все связанные записи в подчиненной таблице? Если ответ отрицательный, не предоставляйте возможность каскадного удаления связанных записей.
Большинство баз данных содержат два типа таблиц: одни таблицы хранят основные данные (Студенты и Успеваемость), а другие только списки, используемые в основных таблицах (Специальность, Предмет). Такие вспомогательные таблицы называются ссылочными таблицами.
Чтобы создать поле подстановок для таблицы Успеваемость нужно
Создать таблицу Специальность и заполнить ее (рис. 18).
Создать поле подстановок с помощью мастера подстановок,который запускается в конструкторе с помощью раскрывающегося списка в полеТип данных (рис 19).