Модель базы данных для определения местоположения на основе местоположения

Я оцениваю бэкэнд для приложения для определения местоположения, похожего на Tinder.

  • Функция приложения показывает близлежащих пользователей онлайн (с сексом и возрастным фильтром).
  • В некоторых системах баз данных есть Redis, Cassandra, MySQL Cluster
  • Приложение должно масштабироваться горизонтально, добавляя node при высоком трафике

После исследования я очень смущен, есть ли общая модель данных "наилучшей практики", алгоритм для этого. Мой подход использует Redis Cluster:

// Store all online users in same location (city) to a Set. In this case, store user:1 to New York set
SADD location:NewYork 1

// Store all users age to Sorted Set. In this case, user:1 has age 30
ZADD age 30 "1"

// Retrieve users in NewYork age from 20 to 40
ZINTERSTORE tmpkey 2 location:NewYork age AGGREGATE MAX
ZRANGEBYSCORE tmpkey 20 40

Я неопытен и не могу предвидеть потенциальную проблему, если масштабирование произойдет для миллионов одновременных пользователей.

Надеюсь, что любой ветеран может пролить некоторый свет.

Ответ 1

Для вашего случая использования mongodb будет хорошим выбором.

  • Вы можете хранить каждого пользователя в одном документе вместе с их текущим местоположением.

  • Создайте индексы в полях, которые хотите выполнять запросы, например. возраст, пол, местоположение

  • Mongodb имеет встроенную поддержку геопространственных запросов, поэтому легко найти пользователей в радиусе 1 км от другого пользователя.

Ответ 2

Большинство функций noSQL Geo/proximity Index зависят от алгоритма GeoHash

http://www.bigfastblog.com/geohash-intro

Хорошо понять, как это работает, и это действительно захватывающе. Этот метод также можно использовать для создания высокоэффективных индексов в реляционной базе данных.

У Redis есть встроенная поддержка этого, но если вы используете ElastiCache, то в этой версии Redis этого нет, и вам нужно будет использовать это в своем API.

Любая реляционная база данных предоставит вам максимальную гибкость и простейшее решение. Проблема, с которой вы можете столкнуться, - это время запроса. Если вы оптимизируете поиск в своем экземпляре БД (возможно, для "данных поиска/контента" есть "поиск db" ), тогда можно получить весь индекс в памяти для быстрого получения результатов.

Я также могу немного рассказать о Redis: операции отсортированного набора выполняются быстро, но вам нужно отфильтровать. Либо вам придется сканировать ваш близлежащий результат и искать метаинформацию для фильтрации, либо поддерживать отдельные наборы для каждой комбинации фильтра, который вам может понадобиться. У первого будет больше накладных расходов на производительность. Второе требует, чтобы вы сами манипулировали индексами. ЭГ: Что, если кто-то удалит одну из своих "симпатий"? Что делать, если они перемещаются?

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

Ответ 3

Вам может быть интересен Redis Geo API.

Geo API состоит из набора новых команд, которые добавляют поддержку для хранения и запроса пар координат долготы/широты в ключи Redis. GeoSet - это название структуры данных, содержащей набор (x, y) координат. На самом деле, нет никакой новой структуры данных под капотом: GeoSet - это просто Redis SortedSet.

Redis Geo Tutorial

Ответ 4

Я также поддержу MongoDB на основе требований с развитием компаса MongoDB, вы также можете визуализировать свои геопространственные данные. Ссылка на документацию компаса mongodb: " https://docs.mongodb.com/compass/getting-started/".