[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: 1 новость с несколькими категориями
kart
Никак не могу придумать, как решить следующую задачу:
Например, в БД есть две таблицы первая с новостями, вторая с категориями, которым может принадлежать новость. Структура элементарная:

Код
таблица news
+-------------------------+
| id | news | category_id |
+----+------+-------------+

таблица category
+--------------------+
| id | category_name |
+----+---------------+

но мне хотелось бы реализовать такую возможность, что бы одна и та же новость могла принадлежать сразу нескольким категориям! В голову приходит только вариант с хранением в category_id нескольких значений... но это как-то не гуд.. других идей нет, а у вас? ))) ph34r.gif



Спустя 16 минут, 15 секунд (24.04.2007 - 08:13) Patrick написал(а):
Ищё одна таблица с соответствиями

Спустя 4 минуты, 25 секунд (24.04.2007 - 08:17) kart написал(а):
Цитата(Patrick @ 24.4.2007, 8:13) [snapback]18900[/snapback]
Ищё одна таблица с соответствиями

Если честно, то мне это ни о чём не говорит... можно по подробнее?

Спустя 17 минут, 25 секунд (24.04.2007 - 08:34) TRIAL написал(а):
Зачем тебе вторая таблица а уж тем более третья с какими то там соответствиями. Не проще в первую добавить поле где будут храниться данные о категориях?!!
Ну можно сделать немного кривым способом (как я делал в свое время:))
Когда добавляешь новости через админку выводиш список разделов с чекбоксами и отмечаешь для какого раздела новость. В поле с категориями записываешт выделенные разделы например через точку с запятой, а потом, при извлечении, ставишь условие, если строка содержит "razdel1;" то выводим новость ну и всё в этом роде.
Не спорю. извращенный способ и можно проще наверняка, но мне в голову ничего не пришло более грамотного )))

Спустя 7 минут, 6 секунд (24.04.2007 - 08:42) kart написал(а):
нее, TRIAL, это очень бажно... в таком способе оч много недостатков... ну хотя бы прикинь, если вдруг придётся переименовывать раздел... это жжжжжжж *опа!!!

Спустя 1 час, 8 минут, 55 секунд (24.04.2007 - 09:50) Patrick написал(а):
3-я таблица id_news id_category - вот и всё! соответствие новости к категориям! Гибкость на лицо!

TRIAL, не советуй то что плохо работает!

Спустя 1 год, 1 месяц, 5 дней, 12 часов, 30 минут, 31 секунда (29.05.2008 - 22:21) brabus написал(а):
Помоему, удачный вариант, который должен появится в мозгу сам собой, а еще и после прочтения поста TRIAL'а.
В столбце "category_id" каждой новости хранить строку вида: "1,2,3,6,7" , где цифры - id категорий. При выборке с базы мы получаем эту строку. Разбираем ее с помощью функции explode(',', $categories); , где в $categories находится строка с базы данных. В результате получаем массив, который содержит id категорий.
В таком случае не страшно переименование категорий.

Спустя 11 часов, 30 минут, 11 секунд (30.05.2008 - 09:51) ProfPHP написал(а):
Цитата(brabus @ 29.5.2008, 23:21) [snapback]39472[/snapback]
Помоему, удачный вариант, который должен появится в мозгу сам собой, а еще и после прочтения поста TRIAL'а.
В столбце "category_id" каждой новости хранить строку вида: "1,2,3,6,7" , где цифры - id категорий. При выборке с базы мы получаем эту строку. Разбираем ее с помощью функции explode(',', $categories); , где в $categories находится строка с базы данных. В результате получаем массив, который содержит id категорий.
В таком случае не страшно переименование категорий.

а также уменьшается нагрузка на сервер базы за счет удаления одного запроса. все гуд. =)

Спустя 5 дней, 3 часа, 29 минут, 12 секунд (5.06.2008 - 13:20) Arcky написал(а):
Цитата(brabus @ 30.5.2008, 6:21) [snapback]39472[/snapback]
Помоему, удачный вариант, который должен появится в мозгу сам собой, а еще и после прочтения поста TRIAL'а.
В столбце "category_id" каждой новости хранить строку вида: "1,2,3,6,7" , где цифры - id категорий. При выборке с базы мы получаем эту строку. Разбираем ее с помощью функции explode(',', $categories); , где в $categories находится строка с базы данных. В результате получаем массив, который содержит id категорий.
В таком случае не страшно переименование категорий.

А выборку из какой то категории как будете делать?

Спустя 1 час, 5 минут, 49 секунд (5.06.2008 - 14:26) n1tr0k1ll3r написал(а):
Цитата(brabus @ 30.5.2008, 6:21) [snapback]39472[/snapback]
Помоему, удачный вариант, который должен появится в мозгу сам собой, а еще и после прочтения поста TRIAL'а.
В столбце "category_id" каждой новости хранить строку вида: "1,2,3,6,7" , где цифры - id категорий. При выборке с базы мы получаем эту строку. Разбираем ее с помощью функции explode(',', $categories); , где в $categories находится строка с базы данных. В результате получаем массив, который содержит id категорий.
В таком случае не страшно переименование категорий.


Это не очень нормальный способ smile.gif
Patrick сказал о том варианте, который следует использовать и никаких лишних нагрузок не появится...

Спустя 4 часа, 43 минуты, 35 секунд (5.06.2008 - 19:10) Alchemist написал(а):
У меня в одном из проектов программист использовал предложеный TRIAL'ом способ. Над следующим проектом он уже не работал. Вскрылось все когда количество категорий перевалило за 10 и запросы вида "LIKE '%1;%'" вдруг стали выдавать содержимое как 1-ой, так и 11-ой и 21-ой категории сразу.

Послушайте умных людей (Patrick'a & n1tr0k1ll3r'a) - такие вещи всегда делаются через таблицу соответствий.

ЗЫ: Пост ProfPHP'a вообще полный бред. Дополнительная нагрузка возникнет как раз при его способе (поиск по тексту вместо индекса).


Спустя 19 часов, 46 минут, 41 секунда (6.06.2008 - 14:56) ProfPHP написал(а):
Цитата(Alchemist @ 5.6.2008, 20:10) [snapback]40021[/snapback]
У меня в одном из проектов программист использовал предложеный TRIAL'ом способ. Над следующим проектом он уже не работал. Вскрылось все когда количество категорий перевалило за 10 и запросы вида "LIKE '%1;%'" вдруг стали выдавать содержимое как 1-ой, так и 11-ой и 21-ой категории сразу.

Послушайте умных людей (Patrick'a & n1tr0k1ll3r'a) - такие вещи всегда делаются через таблицу соответствий.

ЗЫ: Пост ProfPHP'a вообще полный бред. Дополнительная нагрузка возникнет как раз при его способе (поиск по тексту вместо индекса).

про поиск никто ничего не говорил до моего поста в этой теме.

Спустя 19 часов, 7 минут, 49 секунд (7.06.2008 - 10:04) LoneCat написал(а):
Тоже отпишусь в поддержку Patrick'a, он имхо предложил самый нормальный, и пожалуй даже единственный нормальный, способ реализации связи многое ко многому, который в проектировании БД вообще считаются моветоном, но используя таблицу связей такое возможно, потому как связь первой таблицы данных и таблицы связей выглядит как многое к одному, и связть второй таблицы данных с таблицей связей выглядит как многое к одному, да и к тому-же будут работать индексы, по таблицей связей можно элементарно осуществлять выборку как новостей, принадлежащих категории, так и категорий, включающих в себя новость. А насчет лишнего запроса - этого можно избежать посредством JOIN'ов и вложенных запросов.

Спустя 7 месяцев, 6 дней, 11 часов, 52 минуты, 45 секунд (13.01.2009 - 22:57) silen_brain написал(а):
У меня вопрос по реализации. Ситуация таже. Имеются таблицы

таблица news
+-------------------------+
| id | news | category_id |
+----+------+-------------+

таблица category
+--------------------+
| id | category_name |
+----+---------------+

При добавлении новости предлагается выбрать одну из категорий. Данные берутся из таблицы category:

PHP
<?php 
require "config.php";
$result mysql_query("SELECT * FROM category",$db);
$myrow mysql_fetch_array($result);
?>


<form method="post" action="<?=$_SERVER['PHP_SELF']?>" name="form">
<b>Отметьте флажком категорию:</b><br>


<?
//формируется содержимое формы
do
{
printf ("<input name='type' type='radio'value='%s'> %s<br>",$myrow['id'],$myrow['category_name']);
}
while (
$myrow mysql_fetch_array($result));
?>

<input name="submit" type="submit" value="Сохранить" /> <input type="reset" 


Подскажите, пожалуйста, как сформировать запрос таким образом, чтобы в колонку category_id таблицы news встало значение id категории, а не название категории, которое сейчас является переменной.

Спустя 17 минут, 54 секунды (13.01.2009 - 23:15) kirik написал(а):
silen_brain, как-то так наверное
PHP
<?php 
require "config.php";
$result mysql_query("SELECT * FROM category",$db);
?>


<form method="post" action="<?=$_SERVER['PHP_SELF']?>" name="form">
<b>Отметьте флажком категорию:</b><br>


<?
//формируется содержимое формы
while ($myrow mysql_fetch_assoc($result))
{
   echo 
'<input name="type" type="radio" value="'.$myrow['id'].'"> '.$myrow['category_name'].'<br>';
}



_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.