Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток.
Есть проектик, основной контент - трехстрочные текстики по ~150 символов. Таковых порядка 100тыс., для каждого из них есть тэги (от 1 до 5 тэгов). Разных тэгов около 7тыс.
Сейчас нужно реализовать функционал выборки текстов по тэгу.
Как работает на пальцах: при клике на тэг вызывается .php скрипт, в котором делается mysql выборка 10 текстов по тэгу.
Вопрос: как правильнее организовать таблицы?
Думается мне примерно так: id - text - tag1 - tag2 - tag3 - tag4 -tag5 для каждого текста.
Как в этом случае делать SELECT, ведь один и тот же тэг в разных строках может быть в разных столбцах?
Или я в корне не правильно мыслю и нужно как-то по-другому?
Спасибо за внимание!
Отредактированно slipkahh (13.04.2012 15:46:51)
Неактивен
Две таблицы:
id - text
и
tag - id_из_первой_таблицы
Тогда по номеру тега вы из второй таблицы выбираете нужные вам id, и для данных id выбираете из первой таблицы тексты.
Неактивен
Спасибо за ответ.
Вы советуете сделать вторую таблицу вида (id - tag_name - s_id), где s_id указывает на строку в первой таблице. Так? Но тогда возникает 2 момента.
1) При 100.000 записей в первой таблице будет до 500.000 записей во второй, ибо на каждый текст приходится до 5 тэгов. Надо будет резать на несколько таблиц или mysql справится без напрягов?
2) В скрипт передается id тэга, этому id соответствует лишь одно значение s_id.
Т.е. максимум, что я получу - это один текст. Мне же нужны все.
Как правильно выйти из этой ситуации? Перейти к виду таблицы ( tag_name - s_id ) и передавать в скрипт не id тэга, а его его имя? Запрос примерно такой будет:
Неактивен
slipkahh написал:
Спасибо за ответ.
Вы советуете сделать вторую таблицу вида (id - tag_name - s_id), где s_id указывает на строку в первой таблице. Так?
id лишний.
slipkahh написал:
1) При 100.000 записей в первой таблице будет до 500.000 записей во второй, ибо на каждый текст приходится до 5 тэгов. Надо будет резать на несколько таблиц или mysql справится без напрягов?
Не надо резать.
slipkahh написал:
2) В скрипт передается id тэга, этому id соответствует лишь одно значение s_id.
Т.е. максимум, что я получу - это один текст. Мне же нужны все.
Как правильно выйти из этой ситуации? Перейти к виду таблицы ( tag_name - s_id ) и передавать в скрипт не id тэга, а его его имя?
Сделать вторую таблицу вида (tag_id, s_id). В этом случае по заданному tad_id вы найдете набор s_id
select набор_нужных_полей from TEXT_TABLE t1 join TAG_TABLE t2 on t1.id=t2.s_id where tag_id=переданное_в_скрипит_значение;
Обратите внимание:
1. Писать подзапрос в in (как в вашем примере) очень плохая мысль, так как он будет выполняться для каждой строки основного запроса.
2. Не стоит писать *, явно перечисляйте нужные поля.
Неактивен
Выручили, спасибо!
Неактивен
vasya, мне снова нужен ваш совет. С предыдущим всё не так гладко.
Есть как выборка текстов по тэгу, так тэгов по тексту.*
Если на пальцах, то использование такое: при выводе текста на страницу выводятся и связанные с ним тэги (от 1 до 5), а при клике на тэг выбираются тексты, содержащие этот тэг. Текстов, соответствующих выбранному тэгу, может быть довольно много.
При такой выборке 10 текстов:
Неактивен
slipkahh написал:
*В таблицу TAG_TABLE пришлось добавить столбец tag_id, т.к. tag_name и s_id могут повторяться, и, соотв., не могут быть PRIMARY KEY.
В моем примере таблица TAG_TABLE имеет (tag_id, s_id)
Поиск тегов по тексту:
select набор_нужных_полей from TAG_TABLE where s_id=id_текста_по_которому_ищем_теги;
или
select набор_нужных_полей from TEXT_TABLE t1 join TAG_TABLE t2 on t1.id=t2.s_id where t1.`text`='текст_по_которому_ищем_теги';
Неактивен