通过 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 中获取多个项目。
扫描 - scan
操作将搜索整个 table 以获取数据。虽然这听起来像您想要的,但它可能不是。 Scan 是一个功能强大的工具,只能在特定情况下使用。如果您将 scan
用于经常使用的访问模式,您将需要重新访问您的数据模型。
查询 - 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 订单。排序键是基础货币和汇率的组合。此全局二级索引共同支持以下访问模式:
- 按报价货币获取所有 BUY/SELL 订单
- 获取报价货币和基础货币的所有 BUY/SELL 订单
- 获取所有 BUY/SELL 个基于基础货币汇率范围的报价货币的订单。
针对这些访问模式中的每一个的伪代码搜索是:
- 查询 PK = (BUY|SELL)ORDER#[quote_curr]
- 查询 PK = (BUY|SELL)ORDER#[quote_curr] AND SK begins_with [base_curr]
- 查询 PK = (BUY|SELL)ORDER#[quote_curr] AND SK 在 [base_curr]#1.00 和 [base_curr]#2.00
之间
虽然这些示例可能无法解决您所有的特定访问模式,但我希望它有助于说明围绕 DynamoDB 数据建模的一些策略。请记住,您的访问模式驱动您在 DynamoDB 中的数据模型。当您标准化数据并应用 SQL 直到获得所需的输出时,DynamoDB 不像 数据库。在 DynamoDB 中,性能来自设计良好的数据模型,而不是查询语言。
大家好,我是 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 中获取多个项目。
扫描 -
scan
操作将搜索整个 table 以获取数据。虽然这听起来像您想要的,但它可能不是。 Scan 是一个功能强大的工具,只能在特定情况下使用。如果您将scan
用于经常使用的访问模式,您将需要重新访问您的数据模型。查询 -
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 订单。排序键是基础货币和汇率的组合。此全局二级索引共同支持以下访问模式:
- 按报价货币获取所有 BUY/SELL 订单
- 获取报价货币和基础货币的所有 BUY/SELL 订单
- 获取所有 BUY/SELL 个基于基础货币汇率范围的报价货币的订单。
针对这些访问模式中的每一个的伪代码搜索是:
- 查询 PK = (BUY|SELL)ORDER#[quote_curr]
- 查询 PK = (BUY|SELL)ORDER#[quote_curr] AND SK begins_with [base_curr]
- 查询 PK = (BUY|SELL)ORDER#[quote_curr] AND SK 在 [base_curr]#1.00 和 [base_curr]#2.00 之间
虽然这些示例可能无法解决您所有的特定访问模式,但我希望它有助于说明围绕 DynamoDB 数据建模的一些策略。请记住,您的访问模式驱动您在 DynamoDB 中的数据模型。当您标准化数据并应用 SQL 直到获得所需的输出时,DynamoDB 不像 数据库。在 DynamoDB 中,性能来自设计良好的数据模型,而不是查询语言。