嵌套数组(属性)上的分页 [英] Pagination on nested arrays (attributes)

查看:18
本文介绍了嵌套数组(属性)上的分页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试遵循社交网络的NoSQL数据库模型中的"一张表"原则。但这给我带来了很多问题。
假设我现在的模型是这样的:

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数组中会有很多帖子,所以我必须阅读大量数据,而实际上我只想阅读最近的10篇帖子。POST中的数组注释也是如此。是否可以对这些数组进行分页?

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


我有一种感觉,我应该至少将表格一分为二。这样,我就可以使用topicname作为分区键,使用组名作为排序键。但是我是NoSQL DBS的新手,我学到的是您应该只使用一个表。你的意见是什么?

推荐答案

我可以对帖子或评论数组进行分页吗?

没有。您的模型有一个名为Group的项目。当您的服务器运行GetItem时,将为您返回所有主题,并且在主题内还将返回所有评论。

您的模型中还有另一个大问题:您的组可能会无限增加,而DynamoDB项的最大大小是400KB。检查this docs

"DynamoDB中的最大项大小为400 KB,其中既包括属性名称二进制长度(UTF-8长度),也包括属性值长度(同样是二进制长度)。属性名称计入大小限制。"

换句话说,有时您将无法保存更多主题或帖子。

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

没有。选中此docs。它声明:"每个主键属性必须是标量(即它只能容纳单个值)。主键属性只允许使用字符串、数字或二进制数据类型。其他非键属性没有这样的限制。"

我有一种感觉,我应该把桌子至少一分为二。这样,我就可以使用topicname作为分区键,使用组名作为排序键。

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

  1. 在您的表中使用hashKeysortKey

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

    • HashKey:Group(字符串group,不是变量)
    • sortKey:groupId
    • 名称:groupName
  3. 以此方式保存您的主题项目:

    • HashKey:groupId
    • sortKey:topicId
    • 名称:topicName
  4. 按如下方式保存您的帖子项目:

    • HashKey:topicId
    • sortKey:postId
    • 作者:author
    • 消息:message
  5. 以此方式保存评论项目:

    • HashKey:postId
    • sortKey:commentId
    • 作者:author
    • 消息:message

这样,如果您要检索单个项目,您可以使用完整密钥hashKeyrangeKey运行一个GetItem。

相反,如果您希望使用分页进行查询,则只需在查询中提供hashKey,并根据需要将其限制为10(docs关于查询限制)。

最后,如果您想按时间(在您的案例中是最近的时间)查询,您可以在排序关键字前面加上日期/时间。比如2019-08-11-22-03-03_SOME_STRING。检查此docs关于使用时间的查询。

这篇关于嵌套数组(属性)上的分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆