用户组的DynamoDB表结构

时间:2018-09-24 10:06:31

标签: amazon-web-services amazon-dynamodb

我正在尝试创建一个dynamoDB表结构,以对应用程序的用户和组进行建模。

条件:

  • 每个用户/组都是应用程序的一部分
  • 每个组可以有多个用户
  • 每个用户可以在多个组中
  • 用户可以分组,也可以不分组
  • 组可以为空

我想我有一个很好的关系思考能力,我很好奇您是否可以在Dynamo中建模类似的东西。

我想到了这样的东西:

  

表:appId(PK)groupName(SK)用户名(SK)details1 details2

但是我看到发电机中只能有一个PK和一个SK

然后我想到了这样的东西:

  

表:appId(PK)groupName#username(SK)details1 details2

但这似乎不是一个好主意(组不能有用户,用户不能有组,例如,我不知道如何从组中获取所有用户)

您如何在Dynamo中建模类似的东西?

1 个答案:

答案 0 :(得分:0)

这在很大程度上取决于您需要对数据支持哪些查询,这是您在NoSQL模型中比在关系模型中要更加仔细地考虑的问题。

就个人而言,我可能会从针对组和用户的两个表开始,每个表分别由appId(PK)和groupId / userId(SK)键,以及其他用于详细信息的属性。然后,在用户表中,我将有一个字段userGroups作为StringSet,其中包含用户所在的组的ID列表。这使您可以查询:

  • 给定应用程序中的所有用户
  • 给定应用程序中的所有组
  • 给定应用程序中给定用户的所有组(因此给定用户是否在特定组中)

如果执行最终查询(给定应用程序中给定组的所有用户)的情况很少(或者每个应用程序的用户数很小),则可以对由appId键控的users表执行Scan操作并在userGroups字段上进行过滤。如果该查询的性能更为重要,但是每个组的用户数量不是太大,则可以在groups表中具有一个镜像groupUsers StringSet字段作为镜像,并在应用程序级别使这两个字段保持同步,或使用DynamoDb流从一个复制到另一个。

或者您可以将映射分离到一个单独的表中,与在关系数据库中非常相似。您可以通过appId(PK)userId(SK)键入此表,然后在appId(PK)groupId(SK)上创建全局二级索引,以允许在另一个方向上进行查询。 AWS会随着数据的任何更改使索引保持最新。