Задать вопрос

Структура базы данных

Подскажите пожалуйста по структуре базы данных. Нужно хранить информацию по фильмам.
К каждому фильму, относиться много информации.

а именно:

Название
Оригинальное название (анг)
Год
Страна
Слоган
Режиссер в множестве
Сценарий (в множестве)
Продюсер (в множестве)
Оператор (в множестве)
Композитор (в множестве)
Художник (в множестве)
Монтаж (в множестве)
Жанр (в множестве)
Бюджет
Сборы
Зрители
Примера
рейтинг MPAA
Продолжительность

таких фильмов будет много (порядка 80 000), и почти все однотипные, поэтому нужно как-то грамотно составить DB, что бы не было проблем в дальнейшем.

как я думал сделать:

Главная таблица (catalog) в которую заносим

id — номер фильма
name — название
name_original — оригинальное название
type — тип картины (фильм, сериал)
year — год выпуска

здесь меня смущает нужно ли здесь держать (name, name_original)… или вынести ее в отдельную таблицу

таблица с параметрами (catalog_properties)
film_id — номер фильма
property_id — номер название параметра
property_value — номер параметра

таблица с именами параметров (catalog_properties_name)
id — номер параметра
name — название параметра
code — код параметра для внутренних потребностей фронтенда

+ несколько таблиц справочников, для стран, жанров, etc

таблица для параметров что не входят в справочники (catalog_properties_data)
id — номер параметра
name — название параметра

вот здесь меня смущает что все параметры будут держаться в поле с типом varchar
а хорошо бы для
бюджет, сборы в США — interger,
премьера — date,
рейтинг MPAA — enum


разве что делать таблицу для параметров такой:

id — номер параметра
name_string — название параметра
name_integer — название параметра
name_datetime — название параметра
name_enum — название параметра

и выбирать в дальнейшем так "SELECT CONCAT_WS('', name_string, name_integer, name_datetime, name_enum) as name" но хорошо ли так ??

+ еще не знаю как поступить с описанием фильмов, это будет тип TEXT, выносить ли в отдельную таблицу все описания, или запихать в таблицу параметров, что указана выше
  • Вопрос задан
  • 5037 просмотров
Подписаться 4 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 3
> здесь меня смущает нужно ли здесь держать (name, name_original)… или вынести ее в отдельную таблицу

безусловно, лучше хранить в этой же таблице

> и выбирать в дальнейшем так «SELECT CONCAT_WS('', name_string, name_integer, name_datetime, name_enum) as name» но хорошо ли так ??

лично я не стал бы усложнять, пусть лучше будет varchar, 80к записей не так ж и много, но если все-таки хотите разделить то думаю будет правильней создать 3 таблицы для каждого нужного типа т.е. catalog_properties_data_string, catalog_properties_data_int, catalog_properties_data_datetime и соответственно добавить поле type в таблицу catalog_properties
Ответ написан
Комментировать
benone
@benone
да 80 тысяч это совсем немного…
Если база проектируется с учетом поиска, то рекомендую в последствии использовать сфинкс, который создает свой собственный индекс и при запросе практически всё равно какая структура бд.
Ответ написан
Комментировать
@resurection
Не надо так разделять. 80к — это копейки. Но:
1. обязательно настройте индексы.
2. если в 90% случаев нужно только название + режисёр, то не надо писать SELECT *… Перечислите все нужные поля.

На крайний случай, можете разделить одну таблицу на две со связью один-к-одному. В первой должны быть те поля которые используются всегда (id, название, режисёр), во второй все остальные. Это позволит писать SELECT * FROM `t1`.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы