Как организовать хранение тегов (и поиск по ним) в приложении с иерархической структурой данных?

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

Допустим, видео имеет свой тег, например, "демонстрация", а проект, к которому оно принадлежит, имеет свой тег, например, "промышленность".

Какой подход будет более правильным:

  1. Видео будет находиться как по тегу "демонстрация", так и по тегу "промышленность".

  2. Поиск будет работать раздельно: проекты будут находиться только по своим тегам, а видео — только по своим. Тогда видео будет связано только с тегом "демонстрация", а при попытке найти видео по тегу "промышленность" оно не отобразится.

Какой вариант предпочтительнее с точки зрения логики и удобства поиска?


Ответы (1 шт):

Автор решения: Ипатьев

С точки зрения логики, разумеется должно быть так, чтобы видео находилось как по тегу "демонстрация", так и по тегу "промышленность", если оно относится к проекту с тегом "промышленность".

По структуре не очень понятно, так что на всякий случай уточню: таблица тегов одна, а таблицы-связки у каждой сущности свои, многие-ко многим. Дальше при поиске по тегам можно задать ограничение - хотим по "проекту", хотим - по медиа, хотим вообще по всей базе. Например, поиск только видео:

  • через связку тег-проект выбираем проекты по тегу "промышленность" и все видео, которые относятся к этим проектам
  • ЮНИОН через связку тег-проект выбираем проекты по тегу "промышленность" все модели, которые относятся к этим проектам и все видео, которые относятся к этим моделям
  • ЮНИОН что там может быть ещё с видео - модели например - через связку тег-модель выбираем модели по тегу "промышленность" и все видео, которые относятся к этим моделям
  • ЮНИОН все видео, которые сами по себе относятся к тегу промышленность

Ну и дедупликацию надо будет сделать, понятное дело.

Или поиск вообще по всему:

  • через связку тег-проект выбираем проекты по тегу "промышленность"
  • через связку тег-модель выбираем модели по тегу "промышленность"
  • ЮНИОН через связку тег-проект выбираем проекты по тегу "промышленность" и все видео, которые относятся к этим проектам
  • ...и далее везде

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

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

→ Ссылка