我正在尝试创建一个dynamoDB表结构,以对应用程序的用户和组进行建模。
条件:
我想我有一个很好的关系思考能力,我很好奇您是否可以在Dynamo中建模类似的东西。
我想到了这样的东西:
表:appId(PK)groupName(SK)用户名(SK)details1 details2
但是我看到发电机中只能有一个PK和一个SK
然后我想到了这样的东西:
表:appId(PK)groupName#username(SK)details1 details2
但这似乎不是一个好主意(组不能有用户,用户不能有组,例如,我不知道如何从组中获取所有用户)
您如何在Dynamo中建模类似的东西?
答案 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会随着数据的任何更改使索引保持最新。