2017-10-31 17 views
1

目的は、効率的な地理空間データ構造とクエリを実装することです。より正確には、「与えられた境界矩形内のすべてのアイテムを取得する」。境界矩形は、longitudeMin,longitudeMax,、およびlatitudeMaxで定義されます。DynamoDBによる地理空間構造とクエリ

だから私は念頭に置いていたDynamoDBのクエリは次のように行くだろう:照会テーブルのソート・キーになり

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

..where itemLongitudeitemLatitude

しかし、DynamoDB documentationに基づいて、KeyConditionExpressionは、1つのソートキーのみを受け入れます。私は物事を正しく理解していますか?

Geo Libraryプロジェクトについて知っていますが、まったく馴染みのないパラダイムを掘り下げる前に、DynamoDBのコア機能をどれだけ正確に活用できるかを知りたいと思います。

答えて

1

あなたはDynamoDBのは、複数の非EQ条件でクエリをサポートしていないことを正しい - ソート・キーがでそうなどBETWEEN<>などの演算子を使用して比較することができながら、あなただけの平等のためのパーティション・キーを問い合わせることができますあなたは、通常の複合キーで行うことができる最高の可能性が高い必要なクエリの数を最小限にするためにグループにデータを分割することですが、あなたはすべてのポイントを見つけることができないだろう

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

を言わせて照会するために指定されたボックス内で単一のクエリを使用すると、クライアント側のフィルタリングを行う必要があります同様に、読取り容量単位を消費する。

上記のデータの例として、floor(x/100)(または、もしそうなら、ゼロの左にパディングされたx値のnの第1桁)をハッシュキーとして保存し、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 

これは機能するが、大型ボックスは多くのクエリを必要とするであろう。また、クライアントは、結果のデータをフィルタリングして1つのデータセットにマージする必要があります。

通常、より良いアプローチはデータを再構成することです。地理座標の場合、一般的な解決策は、geo hashesを使用することです。これは事実上、座標のペアを1つの値にエンコードし、互いに近接する点が共通の接頭辞を共有する可能性がある方法です。地理ハッシュは、特定の領域内の点を見つけるための文字列として比較することができます。

これまで説明したDynamDB Geo libraryによって多くの部分がサポートされているため、ジオハッシュなどの座標関連の変換を簡単に管理するために使用することをおすすめします。

関連する問題