Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь много ко многим. / 9 сообщений из 9, страница 1 из 1
13.10.2005, 12:24
    #33322229
Nerian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь много ко многим.
Всем привет. Что то я не могу понять как лучше поступить со связью много ко многим.
Вопщем легче это расмотреть на простом примере:
Есть таблица фильмов и таблица жанров. Один фильм может пренадлежать одновременно к нескольким жанрам, ровно так же как и один жанр принадлежит нескольким фильмам.
Вопщем связь реализована через третью таблицу (если кто знает как подругому подскажите).
Выходит что это делаеться так:

table films
int id (primary key);
varchar(200) name;

table genres
int id (primary key);
varchar(200) name;

table films_genres;
int id (primary key); | хотя наверное он тут не нужен
int film_id;
int genre_id;

А теперь задача выбрать таблицу содержашую все фильмы и в одтельном столбце жанр.
Если просто для вывода подойдёт обычный sql запрос вида:
select films.name as film_name, genres.name as genre_name where films.id=films_genres.firm_id && genres.id=films_genres.genre_id;

Он выведит повторяющиеся строки:

film_name | genre_name
------------------
Robot | fantazy
Robot | crazy
Cool Film | camedy
Cool Film | fantazy
--------------------
, и поэтому потом будет не удобно на том же php разбираться какому фильму какие жанры. А для каждого фильма отдельно делать запрос на то в каких он жанрах накладно, ибо если список из 1000 фильмов вместо одного получиться 1001 запрос.

Кто бы как поступил в этой синуации чтобы получить на выходе:
Robot - fantazy, crazy
Cool Film - camedy, fantazy
...
Можно с исопльзованием любого внешнего языка програмирования, главное чтобы
это работало быстро.
...
Рейтинг: 0 / 0
13.10.2005, 12:43
    #33322293
adv
adv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь много ко многим.
...
Рейтинг: 0 / 0
13.10.2005, 13:04
    #33322385
bas
bas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь много ко многим.
adv оно?

Ну во первых у человека не МС СКЛ стоит а скорее МойСКЛ, так что не прокатит.
А я бы предложил отсортировать бы по имени фильма зарос и уже на клиенте делть все что хотите - это процедура займет строчек 5 я думаю.
Так что клиент рулит.....
...
Рейтинг: 0 / 0
13.10.2005, 13:47
    #33322604
Nerian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь много ко многим.
Спасибо за ответы. Сам зачитался вот этого http://www.sql.ru/forum/actualthread.aspx?tid=215946 :)
Но там один спор под конец уже пошёл.
Вопщем как верно заметили предпочтительнее для меня использовать mysql, но подойдут любые решения,
так как выбор БД зависит полностью от меня (личная разработка, некомерческая, и к работе не имеет отношения.)

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

Ещё раз всем спасибо за ответы.
...
Рейтинг: 0 / 0
13.10.2005, 13:52
    #33322628
Nerian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь много ко многим.
Появилось безумное желание посмотреть как это сделали в phpBB и Invision, там
схожая ситуация много форумов, много модераторов работает всё на mysql или
PgSQL по желанию.
Вопщем вооружаюсь grep find cut less и на поиски )
...
Рейтинг: 0 / 0
13.10.2005, 16:36
    #33323237
Nerian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь много ко многим.
Вопщем в phpBB2 с использованием mysql так и сделано: три и более таблиц, выбираеться обычным
запросом, сортируеться по id, а дальше код на php который это для удобства в
массив кидает, для поего примера это что то типо:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
$sql="SELECT f.id as film_id, 
   f.name as film_name, g.name as ganre_name
   FROM films f, ganres g, films_ganres fg
   WHERE fg.film_id=f.id && fg.ganre_id=g.id
   ORDER BY f.id");

$result=mysql_query($sql);
while($rows = mysql_fetch_result($result)) { 
  if($tmp_id<>$rows[film_id]) { // новый фильм
    $tmp_id=$rows[film_id]; // запомним что новый
    echo "<br>Film: $rows[film_name] - Genres: "; // вывидим имя, и подготовимся к выводу названий жанров.
  }
  echo "$rows[ganre_name] "; // Вывод самих жанров.
}

...
Рейтинг: 0 / 0
13.10.2005, 17:02
    #33323335
bas
bas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь много ко многим.
NerianВопщем в phpBB2 с использованием mysql так и сделано: три и более таблиц, выбираеться обычным
запросом, сортируеться по id, а дальше код на php который это для удобства в
массив кидает, для поего примера это что то типо:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
$sql="SELECT f.id as film_id, 
   f.name as film_name, g.name as ganre_name
   FROM films f, ganres g, films_ganres fg
   WHERE fg.film_id=f.id && fg.ganre_id=g.id
   ORDER BY f.id");

$result=mysql_query($sql);
while($rows = mysql_fetch_result($result)) { 
  if($tmp_id<>$rows[film_id]) { // новый фильм
    $tmp_id=$rows[film_id]; // запомним что новый
    echo "<br>Film: $rows[film_name] - Genres: "; // вывидим имя, и подготовимся к выводу названий жанров.
  }
  echo "$rows[ganre_name] "; // Вывод самих жанров.
}


Сорри, ошибся на 3 строчки ;-)
...
Рейтинг: 0 / 0
15.10.2005, 22:58
    #33326721
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь много ко многим.
Nerian
Кто бы как поступил в этой синуации чтобы получить на выходе:
Robot - fantazy, crazy
Cool Film - camedy, fantazy


Это на клиенте надо делать, любой отчетник тебе может например выделить группу записей по названию фильма и внутри группы перечислить все жанры.
...
Рейтинг: 0 / 0
17.10.2005, 14:38
    #33328221
Nerian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь много ко многим.
MasterZiv Nerian
Кто бы как поступил в этой синуации чтобы получить на выходе:
Robot - fantazy, crazy
Cool Film - camedy, fantazy


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

Если нужен один фильм эта схема будет работать хорошо, а если потвребуеться для 1000 фильмов, тогда потребуеться 1000 запросов, вместо одного. Очень накладно.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь много ко многим. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]