Amazon web services 嵌套数组(属性)上的分页

Amazon web services 嵌套数组(属性)上的分页,amazon-web-services,nosql,amazon-dynamodb,dynamodb-queries,Amazon Web Services,Nosql,Amazon Dynamodb,Dynamodb Queries,我试图在我的社交网络nosql db模型中遵循一个表的原则。但这给我带来了很多问题。假设我的模型现在看起来像这样: Table-Groups { name: "Group1" topics: [ name: "Topic1" posts: [ { id: "tid1" author: "Walter White" message: "Hello from Post1" comments: [

我试图在我的社交网络nosql db模型中遵循一个表的原则。但这给我带来了很多问题。假设我的模型现在看起来像这样:

Table-Groups
{
  name: "Group1"
  topics: [
    name: "Topic1"
    posts: [
      {
        id: "tid1"
        author: "Walter White"
        message: "Hello from Post1"
        comments: [
          {
            id: "cid1"
            author: "Jessy"
            message: "Yo nice post Mr. White"
          }
          {
            id: "cid2"
            author: "Saul"
            message: "Jeze Walt"
          }
        ]
      }
      //... Many other posts here    
    ]
      //... Many other topics within the group
  ]
}
//... Not so many other groups
我是否可以为post或comments数组分页? 因为理论上我会在post数组中有很多post,所以我需要阅读很多数据,实际上我只想阅读最近的10篇post。文章中的数组注释也是如此。是否有可能对这些数组进行分页

我可以将主题数组中的属性名用作sortKey吗?topic.name 有没有办法将嵌套数组的属性用作排序键?在我的示例中,一个组中有许多主题。因此,如果允许拆分表,使用主题名作为排序键甚至分区键是有意义的

我觉得我应该把桌子至少一分为二。这样,我就可以使用topicname作为分区键,使用group name作为排序键。但我对nosql dbs真的很陌生,我学到的是,您应该只使用一个表。你的意见是什么

我是否可以为post或comments数组分页

不可以。您的模型有一个您称为组的项目。当您的服务器运行GetItem时,会返回所有主题,并且在主题内部还会返回所有注释

在您的模型中还有另一个大问题:您的组可以无限期地增加,DynamoDB项目的最大大小是400KB。检查:

DynamoDB中的最大项大小为400kb,其中包括属性名称二进制长度UTF-8长度和属性值长度二进制长度。属性名称计入大小限制

换句话说,在某些时候,您将无法保存更多的主题或帖子

我可以将主题数组中的属性名用作sortKey吗?topic.name

不,看看这个。它声明:每个主键属性必须是标量,这意味着它只能保存一个值。主键属性只允许使用字符串、数字或二进制数据类型。其他非关键属性没有此类限制

我觉得我应该把桌子至少一分为二。这样,我就可以使用topicname作为分区键,使用group name作为排序键

我认为你不应该分成两张桌子。您可以用这种方式为DynamoDB建模,并且只保留一个表:

在表中使用hashKey和sortKey

按如下方式保存您的组项目:

Table-Groups
{
  name: "Group1"
  topics: [
    name: "Topic1"
    posts: [
      {
        id: "tid1"
        author: "Walter White"
        message: "Hello from Post1"
        comments: [
          {
            id: "cid1"
            author: "Jessy"
            message: "Yo nice post Mr. White"
          }
          {
            id: "cid2"
            author: "Saul"
            message: "Jeze Walt"
          }
        ]
      }
      //... Many other posts here    
    ]
      //... Many other topics within the group
  ]
}
//... Not so many other groups
hashKey:group它是字符串组,不是变量 sortKey:groupId 名称:groupName 以以下方式保存您的主题项目:

hashKey:groupId 排序键:topicId 名称:topicName 按如下方式保存您的帖子:

Table-Groups
{
  name: "Group1"
  topics: [
    name: "Topic1"
    posts: [
      {
        id: "tid1"
        author: "Walter White"
        message: "Hello from Post1"
        comments: [
          {
            id: "cid1"
            author: "Jessy"
            message: "Yo nice post Mr. White"
          }
          {
            id: "cid2"
            author: "Saul"
            message: "Jeze Walt"
          }
        ]
      }
      //... Many other posts here    
    ]
      //... Many other topics within the group
  ]
}
//... Not so many other groups
hashKey:topicId 排序键:posted 作者:作者 信息:信息 以以下方式保存您的评论项目:

hashKey:posted sortKey:commentId 作者:作者 信息:信息 这样,如果要检索单个项,可以使用完整键运行GetItem:hashKey和rangeKey

相反,如果要使用分页进行查询,则只需在查询中提供hashKey,并根据查询限制将其限制为10

最后,如果您想按时间(在您的案例中是最新的)进行查询,您可以在排序键前面加上日期/时间前缀。例如,2019-08-11-22-03-03_一些_字符串。关于使用时间的查询,请勾选此项

我是否可以为post或comments数组分页

不可以。您的模型有一个您称为组的项目。当您的服务器运行GetItem时,会返回所有主题,并且在主题内部还会返回所有注释

在您的模型中还有另一个大问题:您的组可以无限期地增加,DynamoDB项目的最大大小是400KB。检查:

DynamoDB中的最大项大小为400kb,其中包括属性名称二进制长度UTF-8长度和属性值长度二进制长度。属性名称计入大小限制

换句话说,在某些时候,您将无法保存更多的主题或帖子

我可以将主题数组中的属性名用作sortKey吗?topic.name

不,看看这个。它声明:每个主键属性必须是标量,这意味着它只能保存一个值。主键属性只允许使用字符串、数字或二进制数据类型。其他非关键属性没有此类限制

我觉得我应该把桌子至少一分为二。这样,我就可以使用topicname作为分区键,使用group name作为排序键

我认为你不应该分成两张桌子。您可以用这种方式为DynamoDB建模,并且只保留一个表:

在表中使用hashKey和sortKey

按如下方式保存您的组项目:

Table-Groups
{
  name: "Group1"
  topics: [
    name: "Topic1"
    posts: [
      {
        id: "tid1"
        author: "Walter White"
        message: "Hello from Post1"
        comments: [
          {
            id: "cid1"
            author: "Jessy"
            message: "Yo nice post Mr. White"
          }
          {
            id: "cid2"
            author: "Saul"
            message: "Jeze Walt"
          }
        ]
      }
      //... Many other posts here    
    ]
      //... Many other topics within the group
  ]
}
//... Not so many other groups
hashKey:group它是字符串组,不是变量 sortKey:groupId 名称:groupName 以以下方式保存您的主题项目:

hashKey:groupId 排序键:topicId 名称:topicName 按如下方式保存您的帖子:

Table-Groups
{
  name: "Group1"
  topics: [
    name: "Topic1"
    posts: [
      {
        id: "tid1"
        author: "Walter White"
        message: "Hello from Post1"
        comments: [
          {
            id: "cid1"
            author: "Jessy"
            message: "Yo nice post Mr. White"
          }
          {
            id: "cid2"
            author: "Saul"
            message: "Jeze Walt"
          }
        ]
      }
      //... Many other posts here    
    ]
      //... Many other topics within the group
  ]
}
//... Not so many other groups
hashKey:topicId 排序键:posted 作者:作者 迈萨 ge:留言 以以下方式保存您的评论项目:

hashKey:posted sortKey:commentId 作者:作者 信息:信息 这样,如果要检索单个项,可以使用完整键运行GetItem:hashKey和rangeKey

相反,如果要使用分页进行查询,则只需在查询中提供hashKey,并根据查询限制将其限制为10


最后,如果您想按时间(在您的案例中是最新的)进行查询,您可以在排序键前面加上日期/时间前缀。例如,2019-08-11-22-03-03_一些_字符串。检查一下这个关于使用时间的查询。

就像Pedro的另一条评论一样,你很快就会陷入物品大小>400KB的问题

像dynamodb这样的nosql数据库的全部要点是,无论在单个表中有多复杂,您都应该能够对系统进行建模。但是,该表没有限制,但是您应该能够使用单个表对当前需求进行建模

尝试将组、主题、帖子和评论分开,并将它们的ID用作分区键。要实现分页,可以使用
你可以像其他评论者所指定的那样实现你的表,如果你需要不同类型的查询,也许可以添加GSI。

像Pedro所说的其他评论者一样,你很快就会陷入项目大小>400KB的问题

像dynamodb这样的nosql数据库的全部要点是,无论在单个表中有多复杂,您都应该能够对系统进行建模。但是,该表没有限制,但是您应该能够使用单个表对当前需求进行建模

尝试将组、主题、帖子和评论分开,并将它们的ID用作分区键。要实现分页,可以使用
您可以像其他评论者所指定的那样实现您的表,如果您需要不同类型的查询,还可以添加GSI。

这就是我搜索的内容。谢谢你。但我现在想的是喜欢。我怎样才能管理类似的帖子呢?这就是我搜索的内容。谢谢你。但我现在想的是喜欢。我怎样才能管理像这样的职位?