Nosql DynamoDB—从分区键列表中获取对象的最有效/最便宜的方法?

Nosql DynamoDB—从分区键列表中获取对象的最有效/最便宜的方法?,nosql,amazon-dynamodb,serverless,dynamodb-queries,Nosql,Amazon Dynamodb,Serverless,Dynamodb Queries,假设在我的客户中,我有一个PK列表: PKs = [uuid1, uuid2, uuid3, uuid4, ...] 我需要得到具有这些对应PK的对象 我可以想出三种方法: 交易 使用Transact-GetItems,我一次可以获取10个项目,因此我只需逐个获取每个项目,直到全部获取为止 批量获取项目 与事务相同,但不是事务性的,我一次可以获取25个项目 带过滤器的查询(可能比较混乱) 我可以使用一个GSI,它有一个不可变的属性作为分区键,并将原始分区键设置为属性,我可以在条件表达式中链接一

假设在我的客户中,我有一个PK列表:

PKs = [uuid1, uuid2, uuid3, uuid4, ...]
我需要得到具有这些对应PK的对象

我可以想出三种方法:

交易

使用Transact-GetItems,我一次可以获取10个项目,因此我只需逐个获取每个项目,直到全部获取为止

批量获取项目

与事务相同,但不是事务性的,我一次可以获取25个项目

带过滤器的查询(可能比较混乱)

我可以使用一个GSI,它有一个不可变的属性作为分区键,并将原始分区键设置为属性,我可以在条件表达式中链接一组“OR”

例如(boto3):

现在,根据定价页面:

DynamoDB为每个强一致性请求单元收费一个读取请求单元 读取(最大4KB),每个事务性读取有两个读取请求单元, 以及用于每个最终一致读取的一半读取请求单元

我不确定1 read是什么,它是否考虑返回的每个对象或扫描的每个对象?每个不同的请求是否至少为1个RCU,或者它们相加直到达到1个RCU

以上3个例子中,哪一个是DynamoDB定价系统下最便宜的?还有别的办法吗


计算的加分。

交易应该是您最后的选择,因为这与交易逻辑无关

BatchGetItems
每项消耗1RCU,然而,
Query
根据查询的项目的总大小消耗RCU(未返回!!)。如果您要查询一个表并返回100个项目,但每个项目的大小为1kb(不带过滤器),那么它将是400kb,因此会消耗10个RCU(计算可能是错误的,写入速度非常快,但您知道这一点)。所以查询在很多情况下要便宜得多,除了你的。在您的例子中,您只需扫描整个表,因为据我所知,哈希是静态的

您最好的选择是
BatchGetItems
,但是这里有一个很大的

你怎么会只有你想要的身份证?这不是NoSQL模式。您可能要做的是规范化不适用于DynamoDB的数据。您应该将其解除规范化,以便在可以获取这些ID列表的地方也可以获取它们的相关属性。若您查询某个内容并获取ID,那个么对IDs的另一个请求只是说它的规范化和DynamoDB对它不好


我建议您重新考虑您的数据设计和访问模式。

我只在应用程序中存在多对多的情况下使用此选项。O某种程度上估计,这将比必须保持多个副本的最新版本更便宜,特别是因为dynamodb中没有批更新/删除,我说批获取是一种方法。但是,如果它的简单键值查找,我会考虑ReRIS,这在很多情况下更便宜。只是一个建议。
table.query(
    KeyConditionExpression=Key('gsi1_pk').eq('metadata'),
    #Bunch of ORs togheter
    FilterExpression=Attr('pk').eq('uuid1') | Attr('pk').eq('uuid2') ...
    Index='GSI1-Index1'
)