[英]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#42
和sk begins_with("listing#")
查询给定用户的所有列表。
请注意,这会增加表的大小,因为属性值上有额外的“user”、“watching”和“listing”前缀,因此您可能需要考虑缩写这些前缀。
引用亚历克斯·德布里的话:
在 DynamoDB 中使用单个表的主要原因是使用单个请求检索多个异构项目类型。
dynamoDB 中的表,表中的每一行都是对象。
一行中的项目以 json 对象格式查看它。
该行不支持 json 数组。
分成2张桌子。 在表A中存储列表,在表B中存储列表。正确设计主键和排序键,以便它可以识别属于特定用户的记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.