1

У меня есть база данных Postgres и таблица пользовательских тегов с столбцами UserId и TagId. Каждый пользователь может иметь несколько тегов и наоборот.Есть ли масштабируемый способ реализовать поиск базы данных по нескольким тегам?

Есть ли способ реализовать поиск по нескольким тегам масштабируемым способом? Пример запросов:

  • Получить все пользователи, которые имеют как tag1 и tag2
  • Получить все пользователи, которые имеют (или tag1 tag2) и Tag3
  • Получить все пользователи, имеющие tag1 и tag2 и не имеют Tag3

Поскольку это непросто индексировать и масштабировать, я думал об использовании каких-то кэшей в памяти для более быстрого поиска. Знаете ли вы какие-либо доступные решения этой проблемы?

Благодаря

+1

Сколько у вас пользователей и меток? Postgres должен иметь возможность легко справляться с этими запросами (например, выбрать всех пользователей с tag1, пересекающихся со всеми пользователями с tag2). Если у вас есть правильные индексы в памяти, это будет довольно быстро, у postgres уже есть кэши в памяти и оптимизация запросов. Если это, однако, не поможет вам хорошо, вы можете посмотреть на Solr или Elastic. – nvartolomei

ответ

1

Прежде всего, не зная много подробностей, я полагаю, есть несколько тегов, но не так много, что делает мощность TagIds колонки низка. Мой ответ основан на этом предположении.

Как правило, индекс в колонии с низкой мощностью не помогает масштабировать запросы в этом столбце. Для получения дополнительной информации см. Why low cardinality indexes negatively impact performance.

Во-вторых, набор приведенных вами примерных запросов создает впечатление, что другие запросы (этого набора) могут быть в дизъюнктивной форме (другими словами, условие WHERE содержит логические предикаты OR), в котором намекает, что ни один индекс не будет если число дизъюнкций велико. СУБД рассмотрит (а) сканирование всей таблицы и проверит каждую строку с условием WHERE и (b) сканирует индекс на столбце TagIds.

И последнее, но не менее важное: переход в память поможет вам на основании того, что данные теперь находятся в памяти. Однако, в принципе, СУБД в памяти также рассматривает (а) и (б) и, вероятно, выбирает (а) по (б).

Я предлагаю использовать function index, описанный здесь, в PostgreSQL. Учитывайте это, если вы не имеете дело со специальными запросами:

 Смежные вопросы

  • Нет связанных вопросов^_^