通过dynamo db中的多个属性进行查询

3 amazon-web-services amazon-dynamodb aws-lambda dynamodb-queries

大家好,我是 dynamodb 的新手,我正在构建一个货币兑换匹配平台,我想知道如何使用 dynamo 查询多个项目

使用案例:

订购型号:

{
id: SELLorBUY#someid,
quote_cur: 'GBP',
base_cur: 'USD',
rate: 2.00,
side: BUY
quantity: 1000,
createdAt: some date
}
Run Code Online (Sandbox Code Playgroud)

它们是数据库中的买入订单和卖出订单,我将分区键设置为订单的 ID,并将创建日期设置为排序键,以便我可以按范围进行搜索。一切都很好,但我如何搜索具有特定报价货币的买入订单并以特定汇率买入货币?因此,如果我正在寻找想要以 2GBP - 1USD(汇率)的价格出售美元换取英镑的人,我可以找到该人并将其发送回用户。

感谢您的帮助

Set*_*gan 6

有两种方法可以在 DynamoDB 中获取多个项目。

  1. 扫描 - 该scan操作将搜索整个表以获取数据。尽管这听起来像是您想要的,但事实可能并非如此。扫描是一个强大的工具,只应在特定场景中使用。如果您使用的scan是常用的访问模式,您将需要重新访问您的数据模型。

  2. 查询——query操作快速高效。为了使用此方法,您需要将同一项目集合中的多个项目分组。

回答您的问题的关键是了解 DynamoDB 如何组织数据。您有物品和物品收藏

以下示例显示了对两个订单项建模的一种方法。每个项目都有唯一的主键(分区键+排序键),包括不同的分区键。

项目

如果我要存储与项目集合相同的信息,它将如下所示:

在此输入图像描述

通过对项目集合中的数据进行建模,您可以对整个集合执行操作。在这个具体示例中,我将排序键设置为时间戳。这将允许我查询特定时间之前/之后创建的所有订单。

请注意,每个项目仍然具有唯一的键(分区键 + 排序键)。但是,对于项目集合,分区键在所有项目之间共享。

...我如何搜索具有特定报价货币的买入订单并以特定汇率买入货币

让我们把上面的知识放在一起来实现这个访问模式。

您将数据存储为单个项目。为了将这些项目分组在一起,您可以定义全局二级索引。DynamoDB 中的二级索引让我们能够以不同的方式排列数据以支持各种访问模式。例如,考虑以下“主”表,该表对三种不同类型的订单进行建模:

在此输入图像描述

请注意,我定义了名为 GSIPK1 和 GSISK1 的属性。这些属性将用作我称之为 GSI1 的全局二级索引的分区键和排序键。GSI1 看起来像这样:

在此输入图像描述

请注意我如何将项目分组到集合中以匹配您的特定访问模式。在此示例中,我定义的分区键包括订单类型(BUYORDER/SELLORDER)和报价货币。这让我可以快速识别特定货币的所有买入/卖出订单。排序键是基础货币和汇率的组合。该全局二级索引共同支持以下访问模式:

  1. 按报价货币获取所有买入/卖出订单
  2. 获取报价货币和基础货币的所有买入/卖出订单
  3. 根据一系列基础货币汇率获取报价货币的所有买入/卖出订单。

每个访问模式的伪代码搜索如下:

  1. 查询 where PK = (BUY|SELL)ORDER#[quote_curr]
  2. 查询 where PK = (BUY|SELL)ORDER#[quote_curr] AND SK begin_with [base_curr]
  3. 查询 where PK = (BUY|SELL)ORDER#[quote_curr] AND SK 在 [base_curr]#1.00 和 [base_curr]#2.00 之间

虽然这些示例可能无法解决您的所有特定访问模式,但我希望它们有助于说明有关 DynamoDB 数据建模的一些策略。请记住,您的访问模式驱动 DynamoDB 中的数据模型。DynamoDB 与SQL 数据库不同,当您标准化数据并应用 SQL 直到获得所需的输出时。在 DynamoDB 中,性能来自于精心设计的数据模型,而不是查询语言。