DynamoDB一对多和多对多结构

时间:2018-03-18 22:58:25

标签: amazon-web-services nosql amazon-dynamodb

我是DynamoDB的新手并试图理解关系。

我有一个包含用户,列表和项目的待办事项应用程序。

我创建了3个dynamoDB表,一个用于用户,一个用于列表,一个用于项目。

为简单起见,以用户/列表为例。用户的主键是userId。列表主键是listId。用户可以有许多列表。列表可以在用户之间共享,因此列表可以包含许多用户。

那么列表是否应该作为listId的数组保存在用户项目中?然后,当我得到一个用户时,我迭代了listId的数组并得到所有列表?

用户可以拥有许多列表,而这些列表又可以包含许多项目,因此我不想将整个列表保存在用户项目中。此列表也可由许多用户共享。

我试图搜索关系,但他们似乎都是这样假设读者对NOSQL数据库有一个广泛的想法,我不这样做。

1 个答案:

答案 0 :(得分:6)

在我看来,一对多关系是DynamoDB的优势之一。在您的示例中,List与其Items之间存在一对多关系。要在Dynamo中对其进行建模,可以说您有一个类似于以下内容的Item模式

{
  itemId: String,
  listId: String,
  name: String
}

您可以使用Hash键itemId创建一个Item表。这将允许您对单个项目执行所有标准CRUD操作。

如果我们还创建一个Hash键为listId且排序键为itemId的全局二级索引,则允许我们Query获取给定的所有项目列表。

在这种情况下,全局二级索引为我们提供了列表与其项目之间的一对多关系。您还可以将其视为按listId对项目进行分组。

多对多关系很难。通常,它们要求您在进行多个查询和复制数据之间做出决定。在任何一种情况下,一个好的方法可能是创建一个UserList表,其中包含一个简单的模式,如下所示

{
  userId: String,
  listId: String
}

使用userId作为您的哈希键,使用listId作为您的排序键。您可以将此表视为具有按用户ID分组的列表ID。然后,您可以使用listId作为哈希键并使用userId作为排序键创建全局二级索引。这将为您提供按列表ID分组的用户ID。此表与其GSI结合使用可为您提供多对多关系。

当然,如果您将此方法用于多对多关系,则需要向User和/或List表发出请求以获取这些对象的实际数据。要优化此操作,您需要将User和/或List数据复制到UserList表中。

在Dynamo中还有其他多对多关系的方法,但这是一个很好的起点。