使用 dynamodb 或 docuemntdb 对具有嵌入式集合的邀请模式进行建模

Modeling an invite schema with embedded collections with dynamodb or docuemntdb

我正在研究是否使用 AWS DynamoDb 或 Azure DocumentDb 或 google 云来为我的应用程序提供价格和简单性,并且想知道典型邀请架构的最佳方法是什么。

一个邀请有

我会运行的查询是

  1. 获取用户 ID == 我的邀请
  2. 获取邀请列表中我的 userId 所在的位置

在Mongo中,我只是在嵌入的invitationList上设置一个索引,在SQL中,我会设置一个加入table的gameId和invited UserIds。

使用 dynamodb 或 documentdb,我可以在一个 "table" 中执行此操作,还是我必须设置第二个非规范化 table 一个,每行有一个邀请的 UserId 和一组 invitedGameIds?

例如

二级 table 和

对于 DocumentDB,您可能只需将其保存在每个邀请用户的一个文档中 其中文档 ID 可以等于邀请用户的密钥。如果你有很多游戏,你可以使用 gameId 作为 partitionKey。

{ 
  "id" : "gameKey+invitingUserKey",
  "gameKey" : "someGameKey",
  "invitingUserId": "key",
  "invites": ["inviteKey1", "inviteKey2"]
}

这是基于 user/gameKey 的有限邀请数。然而,在不知道查询模式的情况下很难确定结构。我发现查询模式通常决定文档结构。

与 hslriksen 的回答类似,如果满足某些条件,我建议您将所有这些非规范化到一个文档中。这些标准是:

  1. 游戏的邀请列表不能无限增长。
  2. 即使有界,最大长度数组是否符合文档和交易限制。

不过,与hslriksen不同的是,我建议示例文档如下所示:

{
  gameId: <some game key>,
  userId: <some user id>,
  invitationList: [<user id 1>, <user id 2>, ...]
}

您可能还决定使用游戏的内置 id 字段,在这种情况下,上面的名称是错误的。

我的建议与 hslriksen 的主要区别在于 invitationsList 是纯外键数组。这将允许索引用于查询中的 ARRAY_CONTAINS 子句。

请注意,在 DocumentDB 中,您倾向于将所有实体类型存储在同一个大桶中,并仅使用字符串 type 字段或更好的 is_my_type 布尔字段来区分它们。