Как оптимально реализовать теги к статье?

Есть модуль статьи. И у каждой статьи будут свои теги (как аналог категорий), хочу узнать ваши советы к следующему моменту.

Для выбора тегов я использую input поле, куда подгружаются сами теги (как jquery ui плагин), и на сервер приходит вот такая строка:

Друзья, Любовь, Семья, Природа

Далее я преобразую эту строку в массив с помощью explode и проверяю каждый тег на его существование. Если, собственно, строка содержит неизвестный тег, кидаем исключение, если все хорошо - собираем новую строку но уже с id.

1,2,3,4

Эта строка улетает в базу в поле tags.

Далее, например, нужно просмотреть все статьи, которые содержат тег Семья (ну, например, все теги с id 3).
Тут нужно использовать like поиск с регуляркой (чтобы если есть тег id1 и тег id11, выбрать нужный)?

Вообще, суть вопроса, так ли эти теги делать, или есть более изящный способ?
  • Вопрос задан
  • 4553 просмотра
Решения вопроса 3
Тут лучше использовать таблицу-коммутатор с полями вида:

artcile_id | tag_id

И отдельную таблицу-справочник для тэгов. Ну и выборки делать при помощи JOINов.
Ответ написан
Комментировать
copist
@copist
Empower people to give
b57a59f53f7d4a85aa7d90e747781777.png

Предлагаю таблицы article + tag + article_tag
article - статьи
tag - метки
article_tag - метки статей

+ в таблице article в поле tags хранить список тегов в виде текста, чтобы не делать лишний join при выводе всех тегов статьи

Да, нарушение нормальной формы и избыточность, но опыт показывает, что это быстрее
Ответ написан
Комментировать
@daMage
Если тегов не много можно создать отдельную таблицу с двумя полями: айди статьи и айди тега. Если всё же решите использовать LIKE, то учтите, что запрос LIKE 1 также вернет запись с tags: 11, 111, 121. Так что тут нужно использовать какие-то смежные символы, например писать не LIKE 1, а LIKE ",1,", оборачивая запятыми. Но опять же, лучше создать отдельную бд и join'ами делать запрос.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы