Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Как реализовать базу данных по фильмам


Автор: Axielandr 7.8.2008, 17:49
Хочу создать Базу данных по фильмам в mysql у себя на локальом сайте. Как сделать там чтобы, например в поле "жанр фильма" заносить несколько значений, напрмер, боевик, фантастика, комедия, И потом, чтобы на сайте у определенного фильма отображалось несколько жанров.

Автор: bars80080 7.8.2008, 17:54
заносить несколько значений: боевик, фантастика, комедия
какая разница сколько текста записывать в поле?

Автор: Mal Hack 7.8.2008, 18:59
Axielandr, прочитайте в документации по такие типы данных, как множество и перечисление (SET и ENUM). 
Под жанры отводите отдельную таблицу, с уникальным идентификатором записей. В поле ganre фильма заносите множество уникальных ключей, соответствующих жанрам.

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

Автор: Axielandr 7.8.2008, 20:43
Mal Hack
спасибо, что подсказали в каком направлении "копать". Просто я новичек в этом деле еще.

Автор: Mal Hack 7.8.2008, 21:30
Цитата(Axielandr @  7.8.2008,  21:43 Найти цитируемый пост)
Mal Hack, 
спасибо, что подсказали в каком направлении "копать". Просто я новичек в этом деле еще. 

Всегда пожалуйста smile
Вы даже не представляете себе, какие извращенные способы еще могут быть использованы в качестве реализации smile))
Побитовые маски, множество, яки строки smile
Тем не менее это может позволить очень сильно оптимизировать многие вещи.

Автор: HackMan 8.8.2008, 06:36
Очевидным минусом множеств является то, что множества не могут содержать более 64 элементов, и должны быть заранее предопределены значения. Но для данной задачи с фильмами вполне пойдёт.

Автор: Mal Hack 8.8.2008, 21:05
HackMan, можно использовать связку ENUM+SET, ну или как я говорил выше, реализовывать множество черезу другие типы данных, как концепцию.

Автор: HackMan 8.8.2008, 21:24
Цитата(Mal Hack @  8.8.2008,  21:05 Найти цитируемый пост)
можно использовать связку ENUM+SET

Интересно взглянуть на реализацию. Я вообще стараюсь избегать типы SET и ENUM (возможно и неоправданно). 

Цитата(Mal Hack @  8.8.2008,  21:05 Найти цитируемый пост)
черезу другие типы данных, как концепцию

Что это за тип данных такой, концепция?

Я бы предложил вариант с промежуточной таблицей связей. Примерно так:
Код

Таблица "films" (Фильмы)
id - код
name - название
year - годвыпуска
description - описание

Таблица "genres" (Жанры)
id - код
name - наименование жанра

Таблица "filmgenrelinks" (Связи жанров с фильмами)
id - код
filmid - код фильма, связан с films.id
genreid - код жанра фильма, связан с genres.id


Таблица "filmgenrelinks" реализует связь "много-много",то есть к каждому из фильмов можно привязать несколько жанров, чего и требовалось. Правда, целостность данных и исключение повторений (в отличии от SET и ENUM) - всё это ложится на программиста.

Автор: DmitryChess 8.8.2008, 21:48
Хм.. HackMan, а не проще ли следующим образом:

Таблица1 - Films
1. id - код
2. name_film - название фильма
3. id_genrу - код жанра
4. year - год выпуска
5. description - описание

Таблица2 - Genres
1. id_genry - код жанра
2. name_genry - название жанра

Автор: MoLeX 8.8.2008, 22:04
поддерживаю DmitryChess, можно поступить и без третей таблицы filmgenrelinks

Автор: HackMan 8.8.2008, 22:19
DmitryChess, это реализация связи "один-ко-многим". Больше одного жанра к одному фильму ты не прикрутишь.

Автор: source777 8.8.2008, 22:21
Цитата(MoLeX @  8.8.2008,  22:04 Найти цитируемый пост)
поддерживаю DmitryChess, можно поступить и без третей таблицы filmgenrelinks 
Ты топикстартера читал, он хочет фильмам назначать несколько жанров, лучше связи N:M через таблицу пересечения вы для этого ничего не придумаете...




Цитата(HackMan @  8.8.2008,  21:24 Найти цитируемый пост)
Правда, целостность данных и исключение повторений (в отличии от SET и ENUM) - всё это ложится на программиста.
А вот это гон, добавь уникальный композитный ключ в таблицу пересечения и всё ляжет на СУБД! Как и должно.

Автор: HackMan 8.8.2008, 22:27
source777, ага, спасибо, не подумал про такой ключ. Повторения он исключит, но разве он исключит возможность создавать записи с несуществующими filmid и genreid?

Автор: source777 8.8.2008, 22:53
Цитата(HackMan @  8.8.2008,  22:27 Найти цитируемый пост)
но разве он исключит возможность создавать записи с несуществующими filmid и genreid?
Ну уж внешние ключи(FOREIGN KEY) там само собой должны быть! Их добавление подразумевается при существовании любой связи между таблицами...

Автор: Axielandr 9.8.2008, 06:59
Вот допутим я создал отдельну таблицу по жанрам из двух полей id и ganre_name. А в таблицу с фильмами в поле ganre ("set") я заношу несколько значений: 1,5,6 и т..д (т.е. заношу номер id определенного жанра из таблицы со жанрами). Потом я делаю запрос к БД и получаю результат в котором несколько значений, например 1,5,6. У меня здесь вопрос: Как из этого результата выбрать по одному значению, т.е. я хочу чтобы было примерно так

если в результате существеут '1' то выводить 'комедия'
если в результате существеут '3' то выводить 'ужасы'
вот чтото в этом роде

Оговорюсь сразу, что владею знанием по php_mysql только на уровне новичка (знаю только простейшие функции)

Автор: HackMan 9.8.2008, 07:11
Я так понимаю, ты хочешь получить список жанров фильма в текстовом виде?
Если да, то вроде так:
Код

SELECT genres.ganre_name FROM genres, films WHERE genres.id IN (films.ganre) AND films.id=(код фильма)

Автор: Mal Hack 9.8.2008, 13:52
Цитата(HackMan @  8.8.2008,  22:24 Найти цитируемый пост)
Что это за тип данных такой, концепция?

Просто как пример. Делать текстовое поле, куда писать что-то вроде:
READ|WRITE|UPLOAD - константы именования прав или жанров.
Потом в скрипте эту строчку парсить через explode. Сами же имена жанров можно и в скрипт вшить, т.к. информация статическая и БД тут не нужна.

Цитата(HackMan @  8.8.2008,  22:24 Найти цитируемый пост)
Я бы предложил вариант с промежуточной таблицей связей. Примерно так:

Это излишне. ДОп таблицы применяются тогда, когда связей слишком много или потоки данных большие.

Автор: HackMan 9.8.2008, 14:20
Цитата(Mal Hack @  9.8.2008,  13:52 Найти цитируемый пост)
Делать текстовое поле, куда писать что-то вроде

Аа, так вот, как это называется... Спасибо, буду знать  smile 

Автор: Axielandr 10.8.2008, 06:02
HackMan
че то я не переворил этот код, ну да ладно. Вы мне просто скажите, вот после результата запроса я имею переменную допустим $ganres. И в ней есть значения 1,4,6 (цифры это id жанров). Неужели нет функции которая в этом результате проверяла бы существование определеныйх значений (в данном случае цифр)

Автор: HackMan 10.8.2008, 16:35
Axielandr, из таблицы ganres надо просто сделать выборку с айдишником. Если результат будет пустой - жанра с таким id не существует.
Код

SELECT * FROM ganres WHERE id=...

А дальше через mysql_num_rows() смотри, не пустой ли результат

Автор: Axielandr 16.8.2008, 06:22
Всем спасибо кто давал советы. Вроде получилось у меня, токо я по своему сделал.
Код

$films_janre = mysql_query ("SELECT ganre FROM video WHERE id='$id'", $db);
$ganre = mysql_fetch_array($films_janre);
$a=$ganre['ganre'];    

if (isset ($a[0])) {
if (!empty($a[0])) {$ganre1 = mysql_query ("SELECT janr FROM films_tip WHERE kod='$a[0]'");}
$ganre1_end = mysql_fetch_array($ganre1);}
echo $ganre1_end['janr']." ";

if (isset ($a[2])) {
if (!empty($a[2])) {$ganre2 = mysql_query ("SELECT janr FROM films_tip WHERE kod='$a[2]'");}
$ganre2_end = mysql_fetch_array($ganre2);}
echo $ganre2_end['janr']." ";

if (isset ($a[4])) {
if (!empty($a[4])) {$ganre3 = mysql_query ("SELECT janr FROM films_tip WHERE kod='$a[4]'");}
$ganre3_end = mysql_fetch_array($ganre3);}
echo $ganre3_end['janr']." ";


if (isset ($a[6])) {
if (!empty($a[6])) {$ganre4 = mysql_query ("SELECT janr FROM films_tip WHERE kod='$a[6]'");}
$ganre4_end = mysql_fetch_array($ganre4);}
echo $ganre4_end['janr']." ";


Знаю, что некоторые слова не правильно написал (janre). Может этот способ примитивный, но главное, что я сам его сделал smile. В таблице со жанрами каждому жанру сопоставил не id, а букву латинского алфавита.

Автор: Mal Hack 16.8.2008, 09:33
Axielandr, сделайте одним запросом. Оптимальнее будет. Еще лучше через внутреннее множество IN

Автор: Axielandr 16.8.2008, 11:43
Mal Hack
я же говорю я в php на уровне новичка только шарю, так что для меня пока и так сойдет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)