快速背景-我想存储所有可能的基于5个字符的64位产品。因此,AAAAA,Afjsfs,00ZZ0等。
我希望能够随机抓取1000个,然后从数据库中删除它们,以便不再使用它们。
微不足道地生成和改组它们。如果将它们存储在RDBMS中,则可以使用auto-inc Int ID(前1000个),然后删除记录。假设我将它们随机分配,那完全可以。
我想看看用DynamoDB完成它是否可行,还是最好将问题留给RDBMS。
我可以将Int ID用作键,将5个字符的字符串用作值,并执行类似的操作。
除非我有误会,否则我不能只获取步行键并获取1000条记录吗?我需要提供一把钥匙。听起来不错,除了现在我必须在应用程序层维护数据库状态或引入另一个表以跟踪已迭代和删除的ID。
答案 0 :(得分:0)
您可以执行以下操作:
(1)每个项目都会有一个固定的分区键(即所有项目的分区键值相同。确切的值并不重要,只要所有项目都相同,所以我们假设它只是字符串"foo"
)。
(2)排序键将是随机的,例如随机生成的32位整数。
(3)以5个字符为基数的64个字符串将存储在第三个属性(既不是分区也不是排序键)中
当您要获取1000个随机项时,需要在分区键= "foo"
上发出DynamoDB query
。查询返回的项目按排序键排序。由于您选择了随机排序键(请参阅上面的(2)),因此您将获得1000个随机项。
所有5个字符的基数为64的集合的大小为2^30
。因此,您的排序键必须足够大以存储2 ^ 30个项目。因此,实用地选择一个随机的32位int就足够了。但是,如果需要确保选择的1000个项实际上是随机的,则可能需要选择随机性比运行时的随机函数更好的东西。例如,您可以基于存储的基数64计算sha-384
,并将其用作排序键值。 max length of a sort key is 1024 bytes因此384位完全在限制之内。
尤其不要将UUID用作排序键。 UUID通常不是那么随机。