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

Querying by multiple attributes in dynamo db

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

用例:

订购型号:

{
id: SELLorBUY#someid,
quote_cur: 'GBP',
base_cur: 'USD',
rate: 2.00,
side: BUY
quantity: 1000,
createdAt: some date
}

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

感谢您的帮助

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

  1. 扫描 - scan 操作将搜索整个 table 以获取数据。虽然这听起来像您想要的,但它可能不是。 Scan 是一个功能强大的工具,只能在特定情况下使用。如果您将 scan 用于经常使用的访问模式,您将需要重新访问您的数据模型。

  2. 查询 - query 操作快速高效。要使用此方法,您需要将多个项目分组到同一个 item collection.

回答您的问题的关键是了解 DynamoDB 如何组织数据。您有项目和项目 collections.

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

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

在项目 collection 中对数据建模可以让您对 整个 collection 执行操作。在这个具体示例中,我将排序键设为时间戳。这将允许我查询在特定时间 before/after 创建的所有订单。

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

...how do i search for buy orders with a specific quote currency and buy currency at a specific rate

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

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

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

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

  1. 按报价货币获取所有 BUY/SELL 订单
  2. 获取报价货币和基础货币的所有 BUY/SELL 订单
  3. 获取所有 BUY/SELL 个基于基础货币汇率范围的报价货币的订单。

针对这些访问模式中的每一个的伪代码搜索是:

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

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