Форум → Программирование → PHP для идиотов → Теги и их запись в БД
Теги и их запись в БД
Страницы: ← Следующая страница →
-
Доброй ночи ;)
"Теги" получили очень большую популярность, но как их лучше всего реализовать.
Как я думаю, но уверен что можно и нужно как то подругому ;)
добустим таблица
topic
id
title
text
date
tags
Вопрос как раз таки состоит в том, каков самый оптимыльный вариант записи этих тегов?
Если просто через запятую - то встаёт вопрос как извлекать записи имея на входе только один тег(а к записи их например 15)
ну вот впринципе и всё, как правильно хранить эти теги? -
22 июля 2008 г. 0:09, спустя 15 минут 7 секунд
Я считаю, что для тегов должна быть отдельная таблица. -
22 июля 2008 г. 0:17, спустя 8 минут 32 секунды
Z-MODe, теги хранить в поле `tags` через запятую (твоя текущая вариация таблицы), плюс дополнительно запихивать в две таблицы `tags_tbl` (`tag_id`, `tag_name`, `tag_count`) - тут хранятся все теги и `tags_post_tbl` (`post_id`, `tag_id`) - связная таблица ПОСТ -> ТЕГ (и наоборот)…
И вообще, это смотря что ты с ними потом хочешь делать в итоге.https://smappi.org/ - платформа по созданию API на все случаи жизни -
22 июля 2008 г. 0:18, спустя 1 минуту 5 секунд
Я считаю, что для тегов должна быть отдельная таблица.
Хмм.. тоже дело, почему бы и нет, но суть в том же, если тегов к записи больше одного, как его туда записывать, тут я так понимаю измениться только размер строки и надо вместо текста будет ставить теже ID тегов..
а забыл уточнить, как это сделать в один запрос? -
22 июля 2008 г. 0:21, спустя 2 минуты 22 секунды
adw0rd, хмм.. tags_tbl понятно для чего, а смысл в таблице tags_post_tbl не доконца понятен.
И как всё таки же извлекать нужную запись по тегу, в один запрос? -
22 июля 2008 г. 0:21, спустя 7 секунд
Поле `tags` твоей первой вариации таблицы предназначено для хранения отформатированных тегов. Типа кэш. При изменении тегов поста можно заново перебирать и форматировать в этот "кэш".https://smappi.org/ - платформа по созданию API на все случаи жизни -
22 июля 2008 г. 0:24, спустя 3 минуты 36 секунд
И как всё таки же извлекать нужную запись по тегу, в один запрос?
не запись, а записи… записи с ID этого тега.select `post_id` from `tags_post_tbl` where `tag_id` = $tagId
ну а дальше джойни свои титлы и тексты.https://smappi.org/ - платформа по созданию API на все случаи жизни -
22 июля 2008 г. 0: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 надо получить список записей=) -
22 июля 2008 г. 0:43, спустя 5 минут 39 секунд
Z-MODe, что-то наподобие, только у тебя кросс джоин, заюзай лефт джоин. Оптимизируй запрос.https://smappi.org/ - платформа по созданию API на все случаи жизни -
-
22 июля 2008 г. 0:48, спустя 2 минуты 32 секунды
Зачем гуглить сразу?)) Почитай лучше это: http://www.mysql.ru/search/?b=1&terms=JOINhttps://smappi.org/ - платформа по созданию API на все случаи жизни -
22 июля 2008 г. 1: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. это же и нагуглил=)) -
22 июля 2008 г. 1:22, спустя 16 минут 15 секунд
Z-MODe, плохо гуглишь, http://www.mysql.ru/docs/man/LEFT_JOIN_optimisation.html , заметь твой синтаксис отличается отсутствием оператора ON, и лефт_джойнить надо таблицу, а не выражение в скобках ;)
Не выкладываю я тебе готовый запрос, лишь потому, что лучше помУчиться немного, зато станет потом легче. И совет, заюзай для составления запросов - консоль, удобнее чем в пых писать все время :)https://smappi.org/ - платформа по созданию API на все случаи жизни -
22 июля 2008 г. 1: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 нужен? -
22 июля 2008 г. 6: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}'
вот, ну это простой случай
гораздо более сложные запросы идут в случае, если надо доставать инфо о блоге, в котором статья + некоторые пар-ры связанные с авторизованностью, например, добавлена ли статья в избранное и т.д.все умрут, а я изумруд
Страницы: ← Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!