![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
Igor_K |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 4.2.2008 Где: Kyiv Репутация: нет Всего: нет |
Здравствуйте!
Мне нужно сделать для новости (например) возможность выбора нескольких категорий. Вот только как лучше сделать? С одной категорий все ясно. Хранится в поле int идентификатор и все. Выбирать легко все записи этой категории, работать легко. А с несколькими категориями получается нужно их хранить в текстовом поле через запятую например. Так работать тяжелей. Как выбирать записи категории? LIKE '%,15,%' ? Или как? Получается тяжелее выборки делать другие с участием категорий. Или как-то делать с связующей таблицей
А в записи новости указывать идентификатор этой группы. Но так тоже получается есть проблемы. Например чтобы получить все названия категорий записи, нужно делать вложенный запрос. Так? Или можно по-другому? Вобщем как лучше сделать такое? |
|||
|
||||
underW |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 142 Регистрация: 22.9.2008 Репутация: 1 Всего: 3 |
Таблица категорий:
Таблица новостей:
Сводная таблица:
|
||||||
|
|||||||
skyboy |
|
||||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
вариант 1: сериализация(именно так называется предложение "хранить в одном поле идентификаторы через запятую"). запрос для поиска будет выглядеть чуть по-другому(LIKE - слишком тяжеловесная конструкция):
добавлять запятые(или какие там разделители используешь) надо для того, чтоб поиск "1" не нашел вхождения в строке "11,12,13": при добавлении обрамляющих разделителей мы уже будем искать ",1," в ",11,12,13," - и с логикой все нормально. недостаток: конструкция, работающая со строками и так не сильно быстрая(не сделаешь индекс на идентификатор - только на всю строку целиком). Если же ещё надо подключить таблицу категорий, для вывода названий категорий, то
должна быть ну оооочееееень тормозной. вариант 2: связь многие-ко-многим(одна статья может относиться к нескольким категориям, в одной категории может быть несколько статей) "стандартно" реализуется в реляционных СУБД через отдельную таблицу из двух полей: идентификатор объекта 1 + идентификатор объекта 2. В твоем случае - запись из двух полей: идентификатор статьи и идентификатор категории. Для ускорения работы при связывании с этой таблицей, пригодится создать ключ по этим двум полям, и, в зависимости от запросов, на каждой в отдельности(точнее, на то, что в составном ключе по двум полям будет идти на второй позиции). надеюсь, не слишком запутанно написал. |
||||
|
|||||
Igor_K |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 4.2.2008 Где: Kyiv Репутация: нет Всего: нет |
Мне больше нравится второй способ. Спасибо, skyboy, +
Для выборки категорий новости нужно использовать такой запрос? :
А в одном запросе с выборкой новости получить категории можно? Например я выбираю новость
|
||||
|
|||||
skyboy |
|
||||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
товарищ underW даже раньше меня этот способ привел в виде примера, пока я там расписывал ![]() в данном случае, на скорости не скажется, я думаю, но все же для повышения читаемости и понижения энтропии переходи на join'ы:
join же!
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |