我正在尝试遵循社交网络的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建模,并且只保留一个表:
在您的表中使用hashKey和sortKey。
按如下方式保存您的组项目:
- HashKey:Group(字符串group,不是变量)
- sortKey:groupId
- 名称:groupName
以此方式保存您的主题项目:
- HashKey:groupId
- sortKey:topicId
- 名称:topicName
按如下方式保存您的帖子项目:
- HashKey:topicId
- sortKey:postId
- 作者:author
- 消息:message
以此方式保存评论项目:
- HashKey:postId
- sortKey:commentId
- 作者:author
- 消息:message
这样,如果您要检索单个项目,您可以使用完整密钥hashKey和rangeKey运行一个GetItem。
相反,如果您希望使用分页进行查询,则只需在查询中提供hashKey,并根据需要将其限制为10(docs关于查询限制)。最后,如果您想按时间(在您的案例中是最近的时间)查询,您可以在排序关键字前面加上日期/时间。比如2019-08-11-22-03-03_SOME_STRING。检查此docs关于使用时间的查询。
更多推荐
嵌套数组(属性)上的分页
发布评论