Отличный вопрос, Лукас, и это углубляется в процесс нормализации базы данных.
Тот факт, что вы поняли, почему иметь несколько столбцов для представления классов - это плохо, уже показывает, что у вас большой потенциал.
Что, если мы хотим добавить новый класс? Теперь мы должны добавить совершенно новый столбец. Для этого мало гибкости.
Так что же можно сделать?
Мы создаем ТРИ таблицы.
Один стол для студентов:
Student
|-------------------------|
| StudentID | Student_Name|
|-------------------------|
| 1 | John |
| 2 | Sally |
| 3 | Stan |
---------------------------
Один стол предназначен для занятий:
Class
------------------------
| ClassID | Class_Name|
------------------------
| 1 | Math |
| 2 | Physics |
------------------------
И, наконец, одна таблица содержит отношения между учениками и классами:
Student_Class
-----------------------
| StudentID | ClassID |
-----------------------
Если бы мы хотели записать Джона в физику, мы вставили бы строку в таблицу Student_Class.
INSERT INTO Student_Class (StudentID, ClassID) VALUES (1, 2);
Теперь у нас есть запись о том, что студент № 1 (Джон) посещает урок № 2 (физика). Пусть Салли посещает математику, а Стэн - физику и математику.
INSERT INTO Student_Class (StudentID, ClassID) VALUES (2, 1);
INSERT INTO Student_Class (StudentID, ClassID) VALUES (3, 1);
INSERT INTO Student_Class (StudentID, ClassID) VALUES (3, 2);
Чтобы получить эти данные обратно в удобочитаемом виде, мы объединяем три таблицы:
SELECT Student.Student_Name,
Class.Class_Name
FROM Student,
Class,
Student_Class
WHERE Student.StudentID = Student_Class.StudentID
AND Class.ClassID = Student_Class.ClassID;
Это даст нам набор результатов, подобный этому:
------------------------------
| Student_Name | Class_Name |
------------------------------
| John | Physics |
| Sally | Math |
| Stan | Physics |
| Stan | Math |
------------------------------
И вот как нормализация базы данных работает в двух словах.