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 :: Проектирование БД под киносайт

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: варианты и решения ?!
Viper
Отправлено: 30 Августа, 2010 - 09:43:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Собственно в заголовке под что база. Теперь опишу что есть и в чем затыки.
Структуры таблиц примерно такие:

Спойлер (Отобразить)


Для каждого фильма несколько стран, жанров, актеров и т.д. (соответственно таблиц тоже). Для каждой таблицы я сделал таблицы связей.
К примеру для жанров
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE `genres_rel` (
  2.   `rg_gid` int(11) NOT NULL,
  3.   `rg_mid` int(11) NOT NULL,
  4.   PRIMARY KEY (`rg_gid`)
  5. ) ENGINE=MyISAM;


На главной странице к примеру просто выбираются данные, на странице информации о фильме нужно жанры, актеров, категории и т.д. вывести + сделать ссылкой на страницу подробной информации(т.е. к примеру 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 в ссылке).

http://oldway[dot]libra[dot]ms/component[dot][dot][dot]arhiv/Itemid,29/ - собственно сама главная страница. Здесь все просто выгребли-вывели. Но... учитывая вышеприведенную структуру, запросов к БД будет явно не 2-3(запросы самой joomla не учитывать).


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
alexspb
Отправлено: 30 Августа, 2010 - 10:56:53
Post 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 - отличное введение
 
 Top
Мелкий Супермодератор
Отправлено: 30 Августа, 2010 - 11:12:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Да, и правда, поработайте немного над нормализацией и оптимизацией полей - взять хотя бы `countries` text NOT NULL, который вообще-то должен быть по логике числовым внешним ключом для одноимённой таблицы.

И таблица связей немного странная - это же связь многие-ко-многим, логичнее использовать составной ключ на оба поля - тогда лишнего дублирования информации не будет. Например, внешние ключи фильм и актёр - в одном фильме один и тот же актёр дважды играть не сможет, и составной ключ как раз порежет эту ошибку данных, в то же время не мешая актёру играть во множестве фильмов.

Хотя, до конца нормализовывать всё же не надо будет, наверное - со всех таблиц выборка данных с объединением всё-таки накладная будет.


-----
PostgreSQL DBA
 
 Top
Viper
Отправлено: 30 Августа, 2010 - 11:12:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




alexspb это осталось от старой системы которую начинал не я, и в новой уже не будет.

Индексация для поиска это вооще отдельная статья с бубнами и плясками Улыбка

Вот тут поэксперементировав соорудил такое УГ Улыбка
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `a`.`id`, `a`.`movie_name`, `a`.`movie_name_intl`, `a`.`movie_name_alias`,
  2.         `a`.`year`, `a`.`directors`, `a`.`actors`, `a`.`premiere_date`, `a`.`premiere_date_intl`, `a`.`url_cover`, `a`.`plot`,
  3.         UNIX_TIMESTAMP(`a`.`date_published`) AS `date_published`, `a`.`published`,
  4.         `a`.`author`, `a`.`archived`, COUNT(`b`.`comm_id`) AS comm_count, `c`.`bm_id`,
  5.         `c`.`bm_movie_id`, `d`.`rg_gid`, `d`.`rg_mid`, GROUP_CONCAT(`e`.`g_genre`) AS genres,
  6.         `f`.`rc_country_id`, `f`.`rc_movie_id`, GROUP_CONCAT(`g`.`c_name`, `g`.`c_name_intl`) AS countries
  7. FROM `movies` AS a
  8. LEFT JOIN `comments` AS b ON `b`.`comm_movie_id` = `a`.`id` AND `b`.`comm_published` = 1
  9. LEFT JOIN `bookmarks` AS c ON `c`.`bm_movie_id` = `a`.`id`
  10. INNER JOIN `genres_rel` AS d ON `a`.`id` = `d`.`rg_mid`
  11. LEFT JOIN `genres` AS e ON `e`.`g_id` IN (`d`.`rg_gid`)
  12. INNER JOIN `countries_rel` AS f ON `a`.`id` = `f`.`rc_movie_id`
  13. LEFT JOIN `countries` AS g ON `g`.`c_id` IN (`f`.`rc_country_id`)
  14. WHERE `published` = 1
  15. GROUP BY `id`
  16. ORDER BY `id` DESC


только вот боюсь что при больших объемах приклеиваемых данных GROUP_CONCAT их урежет, да и почему-то в последней групировке по странам приехала белиберда в виде
United StatesСША,United StatesСША,United StatesСША

хотя в таблице связей id один...

Что лучше-то сделать? Одну таблицу связей для остальных 4 таблиц данных, либо под каждую таблицу данных свою таблицу связей? Прошу прощения за нубство, как-то все не приходилось составлять такие БД(все больше плоские...)...

(Отредактировано автором: 30 Августа, 2010 - 11:12:59)



-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Viper
Отправлено: 30 Августа, 2010 - 15:12:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Мелкий пишет:
в одном фильме один и тот же актёр дважды играть не сможет

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


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Мелкий Супермодератор
Отправлено: 30 Августа, 2010 - 15:38:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Но тогда же и связь к другому полю нужна. Иначе БД в миг запутается, кто из них всё-таки актёры, а кто - продюсеры и другой съёмочный народ.


-----
PostgreSQL DBA
 
 Top
Viper
Отправлено: 30 Августа, 2010 - 16:21:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




совсем отупел на старости лет Улыбка)
Мелкий пример можно в студию ? Улыбка

(Отредактировано автором: 30 Августа, 2010 - 16:21:57)



-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Мелкий Супермодератор
Отправлено: 30 Августа, 2010 - 17:45:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Типа вот, обрезанный вариант:

Нажмите для увеличения

Получается объёмная таблица собственно фильмов, таблица всяких людей, и вместо многих полей в таблице фильмов, ссылающихся на людей, делается по таблице, которые и обеспечивают связь многие-ко-многим в реляционной базе.
(*1) - в таблице размещается только уникальная информация о фильме. Полей про людей там вообще нет, т.к. их мы собираем по другой таблице.
А в дополнительных таблицах больше никакой информации, собственно, и не надо, так 2 поля и остаются.

PS: весь день вспоминал, как же делались к диплому такие диаграммки - вспомнил, ООо. Так быстрее объяснить идею и связи.

(Отредактировано автором: 18 Января, 2011 - 15:21:01)



-----
PostgreSQL DBA
 
 Top
Viper
Отправлено: 31 Августа, 2010 - 11:31:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Мелкий соорудил по вашему примеру таблицы... получилось аж 9 штук.
Теперь вопрос в том как все это выгрести из БД? Улыбка

INNER и LEFT JOIN не подходят из-за того что нужно группировать результаты + слишком медленно получается. Можно как-то вложенными SELECT но к сожалению до них добрался только вчера и толком не могу понять как их "пришить" в данном случае... Недовольство, огорчение


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB