Как организовать хранение тегов (и поиск по ним) в приложении с иерархической структурой данных?
Есть таблицы: проекты, модели, аудио и т.д., а также таблица тегов. В данный момент каждая из этих таблиц имеет свою связную таблицу с тегами (отношение один ко многим), где каждому элементу контента может соответствовать множество тегов. В каждом проекте может быть разное количество контента, при этом у каждого элемента (например, аудио) есть свой id проекта.
Допустим, видео имеет свой тег, например, "демонстрация", а проект, к которому оно принадлежит, имеет свой тег, например, "промышленность".
Какой подход будет более правильным:
Видео будет находиться как по тегу "демонстрация", так и по тегу "промышленность".
Поиск будет работать раздельно: проекты будут находиться только по своим тегам, а видео — только по своим. Тогда видео будет связано только с тегом "демонстрация", а при попытке найти видео по тегу "промышленность" оно не отобразится.
Какой вариант предпочтительнее с точки зрения логики и удобства поиска?
Ответы (1 шт):
С точки зрения логики, разумеется должно быть так, чтобы видео находилось как по тегу "демонстрация", так и по тегу "промышленность", если оно относится к проекту с тегом "промышленность".
По структуре не очень понятно, так что на всякий случай уточню: таблица тегов одна, а таблицы-связки у каждой сущности свои, многие-ко многим. Дальше при поиске по тегам можно задать ограничение - хотим по "проекту", хотим - по медиа, хотим вообще по всей базе. Например, поиск только видео:
- через связку тег-проект выбираем проекты по тегу "промышленность" и все видео, которые относятся к этим проектам
- ЮНИОН через связку тег-проект выбираем проекты по тегу "промышленность" все модели, которые относятся к этим проектам и все видео, которые относятся к этим моделям
- ЮНИОН что там может быть ещё с видео - модели например - через связку тег-модель выбираем модели по тегу "промышленность" и все видео, которые относятся к этим моделям
- ЮНИОН все видео, которые сами по себе относятся к тегу промышленность
Ну и дедупликацию надо будет сделать, понятное дело.
Или поиск вообще по всему:
- через связку тег-проект выбираем проекты по тегу "промышленность"
- через связку тег-модель выбираем модели по тегу "промышленность"
- ЮНИОН через связку тег-проект выбираем проекты по тегу "промышленность" и все видео, которые относятся к этим проектам
- ...и далее везде
Да, это очень заморочено, но через SQL по-другому никак, если у нас иерархическая структура и у каждого узла могут быть свои теги (ну только если Akina не достанет какой-нибудь волшебный трюк из рукава).
Или можно сделать ход конём: чтобы не сойти с ума от всех этих юнионов, используются движки полнотекстового поиска, такие как Эластик или Мантикора. Этим просто сливаем все данные и они дальше сами всё находят. Причём сразу бездублей.