@smallreg

Как реализовать в MySQL топики форума, которые участвуют сразу в нескольких разделах?

Обычно каждая новая тема (топик) на форуме относится к одному разделу форума. Но иногда необходимо добавить несколько тегов, чтобы по ним можно было искать эту тему на форуме. Чтобы не вводить дополнительную сущность - теги - хочется реализовать возможность создавать тему сразу в нескольких разделах (сам интерфейс добавления разделов при создании темы пока не важен). Фактически тут теговая система получается, но в отличие от тегов, все разделы заранее известны - новые не добавляются пользователем, а также раздел будет всегда (тегов иногда может не быть). Вопрос такой: можно ли использовать какую-то иную структуры таблицы, чтобы не делать список тегов и таблицу где прописывается соотетветствие темы (топика) каждому тегу? То есть все уложить в одну таблицу, а не в три? Мне почему-то кажется, что 'поиск Fulltext' должен подойти для такой задачи, либо что-то подобное, так как в одном поле таблицы можно просто добавлять обозначения раздела: численное или текстовое, например через запятую или пробел. Нужно, чтобы можно было быстро находить все темы (топики) для одного заданного раздела (искать тему, которая относится сразу к двум и более разделам не нужно).
Как такое реализовать максимально просто? Какую структуру таблицы использовать?
  • Вопрос задан
  • 114 просмотров
Пригласить эксперта
Ответы на вопрос 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Мне почему-то кажется, что 'поиск Fulltext' должен подойти для такой задачи,
Вам кажется. Кроме того что фуллтекст вообще не для этого, он еще и работать будет относительно медленно, так как вариативность значений будет низкая. Про "удобство" работы со строкой вместо нормального индекса вообще молчу.

Нужно, чтобы можно было быстро находить все темы (топики) для одного заданного раздела (искать тему, которая относится сразу к двум и более разделам не нужно).
м2м, это надежно и быстро, достаточно знать индекс раздела.

Как такое реализовать максимально просто?
Совет: Не гонитесь за кажущейся простотой, вы хапнете гораздо больше гемора от неправильной архитектуры, нежели от еще 15 минут, потраченных на создание таблицы справочника, пивот таблицы и написания 2 джоинов в запросе. Важнее сделать правильно, а не проще.
Ответ написан
solotony
@solotony
покоряю пик Балмера
если количество разделов постоянное и небольшое (т.е не будет проблем с индексами) то можете для каждого раздела завести отдельное BOOL поле в таблице

но это конечно изврат и единственное нормальное решение - это M2M (использование таблицы).

а Fulltext по своей сути это такое-же создание M2M индекса, только скрытое с недрах mysql
Ответ написан
@grek_cheburek
Программист самоучка
Когда-то я делал так. В таблицу добавлял поле, в которое помещал id в md5. Далее, когда пользователь отмечает какие ему нужно категории и в топик вписывал этот md5 разделенный вертикальной чертой. На странице самого топика я брал поле, в котором хранился md5 и через explode разделял и подготавливал запрос, чтобы вывести категории. Такую систему я применял для блогов и фотоальбомав на сайте. Но сайт маленький был, то есть не с такой аудиторией как вк. Так что за скорость работы такого подхода я ничего не могу сказать, лично меня он устраивал.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы