Amazon dynamodb DynamoDB-获取N个随机项?(图式问题)

Amazon dynamodb DynamoDB-获取N个随机项?(图式问题),amazon-dynamodb,Amazon Dynamodb,快速背景-我想存储每一个可能的5个字符的base 64产品。所以,AAAAA,Afjsfs,00ZZ0等等 我希望能够随机抓取1000个,然后从数据库中删除它们,这样它们就不会被再次使用 生成和洗牌这些是很简单的。如果我将它们存储在RDBMS中,我可以使用auto inc Int ID,第一个1000,然后删除记录。假设我把它们随机地放在一起,那完全有效 我想看看使用DynamoDB是否可行,或者这个问题最好留给RDBMS解决 我可以使用Int-ID作为键,5个字符的字符串作为值,并执行类似的操

快速背景-我想存储每一个可能的5个字符的base 64产品。所以,AAAAA,Afjsfs,00ZZ0等等

我希望能够随机抓取1000个,然后从数据库中删除它们,这样它们就不会被再次使用

生成和洗牌这些是很简单的。如果我将它们存储在RDBMS中,我可以使用auto inc Int ID,第一个1000,然后删除记录。假设我把它们随机地放在一起,那完全有效

我想看看使用DynamoDB是否可行,或者这个问题最好留给RDBMS解决

我可以使用Int-ID作为键,5个字符的字符串作为值,并执行类似的操作


除非我误会了,否则我不能只拿走步钥匙,然后抓取1000张唱片,可以吗?我需要提供一把钥匙。听起来不错,但现在我必须在应用层维护DB状态,或者引入另一个表来跟踪我迭代和删除的ID。

您可以执行以下操作:

(1) 每个项目都有一个固定的分区键(对于所有项目都是相同的分区键值。确切的值并不重要,只要对于所有项目都是相同的,所以让我们假设它只是字符串
“foo”

(2) 排序键将是随机的,例如随机生成的32位整数

(3) 5个字符的base64字符串将存储在第三个属性中(既不是分区也不是排序键)

当您想要抓取1000个随机项目时,您需要在分区键=
上发出DynamoDB“foo”
。查询返回的项按排序键排序。由于您选择了一个随机排序键(请参见上面的(2)),您将获得1000个随机项

排序关键注意事项 以64为基数的所有5个字符的集合是一个大小为
2^30
的空间。因此,排序键需要足够大,以存储2^30个项目。因此,务实地选择一个随机的32位int就足够了。但是,如果您需要确保1000个项目的选择确实是随机的,那么您可能希望选择随机性优于运行时随机函数的项目。例如,您可以根据存储的基64值计算
sha-384
,并将其用作排序键值。so 384位完全在限制范围内


特别是,不要将UUID用作排序键。UUID通常没有那么随机。

如果随机ID足够随机,就不需要固定的分区密钥。您可以使用随机ID作为分区键,并
扫描
表中的前N个值。@MatthewPope AFAIK无法保证扫描返回的项目顺序。由于无法保证DDB impl。可能会选择一些策略,这将导致某些顺序不是随机的。您是对的,扫描返回的项目顺序没有保证。然而,计算机只有伪随机数生成器,除非DynamoDB设法对随机数生成器和种子值进行反向工程,否则DynamoDB不会对数据进行反随机。@MatthewPope这是一个很好的观点。然而,DynamoDB的扫描顺序可能受到插入顺序的某种影响。我假设,典型的实现将以某种顺序(例如
aaaaaaa
AAAAB
AAAAC
,…)生成有效负载(以64个字符串为基数的5个字符)。