Вы должны различать атрибуты и сущности. Сущность - это вещь, обычно существительное. Атрибут больше похож на часть описания информации. В жаргоне базы данных сущность = таблица, атрибут = поле / столбец.
Имея отдельную таблицу для определенных вещей, давайте использовать директор, в качестве примера, называется нормализация. Хотя в одних обстоятельствах он может быть хорошим, в других он может оказаться ненужным (как правило, это усложняет запросы - нужно объединять все - и это медленнее).
В этом случае наличие таблицы года не является необходимым, поскольку нет никаких других атрибутов относительно года, кроме самого года, которые вы бы сохраняли. Лучше денормализовать это и сохранить год в самой таблице фильмов.
Директор, с другой стороны, другой. Возможно, вы захотите сохранить имя, фамилию режиссера, дату рождения, дату смерти (если применимо) и т. Д. Очевидно, что вы не хотите вводить дату рождения режиссера каждый раз, когда вы входите в фильм, который этот человек направляет, поэтому имеет смысл иметь отдельную сущность для директора.
Даже если вы не хотите хранить всю эту информацию о директоре (вам просто нужно его имя), иметь для него отдельную таблицу (и использовать суррогатный ключ - я вернусь к этому через секунду) полезно, потому что это предотвращает опечатки и дубликаты - если у вас написано чье-то имя неправильно или введено по-другому (первый, последний против последнего, первый), то если вы попытаетесь найти другие фильмы, которые они сняли, у вас не получится.
Обычно рекомендуется использовать суррогатный ключ (первичный ключ) для таблиц. Совпадение целого числа намного быстрее, чем сопоставление строки. Это также позволяет вам свободно менять имя, не беспокоясь о внешних ключах, хранящихся в других таблицах (идентификатор остается прежним, поэтому вам не нужно ничего делать).
Вы действительно можете зайти довольно далеко, и все зависит от того, что вы хотите в нем хранить.
Например, вместо того, чтобы иметь одного режиссера на фильм, в некоторых фильмах есть несколько режиссеров ... так что между фильмами и режиссерами будет много-много отношений, поэтому вам понадобится таблица с, например:
films_directors => **filmid, directorid**
Делая это еще дальше, иногда режиссеры также являются актерами, и наоборот. Таким образом, вместо того, чтобы иметь таблицы директора и актера, вы можете иметь таблицу с одним человеком и присоединиться к этой таблице, используя таблицу ролей. Таблица ролей будет занимать различные должности - например, режиссер, продюсер, звезда, экстра, ручка, редактор ... и будет выглядеть примерно так:
films => **filmid**, title, otherstuff...
people => **personid**, name, ....
roles => **roleid**, role name, ....
film_people => **filmid, personid, roleid**
genre => **genreid**, name, ...
film_genre => **genreid, filmid**
У вас также может быть поле role_details в таблице film_people, которое может содержать дополнительную информацию в зависимости от роли (например, название роли, которую играет актер).
Я также показываю жанр как множество <> много отношений, потому что возможно фильм в нескольких жанрах. Если вы этого не хотите, то вместо таблицы film_genre фильмы будут содержать жанр.
Как только это настроено, легко запрашивать и находить все, что сделал данный человек, или все, что человек сделал в качестве режиссера, или всех, кто когда-либо снимал фильм, или всех людей, связанных с одним конкретным кино .. Это может продолжаться и продолжаться.