Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Проектирование БД под киносайт
Для каждого фильма несколько стран, жанров, актеров и т.д. (соответственно таблиц тоже). Для каждой таблицы я сделал таблицы связей.
К примеру для жанров
На главной странице к примеру просто выбираются данные, на странице информации о фильме нужно жанры, актеров, категории и т.д. вывести + сделать ссылкой на страницу подробной информации(т.е. к примеру index.php?task=genres&id=100).
От хранения инфы по жанрам, странам и т.д. в таблице `movies`, пришлось отказаться из-за огромного дублирования данных.
Теперь стоит задача все это хоть как-то склеить воедино, с минимальным кол-вом запросов. + интересует вопрос о поиске по базе при таком раскладе. К примеру как найти фильмы жанра `детектив` если в таблице `movies` информации про жанры 0(в стуктуре она сохранена только для совместимости).
Какие будут идеи и предложения?
PS! Для примерного представления того как должно выглядеть: http://oldway[dot]libra[dot]ms/component[dot][dot][dot]ask,detail/id,3/ - все ссылки на выборку по жанрам, странам и т.д. идут не через id, а через имя/название.
Вопрос в том что лучше для индексирования(имя/название в ссылке или title/alt + id в ссылке).
Покинул форум
Сообщений всего: 260
Дата рег-ции: Май 2010
Помог: 0 раз(а)
чего-то многовато текстовых полей...
`directors` text NOT NULL,
`producers` text NOT NULL,
`operators` text NOT NULL,
`composers` text NOT NULL,
`screenwriters` text NOT NULL,
`actors` text NOT NULL,
вы все предполагаете вручную вбивать? из списков проще выбирать да и таблицы нормализуются, не говоря о скорости поиска (по индексам, которыми вы вообще не пользуетесь)
----- Хостинг - неограниченно доменов на одну папку Ajax - отличное введение
Мелкий
Отправлено: 30 Августа, 2010 - 11:12:00
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Да, и правда, поработайте немного над нормализацией и оптимизацией полей - взять хотя бы `countries` text NOT NULL, который вообще-то должен быть по логике числовым внешним ключом для одноимённой таблицы.
И таблица связей немного странная - это же связь многие-ко-многим, логичнее использовать составной ключ на оба поля - тогда лишнего дублирования информации не будет. Например, внешние ключи фильм и актёр - в одном фильме один и тот же актёр дважды играть не сможет, и составной ключ как раз порежет эту ошибку данных, в то же время не мешая актёру играть во множестве фильмов.
Хотя, до конца нормализовывать всё же не надо будет, наверное - со всех таблиц выборка данных с объединением всё-таки накладная будет.
----- PostgreSQL DBA
Viper
Отправлено: 30 Августа, 2010 - 11:12:02
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
alexspb это осталось от старой системы которую начинал не я, и в новой уже не будет.
Индексация для поиска это вооще отдельная статья с бубнами и плясками
`f`.`rc_country_id`,`f`.`rc_movie_id`, GROUP_CONCAT(`g`.`c_name`,`g`.`c_name_intl`)AS countries
FROM`movies`AS a
LEFTJOIN`comments`AS b ON`b`.`comm_movie_id`=`a`.`id`AND`b`.`comm_published`= 1
LEFTJOIN`bookmarks`AS c ON`c`.`bm_movie_id`=`a`.`id`
INNERJOIN`genres_rel`AS d ON`a`.`id`=`d`.`rg_mid`
LEFTJOIN`genres`AS e ON`e`.`g_id`IN(`d`.`rg_gid`)
INNERJOIN`countries_rel`AS f ON`a`.`id`=`f`.`rc_movie_id`
LEFTJOIN`countries`AS g ON`g`.`c_id`IN(`f`.`rc_country_id`)
WHERE`published`= 1
GROUPBY`id`
ORDERBY`id`DESC
только вот боюсь что при больших объемах приклеиваемых данных GROUP_CONCAT их урежет, да и почему-то в последней групировке по странам приехала белиберда в виде United StatesСША,United StatesСША,United StatesСША
хотя в таблице связей id один...
Что лучше-то сделать? Одну таблицу связей для остальных 4 таблиц данных, либо под каждую таблицу данных свою таблицу связей? Прошу прощения за нубство, как-то все не приходилось составлять такие БД(все больше плоские...)...
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
Мелкий пишет:
в одном фильме один и тот же актёр дважды играть не сможет
сыграть то он не сможет, а вот как быть если человек и режиссер фильма и актер и продюсер ? учитывая что все данные об актерах сценаристах, операторах и т.д. и т.п. хранятся в одной таблице, просто в каком-то поле указана профессия...
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Типа вот, обрезанный вариант:
Нажмите для увеличения
Получается объёмная таблица собственно фильмов, таблица всяких людей, и вместо многих полей в таблице фильмов, ссылающихся на людей, делается по таблице, которые и обеспечивают связь многие-ко-многим в реляционной базе.
(*1) - в таблице размещается только уникальная информация о фильме. Полей про людей там вообще нет, т.к. их мы собираем по другой таблице.
А в дополнительных таблицах больше никакой информации, собственно, и не надо, так 2 поля и остаются.
PS: весь день вспоминал, как же делались к диплому такие диаграммки - вспомнил, ООо. Так быстрее объяснить идею и связи.
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
Мелкий соорудил по вашему примеру таблицы... получилось аж 9 штук.
Теперь вопрос в том как все это выгрести из БД?
INNER и LEFT JOIN не подходят из-за того что нужно группировать результаты + слишком медленно получается. Можно как-то вложенными SELECT но к сожалению до них добрался только вчера и толком не могу понять как их "пришить" в данном случае...
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.