ステップ 5: DynamoDB のデータモデルを作成する
ベーステーブルとグローバルセカンダリインデックス (GSI) のパーティションキーを定義します。
-
主要な設計上のベストプラクティスに従い、この例ではベーステーブルのパーティションキーとして
ComponentIdを使用してください。一意の ID であるため、ComponentIdできめ細かく定義を実現できます。DynamoDB は、パーティションキーのハッシュ値を使用して、データが物理的に保存されるパーティションを決定します。一意のコンポーネント ID を使用することで、異なるハッシュ値が生成されるため、テーブル内でデータの分散が容易になります。ComponentIdパーティションキーを使用して、ベーステーブルにクエリを実行できます。 -
コンポーネントの直接の子を検索するには、
ParentIdがパーティションキーで、ComponentIdがソートキーである GSI を作成します。ParentIdをパーティションキーとして使用することで、この GSI のクエリを実行できます。 -
コンポーネントの再帰的な子をすべて検索するには、
GraphIdがパーティションキーで、Pathがソートキーの GSI を作成します。この GSI に対してクエリを実行するには、パーティションキーのGraphIdとソートキーのBEGINS_WITH(Path, "$path")演算子を使用することで実行できます。
パーティションキー |
ソートキー |
マッピング属性 |
|
ベーステーブル |
|
|
|
GSI1 |
|
|
|
GSI2 |
|
|
|
コンポーネントをテーブルに格納
次に、DynamoDB ベーステーブルに各コンポーネントを格納します。サンプルツリーからすべてのコンポーネントを挿入すると、次のベーステーブルが作成されます。
ComponentId |
ParentId |
GraphId |
パス |
CM1 |
CM1#1 |
CM1 |
|
CM2 |
CM1 |
CM1#1 |
CM1|CM2 |
CM3 |
CM1 |
CM1#1 |
CM1|CM3 |
CM4 |
CM2 |
CM1#1 |
CM1|CM2|CM4 |
CM5 |
CM2 |
CM1#1 |
CM1|CM2|CM5 |
CM6 |
CM3 |
CM1#1 |
CM1|CM3|CM6 |
CM7 |
CM3 |
CM1#1 |
CM1|CM3|CM7 |
CM8 |
CM4 |
CM1#1 |
CM1|CM2|CM4|CM8 |
CM9 |
CM4 |
CM1#1 |
CM1|CM2|CM4|CM9 |
CM10 |
CM5 |
CM1#1 |
CM1|CM2|CM5|CM10 |
GSI1 インデックス
コンポーネントの直接の子をすべてチェックするには、パーティションキーとして ParentId を使用、ソートキーとして ComponentId を使用してインデックスを作成します。次のピボットテーブルは、GSI1 インデックスを表しています。このインデックスを使用すれば、親コンポーネント ID を使って、直接の子コンポーネントをすべて取得できます。例えば、自動車に搭載されているバッテリーの数 (CM1) や、モジュールに搭載されているセル (CM4) を調べることができます。
ParentId |
ComponentId |
CM1 |
CM2 CM3 |
CM2 |
CM4 CM5 |
CM3 |
CM6 CM7 |
CM4 |
CM8 CM9 |
CM5 |
CM10 |
GSI2 インデックス
次のピボットテーブルは、GSI2 インデックスを表しています。パーティションキーとして GraphId を使用、ソートキーとして Path を使用して構成されています。GraphI とソートキー (Path) の begins_with 演算子を使うと、コンポーネントの全系統をツリーで見ることができます。
GraphId |
パス |
ComponentId |
CM1#1 |
CM1 CM1|CM2 CM1|CM3 CM1|CM2|CM4 CM1|CM2|CM5 CM1|CM2|CM4|CM8 CM1|CM2|CM4|CM9 CM1|CM2|CM5|CM10 CM1|CM3|CM6 CM1|CM3|CM7 |
CM1 CM2 CM3 CM4 CM5 CM8 CM9 CM10 CM6 CM7 |