

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 第 5 步：创建 DynamoDB 数据模型
<a name="step5-hierarchical-model"></a>

为基表和全局二级索引定义分区键 (GSIs)：
+ 遵循密钥设计最佳实践，在本示例中`ComponentId`用作基表的分区键。`ComponentId` 可以提供粒度，因其是唯一的。DynamoDB 使用分区键的哈希值来确定物理存储数据的分区。唯一的组件 ID 会生成不同的哈希值，这有助于在表内分布数据。可以使用 `ComponentId` 分区键查询基表。
+ 要查找组件的直接子组件，请创建一个 GSI，其中 `ParentId` 是分区键，`ComponentId` 是排序键。您可以将 `ParentId` 用作分区键，以查询此 GSI。
+ 要查找组件的所有递归子级，请创建一个 GSI，其中 `GraphId` 是分区键，`Path` 是排序键。您可以将 `GraphId` 用作分区键和排序键上的 `BEGINS_WITH(Path, "$path")` 运算符来查询此 GSI。


|  |  |  |  | 
| --- |--- |--- |--- |
|  | **分区键** | **排序键** | **映射属性** | 
| **基表** | `ComponentId` |  | `ParentId`, `GraphId`, `Path` | 
| **GSI1** | `ParentId` | `ComponentId` |  | 
| **GSI2** | `GraphId` | `Path` | `ComponentId` | 

## 在表格中存储组件
<a name="store"></a>

下一步是将每个组件存储在 DynamoDB 基表中。插入示例树中的所有组件后，您将得到如下基表。


|  |  |  |  | 
| --- |--- |--- |--- |
| **ComponentId** | **ParentId** | **GraphId** | **路径** | 
|  <br />CM1 |  |  <br />CM1\#1 |  <br />CM1 | 
|  <br />CM2 |  <br />CM1 |  <br />CM1\#1 |  <br />CM1\|CM2 | 
|  <br />CM3 |  <br />CM1 |  <br />CM1\#1 |  <br />CM1\|CM3 | 
|  <br />CM4 |  <br />CM2 |  <br />CM1\#1 |  <br />CM1\|CM2\|CM4 | 
|  <br />CM5 |  <br />CM2 |  <br />CM1\#1 |  <br />CM1\|CM2\|CM5 | 
|  <br />CM6 |  <br />CM3 |  <br />CM1\#1 |  <br />CM1\|CM3\|CM6 | 
|  <br />CM7 |  <br />CM3 |  <br />CM1\#1 |  <br />CM1\|CM3\|CM7 | 
|  <br />CM8 |  <br />CM4 |  <br />CM1\#1 |  <br />CM1\|CM2\|CM4\|CM8 | 
|  <br />CM9 |  <br />CM4 |  <br />CM1\#1 |  <br />CM1\|CM2\|CM4\|CM9 | 
|  <br />CM10 |  <br />CM5 |  <br />CM1\#1 |  <br />CM1\|CM2\|CM5\|CM10 | 

## 该 GSI1 指数
<a name="gsi1-index"></a>

要检查组件的所有直接子组件，需要创建将 `ParentId` 用作分区键、将 `ComponentId` 用作排序键的索引。以下数据透视表表示该 GSI1 指数。您可以使用此索引通过父组件 ID 检索所有直接子组件。例如，您可以找出汽车中有多少可用电池 (CM1) 或模块 (CM4) 中有哪些电池可用。


|  |  | 
| --- |--- |
| **ParentId** | **ComponentId** | 
| CM1 | CM2<br />CM3 | 
| CM2 | CM4<br />CM5 | 
| CM3 | CM6<br />CM7 | 
| CM4 | CM8<br />CM9 | 
| CM5 | CM10 | 

## 该 GSI2 指数
<a name="gsi2-index"></a>

以下数据透视表表示该 GSI2 指数。它配置为将 `GraphId` 用作分区键，将 `Path` 用作排序键。使用 `GraphI`d 并对排序键 (`Path`) 执行 `begins_with` 操作，您可以在树中找到组件的完整谱系。


|  |  |  | 
| --- |--- |--- |
| **GraphId** | **路径** | **ComponentId** | 
| CM1\#1 | CM1<br />CM1\|CM2<br />CM1\|CM3<br />CM1\|CM2\|CM4<br />CM1\|CM2\|CM5<br />CM1\|CM2\|CM4\|CM8<br />CM1\|CM2\|CM4\|CM9<br />CM1\|CM2\|CM5\|CM10<br />CM1\|CM3\|CM6<br />CM1\|CM3\|CM7 | CM1<br />CM2<br />CM3<br />CM4<br />CM5<br />CM8<br />CM9<br />CM10<br />CM6<br />CM7 | 