Amazon web services 嵌套数组(属性)上的分页
我试图在我的社交网络nosql db模型中遵循一个表的原则。但这给我带来了很多问题。假设我的模型现在看起来像这样: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: [
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。这就是我搜索的内容。谢谢你。但我现在想的是喜欢。我怎样才能管理类似的帖子呢?这就是我搜索的内容。谢谢你。但我现在想的是喜欢。我怎样才能管理像这样的职位?