Содержание
Алгоритмы организации тэгов / Хабр
enartemy
Время на прочтение
3 мин
Количество просмотров
26K
Разработка веб-сайтов *
Тэги – неотъемлемая часть всех современных сайтов и косвенный признак принадлежности сайта к пресловутому Вэб-Два-Ноль.
В статье я хочу рассказать об способах и алгоритмах тегирования информации.
Итак, при организации тэгов существует несколько слабых и узких мест, а именно:
- добавление и изменение принадлежности тэгов к объекту.
- создание и изменение самих тэгов.
- отображение тэгов на старице.
- поиск по тэгам.
- назначение алиасов тега
- построение облака тегов
К сожалению, универсальный алгоритм, который легко бы решал все эти проблемы автору не знаком. Далее о самих алгоритмах.
Нормальное соотношение многое-ко-многим.
Существует огромная таблица с тэгами, существуют огромные таблицы с тегируемой информацией. Связь между ними осуществляется через третью таблицу, которая получается очень большого размера. Так, если статей у нас 50000, а тэгов 10000, при условии что каждая статья в среднем связана с 4-мя тэгами, получаем размер таблицы в 200000.
Плюсы:
- нет проблем с построением облака тэгов
- нет проблем с алиасами.
- нет проблем с созданием и изменением тэгов
- нет проблем с «выпадающим списком тэгов»
Минусы:
- добавление и изменение принадлежности тэгов к объекту затрудненно, поскольку требуется отдельный INSERT или DELETE на каждую изменяемую связь. Еще нужен INSERT при создании тэга. Если некоторые тэги в единственном числе (что часто бывает), то они будут оттягивать на себя ресурсы (увеличивая размеры таблиц), не неся при этом почти никакой практической пользы.
- получение и отображение тэгов требует JOIN-объединение 3-х огромных таблиц. Из примера выше: таблица в 50000 join таблица 200000 join таблица 10000. Это будет работать медленно уже с этими данными. Учитывая то, что реально требуется сделать join еще 2-3 большие таблицы (например, таблицу пользоватлей и таблицу рейтинга), получается совсем не радужная картина. Да, я в курсе, что можно кэшировать, но сейчас не об этом.
- поиск по тэгам требует опять объединения больших таблиц
С помощью полнотекстового поиска
Алгоритм приведен в моей статье «Полнотекстовый поиск и его возможности»
Теперь о том, как это делается непосредственно по отношению к тэгам. В поле с полнотекстовым индексом лежат сами тэги в том виде, как они были записаны. Выборка объектов происходит исключительно по этому полю. Исходя из этого же поля строится принадлежность объекта к тэгам. Это означает, что если тэг русский, то и ссылка на него должна содержать русские буквы. А с этим возникают проблемы, т.к. они могут кодироваться c помощью urlencode, а это зависит уже от кодировки. Т.е. один и тот же тэг в зависимости от того, в какой кодировки страница, должен быть декодирован по-разному. Можно конечно использовать транслит русских слов в английские, и в писать их в поле наряду с русским словами. Тогда тэг будет отображаться на русском, а ссылка на него будет в латинице, и поиск будет идти тоже в латинице. Плохой выход, но выход.
Плюсы:
- нет проблем с выводом тэгов
- нет проблем с поиском по тэгам
- нет проблем добавлением и изменением принадлежности тэгов к объекту
- нет проблем с алиасами (точнее есть, но они решаемы)
- отпадает проблема создания тэга
- легко можно делать поиск не по одному, а по нескольким тэгам, а так же вычислять похожие материалы
Минусы:
- переименовать или удалить тэг просто так не получится, это требуется в полях всех объектов, которыми назначены тэги
- с построением облака тегов очень большие проблемы. Можно решить так: обрабатываются все «тэговые» поля таблиц, анализируется частота присутствия отдельного тэга (эх, был бы доступ непосредственно к самому полнотекстовому индексу, как было бы хорошо) и на фоне этого строится облако. После чего кэшируется на длительный промежуток времени.
- сложно сделать «выпадающий список тэгов»
Как вариант, совмещение того и другого метода. То есть поиск по полнотекстовому индексу, а частоты использования и сами тэги в отдельной таблице. Ну, или вариации на эту же тему. Это решает проблемы с выпадающим списком и облаком, но создает сложности при выводе, добавлении и создании тегов.
Если кто-то знает еще варианты организации – будет интересно о них узнать. Конструктивная критика приветствуется.
Теги:
- тэги
- облако тегов
- разработка
- веб разработка
- алгоритмы
- полнотекстовый поиск
Хабы:
- Разработка веб-сайтов
Всего голосов 42: ↑39 и ↓3 +36
Комментарии
48
Артемий
@enartemy
Пользователь
теги — Организация тегов в бд и запросах
Доброго всем времени суток господа
Есть такая штука тэги, к сообщениям/постам. т.е. есть у нас бд, в которой много постов, и хочется прикрутить к каждому посту тэги. Если тегов много — создавать для каждого отдельный столбик в таблице — думаю не лучший вариант.
Вопрос раз: как хранить теги в бд правильно? в одной ячейке через запятые?
Вопрос два: (исходя из первого ответа) приведите пример запроса к таблице, с поиском определенного тега?
- теги
- 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 — это сообщество, большее, чем любой отдельный человек или организация. Наша глубокая и обширная сеть, а также партнерские отношения с отраслевыми поставщиками и сектором в целом делают нас лучше, чем сумма наших частей.
Добро пожаловать в сеть лидеров, учеников и людей, решающих проблемы в области благотворительности.
«В состав TAG входят любознательные мыслители и решатели , которые хотят опередить нас сегодня, , а также лидеры и деятели в этой сфере».
— Джонатан Мерги
Сеть | TAG — это частная сеть ИТ-руководителей, сотрудников и партнеров фондов по всему миру, включая:
|
Обмен знаниями | Членство включает доступ к следующим возможностям для обмена и сотрудничества:
|
Ежегодная конференция | Ежегодная конференция TAG, известная как ключевое событие в области технологий благотворительности, проводится каждый октябрь/ноябрь и привлекает руководство, сотрудников и партнеров фонда со всего мира на закрытое мероприятие для налаживания связей и сотрудничества. |
Обзоры технологий | TAG регулярно проводит опросы грантодателей и сектора в целом. Данные опроса подробно сообщаются участникам опроса, а в кратком виде — сектору. Посмотреть результаты опроса State of Philanthropy Tech за 2022 год |
Профессиональное развитие | участника TAG приглашаются принять участие в нашей инициативе Emerging Leaders Initiative в качестве наставника или кандидата на участие в программе. Узнайте больше об инициативе Emerging Leaders Initiative . |
Скидки | Программа Amazon Web Services: Через TechSoup участники TAG и получатели их грантов имеют право на ежегодное получение до 2000 долларов США в виде кредитов AWS, а также бесплатное обучение и техническую поддержку. Узнайте больше на TechSoup. Обучение Idealware: участников TAG получают скидку 15–25 % на все учебные курсы Idealware . Idealware — это некоммерческая организация, которая предоставляет ресурсы, чтобы помочь некоммерческим организациям использовать технологии для улучшения социального воздействия. Программа скидок для участников: Будучи гордым партнером TAG, Submittable предлагает скидку 10% всем членам фонда TAG. Submittable — это отмеченная наградами платформа управления грантами, которая помогает спонсорам принимать более взвешенные решения и максимизировать отдачу. Обратитесь и отметьте свое членство в TAG. Члены Фонда имеют право на участие в открытой благотворительной программе Microsoft , администрируемой TechSoup, а также на аппаратное и программное обеспечение со скидкой от многих других поставщиков. Узнать больше. |
Тесно сотрудничая с аналогичными организациями в социальном секторе, TAG регулярно проводит совместные мероприятия, вебинары и публикации с PEAK Grantmaking, NTEN, Советом по фондам и Объединенным благотворительным форумом. Этот уникальный партнерский подход гарантирует, что ваши членские взносы не дублируют усилия в этом секторе.
Членство расширяет горизонты для вас и всей вашей команды. Вместе со всем сообществом TAG мы приглашаем вас принять участие.
Посмотреть варианты членства и начать работу
TAG Slack Community — Технологическая ассоциация грантодателей
TAG Slack Space |
Сообщество жизненно важно. Ваше членство в Технологической ассоциации грантодателей (TAG) открывает доступ к рабочему пространству Slack нашего сообщества. Там вы можете безопасно общаться с коллегами, задавать вопросы/получать ответы и делиться информацией о том, что «работает» в вашей организации. Присоединяйтесь к обсуждению.Это виртуальное сообщество открыто для всех действующих членов TAG, и доступ предоставляется по запросу. Свяжитесь с Трейси Мунейхэм, директором по взаимодействию с общественностью, чтобы получить приглашение. ПРИМЕЧАНИЕ. Пространство TAG Slack не требует запросов. Участники-партнеры и поставщики могут размещать рекламные материалы только на канале #plugs-and-promo. Прочтите политику использования Slack (PDF) для Что такое пространство TAG Slack?Slack — это платформа обмена сообщениями на основе каналов. В частности, именно здесь члены TAG могут узнавать о тенденциях в области ИТ и благотворительности и находить информацию, необходимую им для эффективной работы, — и все это в безопасной среде корпоративного уровня. Разговор разбивается на «каналы» для организации обсуждений. Вот как устроены каналы TAG:
Кроме того, TAG предлагает следующие частные каналы и/или группы пользователей:
|