[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод новостей из нескольких категорий
Arh
Добрый день коллеги.
Пишу модуль новостей для движка, решил что категории можно будет вкладывать друг в друга до посинения с помощью поля parent_id, то есть у категории может быть родительская категория, у родительской категории тоже родительская категория и так сколько хочешь.

Сделал, рекурсивно это всё замечательно выводиться и сортируется:
user posted image

Сегодня хотел приступить к созданию интерфейса по добавлению новостей и тут появились вопросы по поводу добавления новости в категорию.
Можно ли новость добавлять в разные категории или только в одну?
Как всё это будет выводиться?
Подумал, прикинул, завис.

Сейчас объясню к чему я это всё =)
Посмотрите на рисунок.
Допустим вы переходите в категорию "понедельник" , ну тут всё понятно, выводятся статьи из этой категории.
Но при переходе в категорию "Январь" должны выводиться статьи из "Январь,1 неделя,2 неделя,понедельник,вторник"
То есть из дочерних категорий тоже должны выводиться статьи.

Тут не завязано на датах, чтобы не путаться и не копать в сторону интервал дат в mysql, представьте что категория к примеру называется "юмор" а в ней "картинки,анекдоты,видео" или "эротика" а в ней "сиськ.,жо.." ну вы поняли.


Мои мысли
1) С помощью дополнительного запроса получить все категории, потом рекурсивно получить дочернии категории через запятую, а потом только получить новости WHERE `cat` IN (категории через запятую).
Почему так не хочу:
  • Как то тяжеловато для по сути самого активного модуля.
  • А что если я не захочу выводить новости в родительской категории, может категория "юмор" будет содержать только главные новости из этого раздела.

2) Великий и могучий REGEXP. У каждой новости в поле cat будет несколько категорий через разделитель (1|5|4). При создании новости можно будет выбрать любые категории куда выводить. Например добавляете "анекдоты", а также хотите выводить в категории "юмор", просто указываете какие нужно категории и всё.
Почему так не хочу:
  • Очень соблазнительно так сделать, и при запросе новостей не нужно никаких дополнительных обращений к базе, да и гибкость вырастает. Но как то интернет запугал меня тем, что REGEXP это зло. Хотя было такое что запрос работал быстрее с REGEXP чем с JOIN.

3) Сделать дополнительную таблицу, в которой перечислять id новости и id категории в которой она состоит.
Почему так не хочу:
  • Вариант тоже гибкий как и второй, но тут придётся добавить JOIN который сначала найдёт все id новостей для конкретной категории, а потом запросит уже сами новости.
    Да еще и быстро ли это будет? Ведь если каждая новость будет состоять в трёх категориях, то в таблице будет значений в 3 раза больше чем новостей.

Больше вариантов не придумал, сейчас выбираю между вторым и третьим.
Пойду попробую скорость потестировать чтоль.

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
vagrand
Третий способ но немного модифицированный. В этой табличке при добавлении новости сохраняйте для нее связь со всей веткой категорий. В таком случае вы сможете сделать быстрой джойн при выборе любой категории.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
kaww
Arh, посмотри как можно хранить иерархические структуры данных в реляционных БД. есть несколько способов. Они избавят от необходимости рекурсивных запросов (что само по себе очень плохо) да и вообще упростят доступ к данным и их изменение.
Вот, например, http://www.getinfo.ru/article610.html
Arh
Цитата (vagrand @ 23.09.2013 - 09:31)
Третий способ но немного модифицированный. В этой табличке при добавлении новости сохраняйте для нее связь со всей веткой категорий. В таком случае вы сможете сделать быстрой джойн при выборе любой категории.

Это то про что написал kaww ?

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Arh
Цитата (kaww @ 23.09.2013 - 09:35)
Arh, посмотри как можно хранить иерархические структуры данных в реляционных БД. есть несколько способов. Они избавят от необходимости рекурсивных запросов (что само по себе очень плохо) да и вообще упростят доступ к данным и их изменение.
Вот, например, http://www.getinfo.ru/article610.html

Спасибо, пойду ломать мозг =)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
vagrand
Arh
Цитата
Это то про что написал kaww ?


Нет, это разные методы и тот, что описал я проще и работает лучше + к тому kaww не понял сути вашего вопроса. Он дал ссылку на статью где описано как хранить дерево, а вам нужно привязать новость к существующему дереву и ради этого его не нужно перестраивать.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
Arh
Цитата (vagrand @ 23.09.2013 - 10:06)
Arh
Цитата
Это то про что написал kaww ?


Нет, это разные методы и тот, что описал я проще и работает лучше + к тому kaww не понял сути вашего вопроса. Он дал ссылку на статью где описано как хранить дерево, а вам нужно привязать новость к существующему дереву и ради этого его не нужно перестраивать.

Да, я почитал что скинул kaww, это немного другое и таким способом нельзя будет новость раскидать по разным веткам, только вложенность.

Но что значит "сохраняйте для нее связь со всей веткой категорий"?
То есть к полям news_id , cat_id добавить что то вроде id ветки?


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
vagrand
Arh
Цитата
Но что значит "сохраняйте для нее связь со всей веткой категорий"?
То есть к полям news_id , cat_id добавить что то вроде id ветки?


Нет, в этой отдельной таблице,назовем ее для примера news_caterories вы создаете два поля news_id и category_id. И для каждого уникального news_id вы сохраните id той категории, в которой она непосредственно находится и id всех родителей этой категории. Другими словами у вас получится связь один ко многим, одна новость, много категорий.
И в этом случае, когда вы выберите какую-то конкретную категорию вы сможете из этой таблицы узнать все ее новости, без разницы к каким подкатегориям этой категории они были привязаны.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
Arh
Цитата (vagrand @ 23.09.2013 - 10:30)
Arh
Цитата
Но что значит "сохраняйте для нее связь со всей веткой категорий"?
То есть к полям news_id , cat_id добавить что то вроде id ветки?


Нет, в этой отдельной таблице,назовем ее для примера news_caterories вы создаете два поля news_id и category_id. И для каждого уникального news_id вы сохраните id той категории, в которой она непосредственно находится и id всех родителей этой категории. Другими словами у вас получится связь один ко многим, одна новость, много категорий.
И в этом случае, когда вы выберите какую-то конкретную категорию вы сможете из этой таблицы узнать все ее новости, без разницы к каким подкатегориям этой категории они были привязаны.

Чувствую себя каким то идиотом)

Цитата
И для каждого уникального news_id вы сохраните id той категории, в которой она непосредственно находится и id всех родителей этой категории.


Это в той же news_caterories?

Зачем сохранять родителей?

Цитата
Другими словами у вас получится связь один ко многим, одна новость, много категорий.


Я же это описал в 3 пункте, не пойму зачем эта модификация с id всех родителей?
И куда писать всех родителей ? Через запятую что ли?

Начнём сначала))
Вот к примеру супер дизайнерская и юзабильная админка
user posted image

Вот так это выглядит в базе. Мы добавили одну новость трём разным категориям.
user posted image

что тут модифицируем дальше?)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
vagrand
Arh
Цитата
что тут модифицируем дальше?)


Ничего не надо модифицировать, это как раз то что я пытался вам сказать.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
Быстрый ответ:

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