DynamoDB 的用户数据库设计和使用 Cloudsearch 的快速性能搜索

Users database design for DynamoDB and fast performance search with Cloudsearch

我正在研究如何将 DynamoDB 和 Cloudsearch 用于我的应用程序。我不了解有关 DynamoDB 数据库架构的一些事情。考虑到这个模式:

用户table

{
   "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}

我需要搜索半径或国家/地区内的活跃用户 and/or 以及喜欢一种或多种颜色的用户(示例)。我读过我不能在比树的第一个更深的层次中添加索引,并且索引只能是字符串、整数或二进制。此外,Cloudsearch 有更多类型的索引,这非常适合 "colours""verified",但我无法为 "coordinates" 添加 "deep" 索引。 我可以像这样在第一层移动坐标:

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

但它不是 "elegant"。我可以为用户位置创建一个外部 table,但是我可能会失去文档数据库的所有优势,而且当用户访问配置文件时,我不能 retrieve/read 一次调用所有数据。

我必须修改我的数据库模式吗?怎么样?

谁管风雅,我得把坐标放一级?

"coordinates" 项没有索引关联,这对性能有负面影响吗?显然,当我使用地理查询搜索用户时。

有什么建议吗?

感谢您的帮助, 亚历山德罗

您需要使用云搜索来进行搜索。添加所有要搜索的字段作为索引参数,还有 latlon 字段可以帮助进行地理搜索。如果任何文档与您的搜索查询匹配,云搜索将 return 对象的 ID 以及索引字段。从云搜索中检索结果后,您可以使用 id 从 dynamoDB 中获取所需的文档。

Dynamo 和云搜索不会自动相互链接,您需要创建一个单独的云搜索域并确保对 dynamoDB 的任何更新都更新到使用 DynamoStreams 和 Lambda 的云搜索。

不需要深度索引,当对 dynamoDB 文档进行更新时,dynamo 流将调用 lambda 函数。然后 lambda 函数将转换数据并更新云搜索。您可以将您的位置转换为 latlon 字段并在此处更新云搜索以进行地理搜索。