DynamoDB は、質問の作成者が説明する方法で利用されるように構築されました。このリンクを参照してください。AWS のドキュメントでは、このようなセカンダリ インデックスの作成について説明されています。
[country]#[region]#[state]#[county]#[city]#[neighborhood]
パーティション キーは、検索対象に基づいて、このようなものになることもあります。
DynamoDB では、テーブルを作成する前に結合を作成します。これは、データを検索し、インデックスを作成し、それらを使用してデータをクエリする方法をすべて検討する必要があることを意味します。
AWS は、チームがこれを行うのを支援するためにAWS noSQL WorkBenchを作成しました。この記事の執筆時点で、そのアプリケーションにはいくつかの UI バグがあります。バグの詳細については、 LINKを参照してください。
あなたが言及したいくつかのクエリを確認するために、そのクエリを作成するためのインデックスを作成できるいくつかの可能性を共有します。
注: noSQL は場合によっては非正規化されたデータを意味しますが、必ずしもそうとは限りません。
dynamoDB が実際のサーバーを分割してスケーリングできるようにキーを形成する方法には制限があります。詳細については、パーティション キーを参照してください。
dynamoDB の魔法は、テーブルが作成されて本番環境で使用された後に新しいクエリも処理できる、よく考えられたモデルです。これを行う方法を説明する投稿やビデオがオンラインでたくさんあります。
これは、リック・フーリハンのリンクがあるものです。Rick Houlihan は DynamoDB のプリンシパル デザイナーです。
試行しているクエリを作成するには、主に初期パーティション キーとセカンダリ キーの複数のキーを作成します。Rick は、それらを PK や SK のように一般的なものにしておくことを推奨しています。
次に、多くの一意性を備えた PK を形成してみてください。たとえば、郵便番号 PK のパーティション キー: "12345" には、パーティション キー制限の 10GB クォータを超える可能性がある大量のデータが含まれる可能性があります。
例 1: WHERE アドレス LIKE '%maple st%' AND ZipCode = 12345
たとえば、「12345:maple」という PK のパーティション キーを作成すると、「12345:maple」という PK を呼び出すだけで、その郵便番号のすべてのデータと、maple の通りが取得されます。多くの異なる PK があり、それが dynamoDB の得意とするところです: 水平方向にスケーリングします。
例 2: WHERE Address LIKE '%poplar ln%' AND City = 'Los Angeles' AND State = 'CA'
例 2 では、セカンダリ インデックスを使用して、PK: "12345:poplar" SK: "losangeles:ca:other:info:that:helps" など、より具体的な別の方法を追加できます。
例 3: WHERE OwnerName LIKE '%smith%' AND CountyFIPS = '00239'
例 3 には通りの名前がありません。データをクエリするには、通りの名前を知る必要がありますが、検索に含まれていない可能性があります。これは、基本的なクエリ パターンを完全に理解し、クエリ時に簡単にわかるように PK を形成する必要があります。通りの名前を持つことはおそらく最適ではないでしょう。それはすべて、必要なクエリによって異なります。
この最後の例では、いくつかのグローバル セカンダリ インデックスを追加する方が適切な場合があります。これは、CountyFIPS のようなデータ属性 (列) にマップする新しいプライマリ キーとセカンダリ キーを作成することを意味します。