Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> несколько категорий для одной новости, реализация как? 
:(
    Опции темы
Igor_K
  Дата 13.7.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Здравствуйте!

Мне нужно сделать для новости (например) возможность выбора нескольких категорий. Вот только как лучше сделать?

С одной категорий все ясно. Хранится в поле int идентификатор и все. Выбирать легко все записи этой категории, работать легко. 

А с несколькими категориями получается нужно их хранить в текстовом поле через запятую например. Так работать тяжелей. Как выбирать записи категории? LIKE '%,15,%' ? Или как? Получается тяжелее выборки делать другие с участием категорий. 
Или как-то делать с связующей таблицей
Цитата

ид_группы_категорий | ид_категории
1                   | 15
1                   | 19
1                   | 24
1                   | 7
3                   | 11
3                   | 45
     
А в записи новости указывать идентификатор этой группы. Но так тоже получается есть проблемы. Например чтобы получить все названия категорий записи, нужно делать вложенный запрос. Так? Или можно по-другому?

Вобщем как лучше сделать такое?                        
PM MAIL   Вверх
underW
Дата 13.7.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 22.9.2008

Репутация: 1
Всего: 3



Таблица категорий:
Код

id                  |  категория

1                   | Спорт
2                   | Культура
3                   | Музыка


Таблица новостей:

Код

id                  |  новость

1                   | новость о спорте и музыке
2                   | новость культуре
3                   | новость о спорте


Сводная таблица:

Код

id_категории                 |  id_новости

1                   |1
3                   |1
2                   |2
1                   |3



PM MAIL   Вверх
skyboy
Дата 13.7.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Igor_K @  13.7.2009,  13:56 Найти цитируемый пост)
Вобщем как лучше сделать такое?     

вариант 1: сериализация(именно так называется предложение "хранить в одном поле идентификаторы через запятую"). запрос для поиска будет выглядеть чуть по-другому(LIKE - слишком тяжеловесная конструкция):
Код

WHERE locate(concat(",",15,","), concat(",",categories_field,","))> 0

добавлять запятые(или какие там разделители используешь) надо для того, чтоб поиск "1" не нашел вхождения в строке "11,12,13": при добавлении обрамляющих разделителей мы уже будем искать ",1," в ",11,12,13," - и с логикой все нормально.
недостаток: конструкция, работающая со строками и так не сильно быстрая(не сделаешь индекс на идентификатор - только на всю строку целиком). Если же ещё надо подключить таблицу категорий, для вывода названий категорий, то 
Код

inner join categories
on locate(concat(",",categories.id,","), concat(",",news.categories_field,","))> 0

должна быть ну оооочееееень тормозной.
вариант 2: связь многие-ко-многим(одна статья может относиться к нескольким категориям, в одной категории может быть несколько статей) "стандартно" реализуется в реляционных СУБД через отдельную таблицу из двух полей: идентификатор объекта 1 + идентификатор объекта 2. В твоем случае - запись из двух полей: идентификатор статьи и идентификатор категории.
Для ускорения работы при связывании с этой таблицей, пригодится создать ключ по этим двум полям, и, в зависимости от запросов, на каждой в отдельности(точнее, на то, что в составном ключе по двум полям будет идти на второй позиции).
надеюсь, не слишком запутанно написал.
PM MAIL   Вверх
Igor_K
Дата 13.7.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Мне больше нравится второй способ. Спасибо, skyboy, + 
Для выборки категорий новости нужно использовать такой запрос? :
Код

SELECT * FROM cat WHERE id IN (SELECT id_cat FROM catsviaz WHERE id_news = '5')

А в одном запросе с выборкой новости получить категории можно? Например я выбираю новость
Код

SELECT * FROM news WHERE id = '5'

PM MAIL   Вверх
skyboy
Дата 14.7.2009, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Igor_K @  13.7.2009,  22:15 Найти цитируемый пост)
Спасибо, skyboy, + 

товарищ underW даже раньше меня этот способ привел в виде примера, пока я там расписывал smile
Цитата(Igor_K @  13.7.2009,  22:15 Найти цитируемый пост)
Для выборки категорий новости нужно использовать такой запрос? :

в данном случае, на скорости не скажется, я думаю, но все же для повышения читаемости и понижения энтропии переходи на join'ы:
Код

SELECT cat.* 
FROM catsviaz
INNER JOIN cat 
ON cat.id = catsviaz.id_cat
WHERE catsviaz.id_news = 5

Цитата(Igor_K @  13.7.2009,  22:15 Найти цитируемый пост)
А в одном запросе с выборкой новости получить категории можно?

join же!
Код

SELECT news.*, cat.*
FROM news
INNER JOIN catsviaz
ON catsviaz.id_news = news.id
INNER JOIN cat
ON cat.id =catsviaz.id_cat
WHERE news.id = 5

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0683 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.