无论我在哪里看到,网络都告诉我不要在dynamoDB中使用scan()
,它使用了所有的容量单位,1 mb的响应大小等等。
我已经研究过查询,但这也不能达到我的目的。
我该如何解析我的表呢?
这是我的设置-我有一个表“人”与行的人。
我有属性“email”(分区键)、“fName”、“lName”、“display Name”、“passwordHash”和“subscribed”。
subscribed不是true就是false,我需要对订阅的每个人进行排序。
我无法使用排序键,因为所有电子邮件都是唯一的...
据我所知,DynamoDB数据按如下方式排序:
主键-
- 排序键1
---项目1 - 排序键2
---项目2
主键2 - 分类表1
..等等。
因此,将subscribed设置为sortket将不起作用...我仍然需要循环遍历每个主键。
现在,我只是用filterExpression获取每个条目,以检查是否有人订阅了。如果有人订阅了,他们就通过了。但是,如果我有数百个用户,他们的数据超过了1 mb,会发生什么呢?
在这种情况下,我无法获取订阅的每个用户,而且使用start键重复发送请求以获取每个Mb的数据对于处理器来说太繁琐了,而且会显著降低服务器的速度
对于我应该如何获得每一个订阅用户,有什么建议吗?
注意:Subscribed不能是主键,而email不能是排序键,因为我有一些示例只需要用户,如果email是主键,那么用户很容易访问。
1条答案
按热度按时间ttp71kqs1#
现在,我只是用filterExpression获取每个条目,以检查是否有人订阅了。如果有人订阅了,他们就通过了。但是,如果我有数百个用户,他们的数据超过了1mb,会发生什么呢?
GetItem用于单个人员查找
理想情况下,您应该在此处使用GetItem,方法是提供用户电子邮件作为搜索参数,然后检查他们是否已订阅。扫描以查看个人是否已订阅是不可伸缩的。
分页
当数据超过1MB时,您只需分页:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html
对于我应该如何获得每一个订阅用户,有什么建议吗?
稀疏索引
对于这个用例,最好使用稀疏索引,其中
subscribed="true"
仅在为真时才设置,如果为假则不设置(您还必须使用字符串,因为布尔值不能用作键)。一旦你这样做了,你就可以在订阅的属性上创建一个GSI,现在只有那些为真的项包含在你的GSI中,使它变得稀疏。所以在那个值上的
Scan
现在使它尽可能的高效,尽管它会将吞吐量限制在1000 WCU。让一切变得可扩展
一个更好的方法是创建一个名为
GSI_PK
的属性,并为它分配一个随机数。然后使用subscribed
作为排序键,再次使用字符串,并且仅当为true时使用。这意味着您的索引不会成为瓶颈,也不会因为分区键为单个值而将吞吐量限制为1000 WCU。https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-indexes-general-sparse-indexes.html