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