ФорумПрограммированиеPHP для идиотов → Теги и их запись в БД

Теги и их запись в БД

  • Z-MODe

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 21 июля 2008 г. 15:53

    Доброй ночи ;)
    "Теги" получили очень большую популярность, но как их лучше всего реализовать.
    Как я думаю, но уверен что можно и нужно как то подругому ;)
    добустим таблица
    topic
    id
    title
    text
    date
    tags
    Вопрос как раз таки состоит в том, каков самый оптимыльный вариант записи этих тегов?
    Если просто через запятую - то встаёт вопрос как извлекать записи имея на входе только один тег(а к записи их например 15)

    ну вот впринципе и всё, как правильно хранить эти теги?


  • sap

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 21 июля 2008 г. 16:09, спустя 15 минут 7 секунд

    Я считаю, что для тегов должна быть отдельная таблица.
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 21 июля 2008 г. 16:17, спустя 8 минут 32 секунды

    Z-MODe, теги хранить в поле `tags` через запятую (твоя текущая вариация таблицы), плюс дополнительно запихивать в две таблицы `tags_tbl` (`tag_id`, `tag_name`, `tag_count`) - тут хранятся все теги и `tags_post_tbl` (`post_id`, `tag_id`) - связная таблица ПОСТ -> ТЕГ (и наоборот)…

    И вообще, это смотря что ты с ними потом хочешь делать в итоге.
    adw/0
  • Z-MODe

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 21 июля 2008 г. 16:18, спустя 1 минуту 5 секунд


    Я считаю, что для тегов должна быть отдельная таблица.

    Хмм.. тоже дело, почему бы и нет, но суть в том же, если тегов к записи больше одного, как его туда записывать, тут я так понимаю измениться только размер строки и надо вместо текста будет ставить теже ID тегов..
    а забыл уточнить, как это сделать в один запрос?
  • Z-MODe

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 21 июля 2008 г. 16:21, спустя 2 минуты 22 секунды

    adw0rd, хмм.. tags_tbl понятно для чего, а смысл в таблице tags_post_tbl не доконца понятен.
    И как всё таки же извлекать нужную запись по тегу, в один запрос?
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 21 июля 2008 г. 16:21, спустя 7 секунд

    Поле `tags` твоей первой вариации таблицы предназначено для хранения отформатированных тегов. Типа кэш. При изменении тегов поста можно заново перебирать и форматировать в этот "кэш".
    adw/0
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 21 июля 2008 г. 16:24, спустя 3 минуты 36 секунд

    И как всё таки же извлекать нужную запись по тегу, в один запрос?

    не запись, а записи… записи с ID этого тега.

    select `post_id` from `tags_post_tbl` where `tag_id` = $tagId


    ну а дальше джойни свои титлы и тексты.
    adw/0
  • Z-MODe

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 21 июля 2008 г. 16:37, спустя 12 минут 51 секунду

    аааа… вон оно как т.е. полный вид запроса будет выглядеть как то так?
    select a.*,b.*,c.* from tags_tbl AS a, tags_post_tbl AS b,topic AS c where a.tag_name=$tagName AND b.tag_id=a.tag_id AND c.id=b.post_id

    Эт правильно? у меня извлечётся список записей по тегу(имени), тобишь на входе есть только $tagName надо получить список записей=)
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 21 июля 2008 г. 16:43, спустя 5 минут 39 секунд

    Z-MODe, что-то наподобие, только у тебя кросс джоин, заюзай лефт джоин. Оптимизируй запрос.
    adw/0
  • Z-MODe

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 21 июля 2008 г. 16:46, спустя 2 минуты 49 секунд

    adw0rd, О! пошёл гуглить=)
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 21 июля 2008 г. 16:48, спустя 2 минуты 32 секунды

    Зачем гуглить сразу?)) Почитай лучше это: http://www.mysql.ru/search/?b=1&terms=JOIN
    adw/0
  • Z-MODe

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 21 июля 2008 г. 17:05, спустя 17 минут 20 секунд

    =( чё то ничего непонял с этими джойнами и как они работают..

    SELECT * FROM tags_tbl AS a LEFT JOIN (a.tag_name = $tagName) LEFT JOIN tags_post_tbl AS b (b.tag_id = a.tag_id) LEFT JOIN topic AS c (c.id = b.post_id)

    чую в запросе чушь полная=( поправте плиз..

    P.s. это же и нагуглил=))

  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 21 июля 2008 г. 17:22, спустя 16 минут 15 секунд

    Z-MODe, плохо гуглишь, http://www.mysql.ru/docs/man/LEFT_JOIN_optimisation.html , заметь твой синтаксис отличается отсутствием оператора ON, и лефт_джойнить надо таблицу, а не выражение в скобках ;)

    Не выкладываю я тебе готовый запрос, лишь потому, что лучше помУчиться немного, зато станет потом легче. И совет, заюзай для составления запросов - консоль, удобнее чем в пых писать все время :)
    adw/0
  • Z-MODe

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 21 июля 2008 г. 17:49, спустя 27 минут 21 секунду

    adw0rd, Cпс большое, за советы, но в данный момент нету задачи, поэтому это всё только на бумажке и только в теории=( завтра может быть залезу в ПМА.. не понятен до конца оператор ON
    как я понял таблица С(topic) зависит от B(tags_post_tbl), которая зависит от A(tags_tbl)
    и у меня получается вот такой вота запрос
    SELECT * FROM a LEFT JOIN b(b.tag_id = a.tag_id) LEFT JOIN c(c.id = b.post_id) WHERE a.tag_name = $tagName

    Если не правильно то завтра посижу с консолью, и объясни плиз зачем ON нужен?
  • md5

    Сообщения: 11951 Репутация: N Группа: в ухо

    Spritz 21 июля 2008 г. 22:21, спустя 4 часа 31 минуту 57 секунд

    у меня реализовано как сказал adw0rd

    таблицы:
    tags:
    id, tag, count

    tag — текстовое, сам тэг
    count — вес тэга (сколько раз он повторяется), активно используется для тучи тэгов

    topics-tags:
    id, topic_id, tag_id

    так называемая таблица соответствий, какой тэг (его id) соответствует какой статье, активно используется для поиска по тегам

    ну и таблица с самими статьями
    но в этой же таблице храним через запятую весь набор тэгов



    выборки по тэгам

    SELECT T.*
    FROM `topics` AS T
    JOIN `topics-tags` AS TT
    ON T.`id`=TT.`topic_id`
    JOIN `tags` AS TA
    ON TT.`tag_id`=TA.`id`
    WHERE TA.`tag`='{$tag}'


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

Пожалуйста, авторизуйтесь, чтобы написать комментарий!