使用 dynamodb 或 docuemntdb 对具有嵌入式集合的邀请模式进行建模
Modeling an invite schema with embedded collections with dynamodb or docuemntdb
我正在研究是否使用 AWS DynamoDb 或 Azure DocumentDb 或 google 云来为我的应用程序提供价格和简单性,并且想知道典型邀请架构的最佳方法是什么。
一个邀请有
- userId : 密钥(创建邀请的人)
- gameId : 键
- 邀请列表:用户 ID 集合
我会运行的查询是
- 获取用户 ID == 我的邀请
- 获取邀请列表中我的 userId 所在的位置
在Mongo中,我只是在嵌入的invitationList上设置一个索引,在SQL中,我会设置一个加入table的gameId和invited UserIds。
使用 dynamodb 或 documentdb,我可以在一个 "table" 中执行此操作,还是我必须设置第二个非规范化 table 一个,每行有一个邀请的 UserId 和一组 invitedGameIds?
例如
二级 table 和
- InvitedUserId : key
- GameIds : 集合
对于 DocumentDB,您可能只需将其保存在每个邀请用户的一个文档中
其中文档 ID 可以等于邀请用户的密钥。如果你有很多游戏,你可以使用 gameId 作为 partitionKey。
{
"id" : "gameKey+invitingUserKey",
"gameKey" : "someGameKey",
"invitingUserId": "key",
"invites": ["inviteKey1", "inviteKey2"]
}
这是基于 user/gameKey 的有限邀请数。然而,在不知道查询模式的情况下很难确定结构。我发现查询模式通常决定文档结构。
与 hslriksen 的回答类似,如果满足某些条件,我建议您将所有这些非规范化到一个文档中。这些标准是:
- 游戏的邀请列表不能无限增长。
- 即使有界,最大长度数组是否符合文档和交易限制。
不过,与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
布尔字段来区分它们。
我正在研究是否使用 AWS DynamoDb 或 Azure DocumentDb 或 google 云来为我的应用程序提供价格和简单性,并且想知道典型邀请架构的最佳方法是什么。
一个邀请有
- userId : 密钥(创建邀请的人)
- gameId : 键
- 邀请列表:用户 ID 集合
我会运行的查询是
- 获取用户 ID == 我的邀请
- 获取邀请列表中我的 userId 所在的位置
在Mongo中,我只是在嵌入的invitationList上设置一个索引,在SQL中,我会设置一个加入table的gameId和invited UserIds。
使用 dynamodb 或 documentdb,我可以在一个 "table" 中执行此操作,还是我必须设置第二个非规范化 table 一个,每行有一个邀请的 UserId 和一组 invitedGameIds?
例如
二级 table 和
- InvitedUserId : key
- GameIds : 集合
对于 DocumentDB,您可能只需将其保存在每个邀请用户的一个文档中 其中文档 ID 可以等于邀请用户的密钥。如果你有很多游戏,你可以使用 gameId 作为 partitionKey。
{
"id" : "gameKey+invitingUserKey",
"gameKey" : "someGameKey",
"invitingUserId": "key",
"invites": ["inviteKey1", "inviteKey2"]
}
这是基于 user/gameKey 的有限邀请数。然而,在不知道查询模式的情况下很难确定结构。我发现查询模式通常决定文档结构。
与 hslriksen 的回答类似,如果满足某些条件,我建议您将所有这些非规范化到一个文档中。这些标准是:
- 游戏的邀请列表不能无限增长。
- 即使有界,最大长度数组是否符合文档和交易限制。
不过,与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
布尔字段来区分它们。