用户组的 DynamoDB 表结构

Ale*_*ex 5 amazon-web-services amazon-dynamodb

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

状况:

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

我认为我有很强的关系思维,我很好奇你是否可以在 Dynamo 中建模类似的东西。

我想到了这样的事情:

表:appId(PK) 组名(SK) 用户名​​(SK) 详细信息1 详细信息2

但我发现你在dynamo中只能有一个PK和一个SK

然后我想到了这样的事情:

表:appId(PK) 组名#用户名(SK) 详细信息1 详细信息2

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

您将如何在 Dynamo 中为这样的东西建模?

小智 3

这很大程度上取决于您需要支持哪些数据查询,在 NoSQL 模型中您必须比在关系模型中更仔细地考虑这一点。

就我个人而言,我可能会首先为组和用户创建两个表,每个表都以 appId (PK) 和 groupId/userId (SK) 为键,并使用其他属性来获取详细信息。然后在 users 表中,我将有一个字段 userGroups 作为 StringSet,其中包含用户所在组的 id 列表。这使您能够查询:

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

如果执行最终查询(给定应用程序中给定组的所有用户)很少发生(或者每个应用程序的用户数量很少),则可以对以 appId 为键的用户表执行扫描操作并过滤用户组字段。如果该查询的性能更重要,但每个组的用户数量不太大,您可以在 groups 表中创建一个镜像 groupUsers StringSet 字段作为镜像,并在应用程序级别保持这两个字段同步,或通过使用 DynamoDb Streams 从一个复制到另一个。

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