Есть простая база данных фильмов. У меня есть фильм, у него есть имя, описание, актеры(может быть много) и жанры(может быть много). Не знаю как лучше сделать структуру. Набросал такую структуру:
1 таблица: films
id, name, description
2 таблица: genres
id, name
3 таблица: actors
id, name
4 таблица: films_genres
film(id), genre(id)
5 таблица: films_actors
film(id), actor(id)
Правильная ли такая структура и как правильнее делать запрос на получение фильма.
Я так понимаю будет 3 запроса на получение фильма, его жанров и актеров?
А как делать запросы, если мне нужно получить много фильмов?
Подскажите пожалуйста.
SELECT film.id, film.name, film.descrioption,
actor.id actor_id, actor.name actor_name,
genre.id genre_id, genre.name genre_name
FROM films
LEFT JOIN films_genres ON film.id = films_genres.film_id
LEFT JOIN genre ON genre.id = films_genres.genre_id
LEFT JOIN films_actors ON film.id = films_actors.film_id
LEFT JOIN actor ON actor.id = films_actors.actor_id
WHERE films_actors.actor_id IN (734, 44) -- актеры такие-то
AND films_genres.genre_id = 3 -- жанр такой-то
а если в БД типовая база фильмов (5млн фильмов, 8млн персон) ? кто первый сорвется с катушек- сервак или юзер, разбивающий клавиатуру об голову соседа по колледжу?
Можно вообще хранить json в поле у фильма. Например, хранить актёров и жанры. Это можно делать, если не будешь делать поиск по актёрам и жанрам, а лишь нужны только для отображения.
И тогда всё сводится к одной таблице.
А так да, сначала получил фильмы, потом получил всех сразу ко всем фильмам актёров и жанров. Тогда 3 запроса.
UPD: опять же можно в любом случае хранить всё в json, а если и нужен поиск по по жанрам и актёрам, то уже искать из таблиц, которые ты создал. Это нужно если уж нужна очень быстрая выдача, когда записей уже очень много.
Например, у фейсбука есть список диалогов и всё для отображения хранится в таблице условно в Conversation и там все данные, т.е. почти нет или может вообще нет запросов в другие таблицы. Это сильно ускоряет приложение.
Поиск по фильмам и жанрам тоже планирую сделать. Тогда вариантов не остается? 3 запроса? А как быть если мне нужно получить информацию по 10 фильмам? 10*3 = 30 запросов?