问题描述
我正在尝试遵循社交网络的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长度),也包括属性值长度(同样是二进制长度)。属性名称计入大小限制。"
换句话说,有时您将无法保存更多主题或帖子。
没有。选中此docs。它声明:"每个主键属性必须是标量(即它只能容纳单个值)。主键属性只允许使用字符串、数字或二进制数据类型。其他非键属性没有这样的限制。"
我认为你不应该分成两张桌子。您可以这样对DynamoDB建模,并且只保留一个表:
在您的表中使用
hashKey
和sortKey
。按如下方式保存您的组项目:
- HashKey:Group(字符串
group
,不是变量) - sortKey:
groupId
- 名称:
groupName
- HashKey:Group(字符串
以此方式保存您的主题项目:
- HashKey:
groupId
- sortKey:
topicId
- 名称:
topicName
- HashKey:
按如下方式保存您的帖子项目:
- HashKey:
topicId
- sortKey:
postId
- 作者:
author
- 消息:
message
- HashKey:
以此方式保存评论项目:
- HashKey:
postId
- sortKey:
commentId
- 作者:
author
- 消息:
message
- HashKey:
这样,如果您要检索单个项目,您可以使用完整密钥hashKey
和rangeKey
运行一个GetItem。
hashKey
,并根据需要将其限制为10(docs关于查询限制)。最后,如果您想按时间(在您的案例中是最近的时间)查询,您可以在排序关键字前面加上日期/时间。比如2019-08-11-22-03-03_SOME_STRING
。检查此docs关于使用时间的查询。
这篇关于嵌套数组(属性)上的分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!