Вот упрощенная версия проблемы, с которой я сталкиваюсь на работе.Детали были изменены и более обобщены, поэтому я могу объяснить их проще.
Допустим, у вас есть движок блога, который позволяет постам в блогах присваивать теги при их создании.Поэтому я мог бы написать пост под названием «Мой отпуск в Италии», и я решил добавить к нему следующие теги: has-photos
, vacation
, family
.Как часть моего блогового движка, я могу создавать собственные действия на основе групп тегов.Поэтому я решил, прежде чем писать, что любой пост с тегами has-photos
и family
будет автоматически опубликован в Facebook.Когда этот пост создается впервые, я должен автоматически сопоставить все его теги со всеми действиями, которые можно выполнить с комбинациями этих тегов.
Когда сообщение "Мой отпуск в Италии"После сохранения необходимо выполнить поиск всех действий для следующих групп тегов:
has-photos
vacation
family
has-photos
& vacation
has-photos
& family
vacation
& family
has-photos
& vacation
& family
Генерация этого запроса тривиальна, я просто получаю все перестановки любой длины из исходного набора тегов поста.Оказывается 2^N - 1
возможностей комбинаций тегов.
Проблема, с которой я сталкиваюсь, возникает, когда вы сталкиваетесь с большими наборами данных.С чем мы имеем дело:
- 10 000 + "сообщения", поступающие ежедневно
- 20 + "теги" за "сообщение"
- 1 000 из«действия», уже существующие, когда приходят сообщения в блоге, с различными числами тегов, с которыми они запускаются
Когда приходит сообщение с 20 тегами, получается чуть более миллиона перестановок.будет генерировать запрос для.Даже если бы моя база данных позволяла мне отправлять строки запроса на него настолько большим (подсказка: это не так), запуск по-прежнему занял бы целую вечность.
Есть ли разумное решение для этого, я не думаю,из?Прямо сейчас, как я это вижу, у меня остается одна возможность:
Действия используют OR вместо AND
Я мог бы изменить его так, чтобы при создании предопределенного действия тегион действует неявно ИЛИ вместо И.Тогда количество комбинаций тегов падает с 2^N - 1
до N
.К сожалению, это серьезно ограничило бы полезность функции «тег действия».
Редактировать: я не обязательно ищу ответ в SQL.Просто другой подход к решению этой проблемы, даже если это просто описание высокого уровня.