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

Ahm*_*man 1 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: [
          {
            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
Run Code Online (Sandbox Code Playgroud)

我可以对帖子或评论数组进行分页吗?
因为我会(理论上)在 post 数组中有很多帖子,所以我必须阅读大量数据,而实际上我只想阅读最新的 10 个帖子。帖子中的数组评论也是如此。有没有可能对这些数组进行分页?

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


我有一种感觉,我应该将表格至少一分为二。有了这个,我可以使用 topicname 作为 partitionkey 和 group name 作为排序键。但我对 nosql dbs 真的很陌生,我学到的是你应该只使用一张表。你有什么意见 ?

Ped*_*tes 6

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

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

您的模型还有另一个大问题:您的组可以无限增加,DynamoDB 项目的最大大小为 400 KB。检查此文档

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

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

我可以将主题数组中的属性“name”用作 sortKey 吗?(主题名称)

不。检查这个文档。它指出:“每个主键属性必须是一个标量(意味着它只能包含一个值)。主键属性允许的唯一数据类型是字符串、数字或二进制。对于其他、非-关键属性。”

我有一种感觉,我应该将表格至少一分为二。有了这个,我可以使用 topicname 作为 partitionkey 和 group name 作为排序键。

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

  1. 在您的表中使用hashKeysortKey

  2. 像这样保存您的群组项目:

    • hashKey:组(它是字符串group而不是变量)
    • 排序键: groupId
    • 姓名: groupName
  3. 以这种方式保存您的主题项目:

    • 散列键: groupId
    • 排序键: topicId
    • 姓名: topicName
  4. 像这样保存您的帖子项目:

    • 散列键: topicId
    • 排序键: postId
    • 作者: author
    • 信息: message
  5. 以这种方式保存您的评论项目:

    • 散列键: postId
    • 排序键: commentId
    • 作者: author
    • 信息: message

这样,如果您想检索单个项目,请使用完整键运行 GetItem:hashKeyrangeKey

相反,如果您想使用分页进行查询,则仅hashKey在查询中提供并根据需要将其限制为 10(有关查询限制的文档)。

最后,如果你想按时间查询,在你的情况下是最近的,你可以用日期/时间作为排序键的前缀。例如,2019-08-11-22-03-03_SOME_STRING。检查有关使用时间查询的文档