В школьной базе данных есть таблицы Students (StudentID — первичный ключ, ФИО) и Clubs (ClubID — первичный ключ, название кружка). Ученик может посещать несколько кружков, а в одном кружке занимаются многие ученики. Для каждого ученика нужно хранить дату вступления в каждый его кружок (в один кружок ученик вступает один раз). Какое решение соответствует реляционной модели без избыточности и аномалий?
Показать ответ и разборСкрыть ответ и разбор
Верный ответ
- BСоздать третью таблицу с полями StudentID, ClubID, дата вступления; ключ — пара StudentID и ClubID
Разбор
Связь между Students и Clubs — «многие-ко-многим», так как ученик посещает много кружков, а кружок объединяет многих учеников. В реляционной модели такая связь реализуется отдельной таблицей связи, в которой есть внешние ключи StudentID и ClubID. Дата вступления зависит от пары «ученик — кружок», а не от одного из них, поэтому она хранится именно в таблице связи, а составной первичный ключ (StudentID, ClubID) гарантирует, что ученик вступает в кружок один раз. Вариант с полем в Students дублирует ФИО и нарушает однозначность первичного ключа. Вариант с полем в Clubs дублирует название кружка и тоже делает ключ неуникальным. Вариант с записью через запятую нарушает атомарность значений (первая нормальная форма). Верно: «Создать третью таблицу с полями StudentID, ClubID, дата вступления; ключ — пара StudentID и ClubID».