繁体   English   中英

如何在 DynamoDB 中存储大型数组

[英]How to store large arrays in DynamoDB

我是 DynamoDB 的新手,我很好奇存储潜在大型数组的最佳方式是什么。

我有一个看起来像这样的用户对象:

UserId: String
Watching: Card[]
Listings: Card[]

我知道 Dynamo 中的对象大小是有限制的——我认为是 1MB? 因此,我认为如果用户有很多列表,它可能会超过这个限制。 存储这样的潜在大型数组的最佳做法是什么? 是否可能存储一个 CardIds 数组,然后进行第二次查询以从中获取卡片?

DynamoDB 中的对象限制为400 KB ,请参阅DynamoDB 配额

对于较大的属性值,AWS 建议以 GZIP 等格式压缩属性,并将其以二进制形式存储在 DynamoDB 中。 其他选项是以 JSON 格式将项目存储在 S3 中,并将此文件的密钥存储在 DynamoDB 中。

请参阅: 存储大型项目和属性的最佳实践

可能,第三种选择是以某种方式拆分您的数组,并在 DynamoDB 中创建多个条目。 或者尝试为单独的属性创建单独的表,如果例如Listings数组的大小大于对象限制本身,这显然不会解决问题。

一种选择是使用单表设计方法,其中所有用户、观看次数和列表都在同一个表中。

用户项目将有一个用户#uid 的主键和user#uid user#uid的 sk(与 pk 相同),每个观看项目将有一个user#uid的 pk 和watching#wid的 sk,并且每个列表都有一个 pk listing#lid #lid 的user#uid和 sk。

例如:

PK sk 其他属性
用户#1 用户#1 是的
用户#2 用户#2 是的
用户#42 用户#42 是的
用户#42 观看#12 可选的
用户#42 观看#29 可选的
用户#42 清单#901 可选的
用户#42 清单#472 可选的

这种方法对观看或列出关系的数量没有真正的限制。

然后,您只需发出对pk=user#42的查询即可查询给定用户的所有项目,这将产生用户以及所有相关的观看和列表项目(尽管有分页)。 您可以使用pk=user#42sk begins_with("listing#")查询给定用户的所有列表。

请注意,这会增加表的大小,因为属性值上有额外的“user”、“watching”和“listing”前缀,因此您可能需要考虑缩写这些前缀。

引用亚历克斯·德布里的话:

在 DynamoDB 中使用单个表的主要原因是使用单个请求检索多个异构项目类型。

dynamoDB 中的表,表中的每一行都是对象。

一行中的项目以 json 对象格式查看它。

该行不支持 json 数组。

分成2张桌子。 在表A中存储列表,在表B中存储列表。正确设计主键和排序键,以便它可以识别属于特定用户的记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM