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 真的很陌生,我学到的是你应该只使用一张表。你有什么意见 ?
我可以对帖子或评论数组进行分页吗?
不。您的模型有一个您称为组的项目。当您的服务器运行 GetItem 时,会为您返回所有主题,并且在主题内部,也会返回所有评论。
您的模型还有另一个大问题:您的组可以无限增加,DynamoDB 项目的最大大小为 400 KB。检查此文档:
“DynamoDB 中的最大项目大小为 400 KB,其中包括属性名称二进制长度(UTF-8 长度)和属性值长度(同样是二进制长度)。属性名称计入大小限制。”
换句话说,在某些时候,您将无法保存更多主题或帖子。
我可以将主题数组中的属性“name”用作 sortKey 吗?(主题名称)
不。检查这个文档。它指出:“每个主键属性必须是一个标量(意味着它只能包含一个值)。主键属性允许的唯一数据类型是字符串、数字或二进制。对于其他、非-关键属性。”
我有一种感觉,我应该将表格至少一分为二。有了这个,我可以使用 topicname 作为 partitionkey 和 group name 作为排序键。
我认为你不应该分成两张桌子。您可以通过这种方式为 DynamoDB 建模并只保留一张表:
在您的表中使用hashKey和sortKey。
像这样保存您的群组项目:
group而不是变量)groupIdgroupName以这种方式保存您的主题项目:
groupIdtopicIdtopicName像这样保存您的帖子项目:
topicIdpostIdauthormessage以这种方式保存您的评论项目:
postIdcommentIdauthormessage这样,如果您想检索单个项目,请使用完整键运行 GetItem:hashKey和rangeKey。
相反,如果您想使用分页进行查询,则仅hashKey在查询中提供并根据需要将其限制为 10(有关查询限制的文档)。
最后,如果你想按时间查询,在你的情况下是最近的,你可以用日期/时间作为排序键的前缀。例如,2019-08-11-22-03-03_SOME_STRING。检查有关使用时间查询的文档。
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |