【问题标题】:How do I use DynamoDB for geo-location based queries?如何使用 DynamoDB 进行基于地理位置的查询?
【发布时间】:2017-12-14 17:49:53
【问题描述】:

我正在设计一个照片分享应用(基于位置)。我计划使用 AWS Cognito 进行身份验证/授权,使用 DynamoDB 进行持久数据,使用 S3 进行文件存储,使用 Lambda + API Gateway 进行 Web 服务。

这些是关键用例/访问模式(注册/登录除外):

  1. 用户创建帖子:标题、媒体、位置(纬度、经度)
  2. 用户获取最接近其地理位置的帖子列表(最新的优先)

这些是我要创建的表:

Users table
hash-key=userID from cognito

Posts table
hash-key=userID from cognito
range-key=date
other-attributes=title, image-s3-path, ge-location

实现查询的最佳方式是什么(可能借助添加 LSI、GSI 甚至更多表),以便结果是基于用户当前位置的帖子集合。例如。仅显示半径 10 公里内的帖子,按最新的优先排序。

【问题讨论】:

标签: amazon-dynamodb geospatial data-modeling nosql


【解决方案1】:

您提到您的用例是 users can retrieve posts closest to their location,因此对于帖子来说,一个好的散列键是按空间坐标而不是用户 ID 对数据进行分区的散列键。

我会研究地理散列并将类似的东西用于键。您想选择一个分区键,它可以提供良好的空间分区,从而使帖子均匀分布,并且每个分区键中的帖子相对较少。

【讨论】:

  • 感谢您的提示。假设我可以找到一种方法来转换 {lat,lon} -> geo-hashed-key,我将把它用作我的 DynamoDB 表的哈希键。我可以将用户的当前位置发送到后端,然后在表格中搜索相关项目。结果应该是一个项目列表,按最近到最远排序。有没有办法做到这一点?
  • 因此您需要使用更宽、更粗糙的区域作为哈希键。并将在该区域中具有位置的所有项目作为具有该哈希键和表中确切位置的范围键的项目。当您查询以确定附近的帖子时,您会针对“同一区域”和邻居执行一些查询。将其视为重叠的单元格或任意半径。
  • 这意味着我需要某种后端 API(可能由 Lambda 提供支持)来实现这个结果。 IE。合并多个查询的结果,对它们进行排序,然后为客户端应用程序编写响应。为了更好地实施,我应该考虑其他任何 AWS 服务吗?
  • 看准了!无论您使用 Lambda 还是 EC2 缓存后端,您都将在其中处理查询结果以返回正确的结果。就其他服务而言,您绝对应该缓存您的结果,因此请查看 ElasticCache
  • cmets 部分用于评论答案。如果您的 cmets 代表不同的问题,我建议您提出一个新问题,因为这样其他人可以从答案中受益(如果您发现它们有帮助,也可以考虑投票答案)
【解决方案2】:

我会考虑使用 ElasticSearch,因为它natively supports geohashing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多