在DynamoDB中按多个属性查询

3

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

应用场景:

订单模型:

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

在数据库中有买单和卖单,我将分区键设置为订单ID,并将创建日期作为排序键以便于按范围搜索。这很好,但是如何搜索特定报价货币和特定汇率的购买订单呢?例如,如果我想找到想要以2GBP-1USD(汇率)出售其美元以换取英镑的人,我可以定位并将结果返回给用户。谢谢您的帮助。
1个回答

6
有两种方法可以在DynamoDB中获取多个项目。
  1. Scan - scan操作将搜索整个表以获取数据。虽然这听起来可能是您想要的,但实际上并不是。扫描是一个强大的工具,应仅在特定情况下使用。如果您正在为频繁使用的访问模式使用scan,则需要重新审视您的数据模型。

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

回答您的问题的关键是了解DynamoDB如何组织数据。您有项目和项目集合
以下示例显示了一种建模两个订单项目的方法。每个项目都有唯一的主键(分区键+排序键),包括不同的分区键。

Items

如果我要将相同的信息存储为项目集合,它会像这样:

enter image description here

在项目集合中建模数据可以让您对整个集合执行操作。在此特定示例中,我将排序键设置为时间戳。这将允许我查询在特定时间之前/之后创建的所有订单。
请注意,每个项目仍具有唯一的主键(分区键+排序键)。但是,在项目集合的情况下,分区键在所有项目之间共享。
引用:
如何搜索具有特定报价货币和以特定价格购买货币的购买订单?
让我们将上述知识结合起来实现此访问模式。
您将数据存储为单个项目。为了将这些项目分组在一起,您可以定义全局二级索引。 DynamoDB中的二级索引使我们能够以不同的方式排列数据,以支持各种访问模式。例如,请考虑以下“主”表,该表模拟三种不同类型的订单:

enter image description here

请注意,我定义了名为GSIPK1和GSISK1的属性。这些属性将作为全局二级索引GSI1的分区键和排序键。GSI1应如下所示:

enter image description here

请注意,我已将项目分组为集合,以匹配您特定的访问模式。在此示例中,我正在定义包括订单类型(BUYORDER / SELLORDER)和报价货币的分区键。这使我能够快速识别特定货币的所有购买/销售订单。排序键是基础货币和汇率的组合。总体而言,这个全局二级索引支持以下访问模式:
  1. 按报价货币获取所有买入/卖出订单
  2. 按报价货币和基础货币获取所有买入/卖出订单
  3. 按基础货币汇率范围获取特定报价货币的所有买入/卖出订单。
伪代码搜索每个访问模式的方法如下:
  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 between [base_curr]#1.00 and [base_curr]#2.00
尽管这些示例可能无法解决您所有特定的访问模式,但我希望它能帮助说明一些关于DynamoDB数据建模的策略。请记住,您的访问模式驱动DynamoDB中的数据模型。 DynamoDB不像SQL数据库那样对数据进行规范化并应用SQL直到获得所需输出。在DynamoDB中,性能来自于良好设计的数据模型,而不是查询语言。

1
你是一个字面上的GOAT。非常感谢 :) - user13468285
优秀的回答! - 404

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接