

# 项目集合 - 如何在 DynamoDB 中对一对多关系建模
<a name="WorkingWithItemCollections"></a>

在 DynamoDB 中，*项目集合* 是共享相同分区键值的一组项目，这意味着项目是相关的。项目集合是在 DynamoDB 中对一对多关系建模的主要机制。项目集合只能存在于配置为使用[复合主键](HowItWorks.CoreComponents.md#HowItWorks.CoreComponents.PrimaryKey)的表和索引上。

**注意**  
项目集合可以存在于基表或二级索引中。有关项目集合如何与索引交互的更多信息，请参阅[本地二级索引中的项目集合](LSI.md#LSI.ItemCollections)。

考虑下表，其中显示三个不同的用户及其游戏内清单：

![\[三个具有不同属性的不同项目系列。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/item_collection.png)


对于每个集合中的某些项目，排序键是由用于对数据进行分组的信息组成的联接，例如 `inventory::armor`、`inventory::weapon` 或 `info`。每个项目集合可以将这些属性的不同组合作为排序键。用户 `account1234` 有 `inventory::weapons` 项目，而用户 `account1387` 没有（因为他们还没找到任何项目）。用户 `account1138` 只使用两个项目作为他们的排序键（因为他们还没有清单），而其他用户则使用三个项目。

DynamoDB 允许您有选择性地从这些项目集合中检索项目，以执行以下操作：
+ 从特定用户检索所有项目
+ 从特定用户只检索一个项目
+ 检索属于特定用户的特定类型的所有项目

## 通过使用项目集合组织数据来加快查询
<a name="WorkingWithItemCollections.Example"></a>

在此示例中，这三个项目集合中的每个项目都代表一位玩家和我们根据游戏和玩家的访问模式选择的数据模型。游戏需要什么数据？ 游戏什么时候需要数据？ 游戏需要数据的频率是多久？ 这样做的成本是多少？ 这些数据建模决策是根据对这些问题的答案作出的。

在这个游戏中，向玩家呈现了不同的武器清单页面和另一个装甲页面。当玩家打开其清单时，首先显示武器，因为我们希望该页面加载速度非常快，而后续的清单页面可以在其后加载。随着玩家获得更多游戏内项目，这些项目类型中的每种类型都可能相当大。因此，我们决定每个清单页面都是玩家在数据库中的项目集合中的自己的项目。

以下部分将详细介绍如何通过 `Query` 操作与项目集合交互。

**Topics**
+ [通过使用项目集合组织数据来加快查询](#WorkingWithItemCollections.Example)