Эффективный алгоритм работы для посторения облака тэгов php/mysql.

popeye

Новичок
Эффективный алгоритм работы для посторения облака тэгов php/mysql.

Добрый день!
подскажите как сделать наиболее быстрое создание и поиск по облаку тэгов на записи.

Предположим есть большая таблица с именами (и тэги к ним).

Роман (Москва, Студент, Рыжий)
Николай (Борода, Кареглазый)
Иван (Урод, Кидалово, Гей)

Как видите тэгов может быть много и они абсолютно разные.
Нужно выполнять по базе поиск по данным тэгам.

Вынести тэги в отдельную таблицу и джоинить её некатит - слишком долгая операция.
Сделать это поле как SET тоже не катит т.к. у SET ограничение на 64 разных тэга. А это поле по сути бесконечно возможный SET
Пока выручает что тэги пишутся в проиндексированное текстовое поле и поиск ведётся так - SELECT * WHERE `tag` LIKE '%Борода%' OR `tag` LIKE '%Студент%'
возможно есть какое-то более красивое решение задачи?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Зачем в запросе OR? У тебя одновременно может быть запрос более чем к одному тэгу? Почему джоинить не катит? Обоснуй
 

popeye

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

Джоинить не катит т.к. придётся все тэги вынести в отдельную таблицу и сделать привязку по id.
Таблица с тэгами получится гораздо больше и без того огромной таблицы с именами и поиск просто будет сильно тормозить..

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

prolis

Новичок
Теперь обоснуй причину тормозов поиска по отдельной таблице
 

Adelf

Administrator
Команда форума
popeye
Проиндексированные чиселки оочень шустрые. Они гораздо шустрее строк в каком-бы то ни было виде.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ок, тебе надо найти сущности, у которых есть один из 3х тэгов.
Ты выносишь тэги в отдельную таблицу, делаешь связку, сущность-тэг, где не может быть повторений id_сущности-id_тэга. Тэги ты ищешь по индексу, джоинишь таблицы по индексу.

Не убедил на счет тормозов. А нахрена тебе фуллтекст на тэгах, тут даже like не нужен.
 

Gas

может по одной?
будет сильно тормозить
здесь же програмистский форум, инженерный практически и такие обывательские оценки: сильно тормозить, огромные таблицы. Mysql спокойно может очень быстро джойнить многомиллионные таблицы при правильных индексах и селективном условии.

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


Система скорее похожа на сопостовление свойств (одних тэгов) к правилам (другим тэгам)
если объёмы действительно большие и нужно что-то типа нахождения наиболее похожих объектов для всего перечня объектов, то я бы хранение тегов сделал всё-таки many-to-many, а вот для такого поиска sphinx пробовал бы.
 
Сверху