我是DynamoDB的新手并试图理解关系。
我有一个包含用户,列表和项目的待办事项应用程序。
我创建了3个dynamoDB表,一个用于用户,一个用于列表,一个用于项目。
为简单起见,以用户/列表为例。用户的主键是userId。列表主键是listId。用户可以有许多列表。列表可以在用户之间共享,因此列表可以包含许多用户。
那么列表是否应该作为listId的数组保存在用户项目中?然后,当我得到一个用户时,我迭代了listId的数组并得到所有列表?
用户可以拥有许多列表,而这些列表又可以包含许多项目,因此我不想将整个列表保存在用户项目中。此列表也可由许多用户共享。
我试图搜索关系,但他们似乎都是这样假设读者对NOSQL数据库有一个广泛的想法,我不这样做。
答案 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中还有其他多对多关系的方法,但这是一个很好的起点。