Ответ на этот вопрос поначалу будет немного сложным для понимания. Через некоторое время это становится естественным. Это хорошо известный шаблон дизайна. Вам нужен третий стол:
create table students_in_courses(studentid, courseid)
В этой таблице у вас есть строка для каждого учащегося и каждого курса, в котором он учится. Вы можете перевернуть это предложение: Строка для каждого курса и каждого учащегося в этом курсе.
Это "таблица ссылок". Используется для отображений M: N.
Вы можете думать об этой таблице как о сущности, так же как студенты и курсы. Вы даже можете добавить дополнительные столбцы:
create table students_in_courses(studentid, courseid, date_entered, date_exited, grade)
Достаточно постоянного числа таблиц.
Позвольте мне попробовать другое объяснение: мы могли бы сохранить информацию о том, какой студент находится в каком курсе, сохранив матрицу со студентами в виде строк и курсами в виде столбцов. В каждой камере есть бул: студент на этом курсе да / нет.
Теперь мы сохраняем всю эту матрицу в виде таблицы:
create table students_in_courses(studentid, courseid, is_in_course bit) primary key(studentid, courseid)
Для каждой ячейки по строке. Теперь мы удаляем все строки с is_in_course = 0 и удаляем этот столбец, потому что теперь он содержит только 1. Мы вернулись к первоначальному решению. Наша "таблица ссылок" хранит ненулевые ячейки матрицы перекрестных произведений двух таблиц.