Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Реализация тегов на сайте


Автор: Igor_K 10.8.2008, 22:29
Добрый день уважаемые пользователи!

Создал эту тему, потому что моих знаний не хватает, и мне нужна теория.

Я хочу реализовать теги на сайта. Пример: юзер пишет пост, и записует теги через запятую (комп,мышка,клава,монитор - например). И вот я не очень понимаю как их обработать и записать в таблицу тегов. Или я не так себе представляю как это должно выглядеть.

Я думал сделать так:
Например в таблице тегов хранится данные
id - идентификатор тега
name - название тега
count - число общих встреч тега (то есть сколько раз его вписали)

Вопрос: поле name нужно делать индексированным?


Значит так. Сервер получает строку тегов, потом нужно найти есть ли введенные пользователям теги в таблице тегов, и если есть, то прибавить к найденному тегу, к полю count,  единицу.
Ну найти я думаю WHERE name IN (комп,мышка,клава,монитор)  - или както по другому?
А как потом добавить единицу к найденным тегам? Это ж получается за каждый тег - запрос. А если введет 50 тегов, то и получается 50 запросов. Или можно както реализовать по другому?
Может
Код

UPDATE table_tag SET count = count + 1 WHERE id = (SELECT id FROM table_tag WHERE name IN (комп,мышка,клава,монитор))

или это неправильный запрос? Я в SQL не очень шарю :(

Или это все неправильно и нужно делать по другому? Выслушаю любую точку зрения и любые ссылки на информацию для этого.

А как поиск по тегам... smile 
Получается искать в таблице тегов, получить найденные идентификаторы тегов. И потом сделать запрос в таблицу постов в поле, где хранятся идентификаторы написанных тегов. Но в поле идентификаторов тегов в таблице постов идешники тегов хранятся в виде: 1,12,321,59. То есть как запрос делать с найденными тегами? WHERE tags_id IN (найденные идентификаторы через запятую) - такой же запрос не подходит.
Или хранить название тегов через запятую в таблице постов?
Или можно хранить идешники постов в поле таблицы с тегами, где к каждому тегу пишется идентификаторы постов через запятую, где встречается этот тег.

Я вообще в непонятках smile 
Помогите советом пожалуйста!
Спасибо!

Автор: HackMan 10.8.2008, 22:31
похожая проблема: http://forum.vingrad.ru/forum/topic-223630/kw-%D0%B1%D0%B0%D0%B7%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D0%B0%D0%BC.html

Автор: skyboy 10.8.2008, 22:40
Igor_K, твои проблемы решило бы использование конструкции inner join. несмотря на то, что в общем случае количество запросов не определяет ни производительность, ни надежность.

Автор: Igor_K 10.8.2008, 22:40
HackMan, спасибо! Щяс почитаем) smile

Добавлено через 3 минуты и 53 секунды
Цитата(skyboy @  10.8.2008,  22:40 Найти цитируемый пост)
Igor_K, твои проблемы решило бы использование конструкции inner join. несмотря на то, что в общем случае количество запросов не определяет ни производительность, ни надежность. 

спасибо. Почитаю про inner join, я с ним никогда не работал.
Я хочу максимально уменьшить нагрузку. Наверно буду делать через третюю таблицу, как описано тут: http://forum.vingrad.ru/index.php?showtopic=223630&view=findpost&p=1605720

Автор: Igor_K 10.8.2008, 23:03
В топике про филмы структура таблиц такая:
Цитата

Таблица "films" (Фильмы)
id - код
name - название
year - годвыпуска
description - описание
Таблица "genres" (Жанры)
id - код
name - наименование жанра
Таблица "filmgenrelinks" (Связи жанров с фильмами)
id - код
filmid - код фильма, связан с films.id
genreid - код жанра фильма, связан с genres.id


У меня она получается набуває такого вида:
Цитата

Таблица post - таблица постов
id - идентификатор
text - текст поста

Таблица tags - таблица тегов
id - идентификатор тега
title - название тега

Таблица tag2 Связи тегов с постами
postid - код фильма, связан с post.id
tagid - код жанра фильма, связан с tags.id 


У меня есть просьба к добрым людям. Скажите пожалуйста в каких полях нужно ставить индексы, где какие ключи ставить. Я вообще нубас в этом.

С учетом что будет поиск по тегам.

Автор: HackMan 10.8.2008, 23:19
Сейчас нет времени искать ссылки или объяснять. Поищи в нете про "реляционные базы данных", "первичные ключи", "внешние ключи", "нормализацию", "индексы"

Автор: Igor_K 11.8.2008, 09:34
С первычными ключами все понятно. Инжекс думаю нужно поставить на название тега. А от с обычными ключами не ясно. На каких полях ставить?

Автор: HackMan 11.8.2008, 09:44
Имеешь в виду "внешние ключи"? Их надо ставить на поля, которыми связываешь одну таблицу с другой. В твоём случае это будут postid и tagid

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

Цитата(Igor_K @  11.8.2008,  09:34 Найти цитируемый пост)
Инжекс думаю нужно поставить на название тега

Индекс - это упорядоченный указатель на записи в таблице. Единственное для чего они нужны - это для ускорения поиска записи по её индексированному полю. Следует понимать, что индекс не является частью таблицы. Эт отдельный объект, который связан с таблицей и другими объектами БД. Так что индекс вешай на те поля, которые будут использоваться для условия отбора (в хвостике WHERE).

Автор: Igor_K 11.8.2008, 10:17
HackMan, спасибо за ответ. smile 

Индекс на название тега я хочу поставить потому что у меня будет поиск по названию тега.

Автор: HackMan 11.8.2008, 10:19
На строковой тип данных есть особенность, надо указать, на сколько символов делать индекс. Чем больше укажешь - тем быстрее будет "искаться" и тем больше будет уходить памяти

Подробнее - в мануале, я спать хочу  smile 

Автор: Igor_K 11.8.2008, 12:42
HackMan, спасибо за ответ еще раз! smile 
3 символов для индекса тегов думаю хватит. спасибо!

Спокойного сна!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)