Amazon dynamodb 使用dynamodb或docuemntdb为带有嵌入式集合的invite模式建模

Amazon dynamodb 使用dynamodb或docuemntdb为带有嵌入式集合的invite模式建模,amazon-dynamodb,google-cloud-datastore,azure-cosmosdb,Amazon Dynamodb,Google Cloud Datastore,Azure Cosmosdb,我正在调查是否使用AWS DynamoDb、Azure DocumentDb或google cloud来提高我的应用程序的价格和简单性,我想知道对于典型的邀请模式,最好的方法是什么 邀请已经结束 userId:key(谁创建了邀请) gameId:key 邀请列表:用户ID的集合 我将运行的查询是 获取邀请,其中userId==me 在邀请列表中我的用户ID所在的位置获取邀请 在Mongo中,我只需在嵌入式邀请列表上设置一个索引,在SQL中,我将设置gameId和邀请用户ID的连接表 使用d

我正在调查是否使用AWS DynamoDb、Azure DocumentDb或google cloud来提高我的应用程序的价格和简单性,我想知道对于典型的邀请模式,最好的方法是什么

邀请已经结束

  • userId:key(谁创建了邀请)
  • gameId:key
  • 邀请列表:用户ID的集合
我将运行的查询是

  • 获取邀请,其中userId==me
  • 在邀请列表中我的用户ID所在的位置获取邀请
  • 在Mongo中,我只需在嵌入式邀请列表上设置一个索引,在SQL中,我将设置gameId和邀请用户ID的连接表

    使用dynamodb或documentdb,我可以在一个“表”中完成这项工作,还是必须设置第二个非规范化的表,即每行有一个邀请的UserId和一组邀请的gameid

    e、 g

    一张有桌子的二等桌

    • 被邀请者:钥匙
    • 配子:集合

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

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

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

    与hslriksen的回答类似,如果满足某些标准,我建议您将所有这些内容反规范化为一个文档。这些标准是:

  • 奥运会的邀请者不能无限期地成长
  • 即使它是有界的,最大长度数组是否适合文档和事务限制
  • 但是,与hslriksen不同,我建议示例文档如下所示:

    {
      gameId: <some game key>,
      userId: <some user id>,
      invitationList: [<user id 1>, <user id 2>, ...]
    }
    
    {
    配子体:,
    用户ID:,
    邀请者:[,…]
    }
    
    您还可以决定在游戏中使用内置的
    id
    字段,在这种情况下,上面的名称是错误的

    我的建议与hslriksen的关键区别在于,邀请列表是一个纯外键数组。这将允许索引用于查询中的ARRAY_CONTAINS子句


    注意,在DocumentDB中,您倾向于将所有实体类型存储在同一个大存储桶中,只需使用字符串
    type
    字段或稍好一点的
    字段来区分它们。

    我已经更新了问题,以包括典型的查询。在这种情况下,我将如何运行查询以获取所有邀请我参加的游戏?我不能对invitedUserId进行索引,对吗?基于此,我将为invitedUserId使用普通数组。我已经更新了我的答案。它或多或少与Larry的相同。ARRAY_CONTAINS子句是否有效,因为它将使用索引?还是必须扫描整个表?ARRAY_CONTAINS将使用索引,因此它应该是有效的。这就是我改变hslriksen建议的主要原因。是否所有嵌入数组都在documentdb中默认索引,还是必须显式设置?