首页 文章

使用DynamoDB进行地理空间结构和查询

提问于
浏览
2

目标是实现有效的地理空间数据结构和查询 . 更准确地说,"get all items within the given bounding rectangle" . 边界矩形将使用 longitudeMinlongitudeMaxlatitudeMinlatitudeMax 定义 .

所以我想到的DynamoDB查询会像:

KeyConditionExpression: 
  itemLongitude BETWEEN :longitudeMin AND :longitudeMax 
  and 
  itemLatitude BETWEEN :latitudeMin AND :latitudeMax

..where itemLongitudeitemLatitude 将是查询表的排序键 .

但是,基于DynamoDB documentationKeyConditionExpression ,只接受一个排序键 . 我理解的是对的吗?

虽然我知道Geo Library项目,但在深入研究这个完全不熟悉的范例之前,我想知道我能在多大程度上利用核心的DynamoDB功能 .

1 回答

  • 3

    你是正确的,DynamoDB不支持查询与多个非均衡条件 - 您可以查询分区键只为平等而排序关键字可以使用运营商如 BETWEEN 相比, <> 等,所以为了查询让我们说吧

    742 <= x <= 1082
    113 <= y <= 305
    

    使用普通复合键可以做的最好的事情可能是将数据分组以最小化所需的查询数量,但是您将永远无法通过一个查询找到给定框中的所有点,并且您需要进行一些客户端过滤,这会消耗读取容量单位 .

    作为上述数据的示例,我们可以将 floor(x / 100) (或者,如果您愿意,将零左填充x值的 n 第一个数字)存储为散列键,并使用y坐标作为排序键 . 然后将点 [1033; 278] 编码为

    hash   x       y
    10     1033    278
    

    然后可以使用以下方法查询上面的示例:

    Query (hash = 07, y BETWEEN 113 AND 305) + Filter x >= 742
    Query (hash = 08, y BETWEEN 113 AND 305)
    Query (hash = 09, y BETWEEN 113 AND 305)
    Query (hash = 10, y BETWEEN 113 AND 305) + Filter x <= 1082
    

    虽然这很有效,但是大盒子需要很多查询 . 客户端还需要过滤并将结果数据合并到一个数据集中 .

    更好的方法通常是重组数据 . 在地理坐标的情况下,常见的解决方案是使用geo hashes,这实际上是将坐标对编码为一个值的方式,使得彼此接近的点可能共享公共前缀 . 然后可以将地理散列比较为字符串以找到特定区域内的点 .

    由于你已经提到的DynamDB Geo library支持大部分内容,我建议使用它来简化地理哈希和其他坐标相关转换的管理 .

相关问题