ステップ 6: データクエリを作成する
アクセスパターンを定義してデータモデルを設計したら、DynamoDB データベースの階層データをクエリできます。コストを抑えてパフォーマンスを確保するためのベストプラクティスとして、次の例では Scan がないクエリオペレーションのみを使用しています。
-
コンポーネントの祖先を検索します。
CM8 コンポーネントの祖先 (親、祖父母、曽祖父母など) を見つけるには、
ComponentId = "CM8"を使用してベーステーブルをクエリします。クエリは次のレコードを返します。結果データのサイズを小さくするには、プロジェクション式を使用して
Path属性だけを返すことができます。ComponentId
ParentId
GraphId
パス
CM8
CM4
CM1#1
CM1|CM2|CM4|CM8
パス
CM1|CM2|CM4|CM8
次に、パイプ (「|」) を使用してパスを分割し、最初の N-1 コンポーネントを使用して祖先を取得します。
クエリ結果: CM8 の祖先は CM1、CM2、CM4 です。
-
コンポーネントの直接の子を検索します。
CM2 コンポーネントのすべての直接の子コンポーネント、または 1 レベルの下流コンポーネントを取得するには、
ParentId = "CM2"を使用して GSI1 にクエリを実行します。クエリは次のレコードを返します。ParentId
ComponentId
CM2
CM4
CM5
-
最上位コンポーネントを使用して、すべての下流の子コンポーネントを検索します。
最上位コンポーネント (CM1) のすべての子コンポーネント、または下流コンポーネントを取得するには、
GraphId = "CM1#1"とbegins_with("Path", "CM1|")を使用して GSI2 にクエリを実行し、ComponentIdでプロジェクション式を使用します。すると、そのツリーに関連するすべてのコンポーネントが返されます。この例では、CM1 を最上位コンポーネントとするツリーが 1 つありますが、実際には、同じテーブルに数百万もの最上位コンポーネントがある可能性があります。
GraphId
ComponentId
CM1#1
CM2
CM3
CM4
CM5
CM8
CM9
CM10
CM6
CM7
-
中間レベルのコンポーネントを使用して、下流のすべての子コンポーネントを検索します。
コンポーネント (CM2) のすべての子または下流コンポーネントを再帰的に取得するには、2 つの方法があります。レベルごとに再帰的にクエリを実行するか、GSI2 インデックスにクエリを実行することができます。
-
子コンポーネントの最後のレベルに達するまで、GSI1 をレベルごとに再帰的にクエリします。
-
ParentId = "CM2"を使用して GSI1 にクエリを実行すると、次のようなレコードが返ってきます。ParentId
ComponentId
CM2
CM4
CM5
-
再度、
ParentId = "CM4"を使用して GSI1 にクエリを実行します。次のようなレコードが返ってきます。ParentId
ComponentId
CM4
CM8
CM9
-
再度、
ParentId = "CM5"を使用して GSI1 にクエリを実行します。次のようなレコードが返ってきます。これを繰り返します。最後のレベルに到達するまで、それぞれの
ComponentIdに対してクエリを実行します。ParentId = "<ComponentId>"を使用したクエリに結果が返されなくなったら、前の結果がツリーの最後のレベルからの結果となります。ParentId
ComponentId
CM5
CM10
-
すべての結果をマージします。
結果=[CM4, CM5] + [CM8, CM9] + [CM10]
=[CM4, CM5, CM8, CM9, CM10]
-
-
最上位コンポーネント (自動車、または CM1) の階層ツリーを格納する GSI2 をクエリします。
-
まず、最上位のコンポーネントまたは上位の祖先、および CM2 の
Pathを検索します。検索方法は、ComponentId = "CM2"を使用してベーステーブルにクエリを実行し、階層ツリー内のそのコンポーネントのパスを検索します。GraphId属性とPath 属性を選択します。クエリは次のレコードを返します。GraphId
パス
CM1#1
CM1|CM2
-
GraphId = "CM1#1" AND BEGINS_WITH("Path", "CM1|CM2|")を使用して GSI2 にクエリを実行します。クエリは次の結果を返します。GraphId
パス
ComponentId
CM1#1
CM1|CM2|CM4
CM1|CM2|CM5
CM1|CM2|CM4|CM8
CM1|CM2|CM4|CM9
CM1|CM2|CM5|CM10
CM4
CM5
CM8
CM9
CM10
-
CM2 のすべての子コンポーネントを返すには、
ComponentId属性を選択します。
-
-