Дизайн пользовательской базы данных для DynamoDB и быстрый поиск производительности с помощью Cloudsearch

Я изучаю, как использовать DynamoDB и Cloudsearch для своего приложения. Я не понимаю пары вещей о схеме базы данных для DynamoDB. Учитывая эту схему:

Таблица USERS

{
   "id_users"(PI): <number>,
   "created": <string>,
   "email" (GSI): <string>,
   "firstname": <string>,
   "lastname": <string>
   "password"(GSI): <string>,
   "verified": <boolean>,
   "category": <string>,
   "colors": <array of strings>, // list of favourite colors of the users (it's an example)
   "locale": <string>,
   "user_location": {    //GeoJSON structure
       "type": <string> ex. "location",
       "geometry": {
          "type": <string> ex. "Point",
          "coordinates": [ <number> ex. 125.6, <number> 10.1]
       },
       "properties": {
           "city": <string>,
           "country": <string>
       }
   },
   "accounts": [ 
          {
           "type": <string>, // ex. "facebook"
           "ID": <number>, // ex. 23248323243473743
           "access_token": <string>,
           "profile_url": <string>
          },
          {
           "type": <string>, // ex. "google"
           "ID": <number>, // ex. 23248323243473743
           "access_token": <string>,
           "profile_url": <string>
          }
     ]
}

Это часть полной схемы.

Итак, путь приложения myurl.com/users/{:id_users}.

Мне нужно найти активных пользователей и / или в пределах радиуса или страны, и кому нравится один или несколько цветов (пример). Я прочитал, что не могу добавлять индексы на более глубоком уровне, чем первый уровень дерева, и индекс может быть только строковым, целочисленным или двоичным. Кроме того, Cloudsearch имеет больше типов индексов, это идеально подходит для "colours" и "verified", но я не могу добавить «глубокий» индекс для "coordinates". Я мог бы переместить координаты на первом уровне вот так:

location_coordinates:  [ <number> ex. 125.6, <number> 10.1],
location_city: <string>,
location_country: <string>,

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

Мне нужно изменить схему базы данных? Как?

Кого волнует элегантность, я должен поставить координаты на первый уровень?

Тот факт, что у "coordinates" элемента нет связанного индекса, это отрицательно сказывается на производительности? Очевидно, когда я ищу пользователей по гео-запросу.

Какие-либо предложения?

Спасибо за помощь, Алессандро.


person Alessandro Corradini    schedule 12.03.2016    source источник
comment
Для поиска вам необходимо использовать облачный поиск. Добавьте все поля, которые вы хотите искать, в качестве параметров индекса. Также есть поля latlon, которые помогут с географическим поиском. После получения результатов вы можете получить требуемые результаты по идентификатору из Dynamodb. Dynamo и облачный поиск не связаны друг с другом автоматически, вам необходимо создать отдельный домен облачного поиска и убедиться, что любое обновление для DynamoDB обновляется до облачного поиска с помощью DynamoStreams и Lambda.   -  person Procedurally Generated    schedule 14.03.2016
comment
Нет необходимости в глубоком индексе. Когда происходит обновление документа DynamoDB, поток Dynamo вызывает лямбда-функцию. Затем лямбда-функция преобразует данные и обновит облачный поиск. Вы можете преобразовать свое местоположение в поле latlon и обновить облачный поиск здесь, чтобы выполнить географический поиск.   -  person Procedurally Generated    schedule 14.03.2016
comment
ах, я понял! Спасибо за объяснение :) Ответьте на мой вопрос вместо добавления комментария, чтобы я мог отметить флаг отвеченным.   -  person Alessandro Corradini    schedule 14.03.2016


Ответы (1)


Для поиска вам необходимо использовать облачный поиск. Добавьте все поля, которые вы хотите искать, в качестве параметров индекса. Также есть поля latlon, которые помогут с географическим поиском. Облачный поиск вернет идентификатор объекта вместе с проиндексированными полями, если какой-либо из документов соответствует вашему поисковому запросу. После получения результатов облачного поиска вы можете получить необходимые документы из DynamoDB, используя идентификатор.

Dynamo и облачный поиск не связаны друг с другом автоматически, вам необходимо создать отдельный домен облачного поиска и убедиться, что любое обновление для DynamoDB обновляется до облачного поиска с помощью DynamoStreams и Lambda.

Нет необходимости в глубоком индексе. Когда происходит обновление документа DynamoDB, поток Dynamo вызывает лямбда-функцию. Затем лямбда-функция преобразует данные и обновит облачный поиск. Вы можете преобразовать свое местоположение в поле latlon и обновить облачный поиск здесь, чтобы выполнить географический поиск.

person Procedurally Generated    schedule 14.03.2016