Например, в БД есть две таблицы первая с новостями, вторая с категориями, которым может принадлежать новость. Структура элементарная:
Код
таблица news
+-------------------------+
| id | news | category_id |
+----+------+-------------+
таблица category
+--------------------+
| id | category_name |
+----+---------------+
+-------------------------+
| id | news | category_id |
+----+------+-------------+
таблица category
+--------------------+
| id | category_name |
+----+---------------+
но мне хотелось бы реализовать такую возможность, что бы одна и та же новость могла принадлежать сразу нескольким категориям! В голову приходит только вариант с хранением в category_id нескольких значений... но это как-то не гуд.. других идей нет, а у вас? )))

Спустя 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;" то выводим новость ну и всё в этом роде.
Не спорю. извращенный способ и можно проще наверняка, но мне в голову ничего не пришло более грамотного )))
Ну можно сделать немного кривым способом (как я делал в свое время:))
Когда добавляешь новости через админку выводиш список разделов с чекбоксами и отмечаешь для какого раздела новость. В поле с категориями записываешт выделенные разделы например через точку с запятой, а потом, при извлечении, ставишь условие, если строка содержит "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, не советуй то что плохо работает!
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 категорий.
В таком случае не страшно переименование категорий.
В столбце "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 категорий.
В таком случае не страшно переименование категорий.
В столбце "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 категорий.
В таком случае не страшно переименование категорий.
В столбце "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 категорий.
В таком случае не страшно переименование категорий.
В столбце "category_id" каждой новости хранить строку вида: "1,2,3,6,7" , где цифры - id категорий. При выборке с базы мы получаем эту строку. Разбираем ее с помощью функции explode(',', $categories); , где в $categories находится строка с базы данных. В результате получаем массив, который содержит id категорий.
В таком случае не страшно переименование категорий.
Это не очень нормальный способ

Patrick сказал о том варианте, который следует использовать и никаких лишних нагрузок не появится...
Спустя 4 часа, 43 минуты, 35 секунд (5.06.2008 - 19:10) Alchemist написал(а):
У меня в одном из проектов программист использовал предложеный TRIAL'ом способ. Над следующим проектом он уже не работал. Вскрылось все когда количество категорий перевалило за 10 и запросы вида "LIKE '%1;%'" вдруг стали выдавать содержимое как 1-ой, так и 11-ой и 21-ой категории сразу.
Послушайте умных людей (Patrick'a & n1tr0k1ll3r'a) - такие вещи всегда делаются через таблицу соответствий.
ЗЫ: Пост ProfPHP'a вообще полный бред. Дополнительная нагрузка возникнет как раз при его способе (поиск по тексту вместо индекса).
Послушайте умных людей (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 вообще полный бред. Дополнительная нагрузка возникнет как раз при его способе (поиск по тексту вместо индекса).
Послушайте умных людей (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:
таблица news
+-------------------------+
| id | news | category_id |
+----+------+-------------+
таблица category
+--------------------+
| id | category_name |
+----+---------------+
При добавлении новости предлагается выбрать одну из категорий. Данные берутся из таблицы category:
PHP |
<?php |
Подскажите, пожалуйста, как сформировать запрос таким образом, чтобы в колонку category_id таблицы news встало значение id категории, а не название категории, которое сейчас является переменной.
Спустя 17 минут, 54 секунды (13.01.2009 - 23:15) kirik написал(а):
silen_brain, как-то так наверное
PHP |
<?php |
_____________