Организация тегов: Алгоритмы организации тэгов / Хабр

Содержание

Алгоритмы организации тэгов / Хабр

enartemy

Разработка веб-сайтов *

Тэги – неотъемлемая часть всех современных сайтов и косвенный признак принадлежности сайта к пресловутому Вэб-Два-Ноль.

В статье я хочу рассказать об способах и алгоритмах тегирования информации.


Итак, при организации тэгов существует несколько слабых и узких мест, а именно:

  • добавление и изменение принадлежности тэгов к объекту.
  • создание и изменение самих тэгов.
  • отображение тэгов на старице.
  • поиск по тэгам.
  • назначение алиасов тега
  • построение облака тегов


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

Нормальное соотношение многое-ко-многим.


Существует огромная таблица с тэгами, существуют огромные таблицы с тегируемой информацией. Связь между ними осуществляется через третью таблицу, которая получается очень большого размера. Так, если статей у нас 50000, а тэгов 10000, при условии что каждая статья в среднем связана с 4-мя тэгами, получаем размер таблицы в 200000.

Плюсы:

  • нет проблем с построением облака тэгов
  • нет проблем с алиасами.
  • нет проблем с созданием и изменением тэгов
  • нет проблем с «выпадающим списком тэгов»

Минусы:

  • добавление и изменение принадлежности тэгов к объекту затрудненно, поскольку требуется отдельный INSERT или DELETE на каждую изменяемую связь. Еще нужен INSERT при создании тэга. Если некоторые тэги в единственном числе (что часто бывает), то они будут оттягивать на себя ресурсы (увеличивая размеры таблиц), не неся при этом почти никакой практической пользы.
  • получение и отображение тэгов требует JOIN-объединение 3-х огромных таблиц. Из примера выше: таблица в 50000 join таблица 200000 join таблица 10000. Это будет работать медленно уже с этими данными. Учитывая то, что реально требуется сделать join еще 2-3 большие таблицы (например, таблицу пользоватлей и таблицу рейтинга), получается совсем не радужная картина. Да, я в курсе, что можно кэшировать, но сейчас не об этом.
  • поиск по тэгам требует опять объединения больших таблиц

С помощью полнотекстового поиска


Алгоритм приведен в моей статье «Полнотекстовый поиск и его возможности»

Теперь о том, как это делается непосредственно по отношению к тэгам. В поле с полнотекстовым индексом лежат сами тэги в том виде, как они были записаны. Выборка объектов происходит исключительно по этому полю. Исходя из этого же поля строится принадлежность объекта к тэгам. Это означает, что если тэг русский, то и ссылка на него должна содержать русские буквы. А с этим возникают проблемы, т.к. они могут кодироваться c помощью urlencode, а это зависит уже от кодировки. Т.е. один и тот же тэг в зависимости от того, в какой кодировки страница, должен быть декодирован по-разному. Можно конечно использовать транслит русских слов в английские, и в писать их в поле наряду с русским словами. Тогда тэг будет отображаться на русском, а ссылка на него будет в латинице, и поиск будет идти тоже в латинице. Плохой выход, но выход.

Плюсы:

  • нет проблем с выводом тэгов
  • нет проблем с поиском по тэгам
  • нет проблем добавлением и изменением принадлежности тэгов к объекту
  • нет проблем с алиасами (точнее есть, но они решаемы)
  • отпадает проблема создания тэга
  • легко можно делать поиск не по одному, а по нескольким тэгам, а так же вычислять похожие материалы

Минусы:

  • переименовать или удалить тэг просто так не получится, это требуется в полях всех объектов, которыми назначены тэги
  • с построением облака тегов очень большие проблемы. Можно решить так: обрабатываются все «тэговые» поля таблиц, анализируется частота присутствия отдельного тэга (эх, был бы доступ непосредственно к самому полнотекстовому индексу, как было бы хорошо) и на фоне этого строится облако. После чего кэшируется на длительный промежуток времени.
  • сложно сделать «выпадающий список тэгов»

Как вариант, совмещение того и другого метода. То есть поиск по полнотекстовому индексу, а частоты использования и сами тэги в отдельной таблице. Ну, или вариации на эту же тему. Это решает проблемы с выпадающим списком и облаком, но создает сложности при выводе, добавлении и создании тегов.

Если кто-то знает еще варианты организации – будет интересно о них узнать. Конструктивная критика приветствуется.

Теги:

  • тэги
  • облако тегов
  • разработка
  • веб разработка
  • алгоритмы
  • полнотекстовый поиск

Хабы:

  • Разработка веб-сайтов

Всего голосов 42: ↑39 и ↓3 +36

Просмотры

25K

Комментарии
48

Артемий
@enartemy

Пользователь

Комментарии
Комментарии 48

теги — Организация тегов в бд и запросах


Вопрос задан


Изменён
10 лет 2 месяца назад


Просмотрен
8k раза

Доброго всем времени суток господа

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

Вопрос раз: как хранить теги в бд правильно? в одной ячейке через запятые?

Вопрос два: (исходя из первого ответа) приведите пример запроса к таблице, с поиском определенного тега?

  • теги
  • php
  • база-данных
  • mysql

WordPress называет теги, категории и пр. способы группировки постов волшебным словом Таксономия. Идея такая: посты отдельно, примочки отдельно. Как минимум две доп. таблицы: Теги и Связи.

В Тегах описываете каждый уникальный тег.

tag_id    tag_title    tag_count

В Связях записываете отношения Поста с Тегом:

post_id    tag_id






2

Ну хранить можно и через запятую в одном поле.

Есть вариант хранить для каждой записи отдельную строку для данного тега, но тут тогда много записей в БД, но если их сделать INDEX то выборка будет быстрее (работа с числами).

т.е.
есть у нас запись с ID 3 а в БД будет написано для первого и второго случая так

Первый 1 запись

ID | ID_REC | TAGS
  1|    1   |  1,2,3,4,5,6,7,8

Второй много записей

ID | ID_REC | TAGS
 1 |   1    | 1
 2 |   1    | 2
 3 |   1    | 1
 4 |   1    | 2
 5 |   1    | 1    
 6 |   1    | 2
 7 |   1    | 1
 8 |   1    | 2

Ну вот так. Можно хранить сериализованным массивом, но не пользовался ни разу таким способом.

Второй будет скорее всего быстрее по поиску и обновлению информации т.к. добавить к записи тег будет просто INSERT ну а удалить DELETE т.е. не нужно делать select а потом update






4







Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации


Почта

Необходима, но никому не показывается





Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки


Присоединяйтесь к TAG! — TAG Online

Обеспечьте каталитические связи и мосты к возможностям роста для технологического сообщества

Продвигайте политики, программы и инициативы, которые способствуют развитию бизнеса, наших членов и технологической экосистемы Грузии

Активизируйте, продвигайте и обучайте современных звезд технологий и технологические лидеры будущего

TAG предлагает варианты членства для частных лиц и корпораций

на различных уровнях для удовлетворения любых потребностей:

39 долларов США9/год

Сеть с технологическими лидерами и пионерами. Присоединяйтесь к TAG!

EDUCATE

  • TAG Еженедельный информационный бюллетень
  • TAG-ED Возможность сотрудничества
  • Ежегодная личная встреча с менеджером по работе с клиентами

ВЛИЯНИЕ

  • Участие Совета Общества

ПРОДВИЖЕНИЕ

  • Годовой цифровой значок участника для веб-сайта, подписи и социальных сетей
  • Ярмарки вакансий
  • Набор инструментов для новых участников TAG
  • Скидки с партнерами-членами
  • Бесплатное объявление на доске объявлений
  • 4 публикации TAGWire Media каждый год
  • 4 упоминания в социальных сетях каждый год
  • 1 ролик TAG Tech Talks каждый год

ПОДКЛЮЧИТЬСЯ

  • Доступ к более чем 200 мероприятиям TAG по сниженным ценам и бесплатный доступ к каталогу участников TAG
  • Виртуальная поддержка членства консьержа
  • Скидка на аренду помещения в TAG North Metro Location
  • Возможности волонтерской службы
  • Включение в список участников TAG

Обучение

TAG Еженедельная новостная рассылка

Возможность совместной работы по тегам

Годовой, личная встреча с менеджером по счетам

Секции.

Возможность быть спикером/участником дискуссии на мероприятии TAG

Возможность работать в совете директоров TAG

Рассмотрение для правительственных отношений.

12

24

TAG Tech Talks каждый год

1

Без ограничений 100 Unlimited

Годовой значок цифрового участника для веб -сайтов, подписи и социальных сетей

Ярмарки карьеры

TAG New Member Toolkit

Скидки с участниками партнеров

Бесплатная доска для работы

Connect

Доступ к доске TAG 2002

. мероприятия по сниженным ценам и бесплатный доступ к каталогу участников TAG

Членство в консьерже Виртуальная поддержка

Скидка на аренду помещения в TAG North Metro Location

Возможности обслуживания добровольцев

включение в индекс участников TAG

Эксклюзивные приглашения на C-уровня C-уровня *

2

4

Доступ к членам Lounge At Global Events

NAMET. Мероприятия

* Приглашения предназначены для руководителей, которые в настоящее время занимают эту должность уровня C     Ожидается процесс отбора совета директоров

TAG Sponsors

Титан

Платина

Серебро

Стать спонсором

TAG Fintech — TAG Online

TAG Fintech завоевывает признание Грузии как центра выбора для ведущих мировых поставщиков финансовых технологий. Цели общества включают ускорение накопления капитала его членами и создание деловой среды, способствующей постоянному успеху компаний, сотрудников, поставщиков услуг, учебных заведений, предпринимателей и инвесторов. В результате это помогает им создавать, создавать и поддерживать инновационные финансовые услуги, отвечающие растущим потребностям их клиентов.

 

Движимое инновациями. Доказано производительностью.

Экосистема Fintech в Грузии динамична и процветает. Эти репрезентативные номера помогают определить экосистему:

  • Финтех-компании в Грузии (по состоянию на май 2022 г. ) – 210
  • сотрудников Fintech в Грузии – 42 000+ (оценка)
  • Доход 12 публичных компаний со штаб-квартирой в Джорджии — 49 млрд долларов США
  • Рыночная капитализация 12 публичных компаний со штаб-квартирой в штате Джорджия – 233 миллиарда долларов США
  • Расчетное количество глобальных платежных транзакций, обрабатываемых компаниями на базе GA – 300 миллиардов
  • 2021 инвестиционное финансирование для компаний, базирующихся в штате Джорджия, — 501 млн долларов США
  • 2022 инвестиционное финансирование для компаний, базирующихся в Джорджии, до сентября 2022 года – 415 миллионов долларов США
  • Совокупный объем транзакций Fiserv, FIS, Global Payments, BofA Merchant Services и Elavon (Nilson) — 80,5 млрд

Слияния и поглощения

Просмотр

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