【问题标题】:what is the right way to query different filters on dynamodb?在 dynamodb 上查询不同过滤器的正确方法是什么?
【发布时间】:2020-07-09 16:34:09
【问题描述】:

我将order 数据保存在 dyanmodb 表中。分区键为orderId,排序键为timestamp。每个订单都有许多其他属性,例如category, userName, price, items, status`。我将构建一个过滤服务,让客户根据这些属性查询订单。另外我想为分页查询添加一个限制。但我发现 dynamodb 有一些限制。

为了支持查询不同的字段,我有两种选择:

  • 为每个属性创建 GSI。它非常昂贵,但它支持查询每个属性非常性能。此解决方案不支持在过滤器中组合多个属性。

  • SCAN 上附加过滤表达式以包含属性条件。 SCAN 首先表现不佳。过滤器表达式也在limits 之后应用。这意味着它的响应很可能低于用户请求的限制。

那么在 dynamodb 中实现这一目标的好方法是什么?

【问题讨论】:

  • 我不认为 DynamoDB 是一个很好的用例。如果您在 AWS 上,您可以使用 Elastic Search 来执行搜索和过滤部分,并将订单存储在 DynamoDB 上。使用 DynamoDB Streams,一旦您创建了一个订单,您就可以在 Elastic Search 上对其进行索引。
  • 另一种方法是将文档发送到 Elasticsearch 并在那里进行各种查询。
  • 我认为您的方法基本上意味着删除 dynamodb 并将所有订单保存在 Elastcisearch 中。在这里使用 dynamodb 有什么意义?

标签: amazon-web-services amazon-dynamodb


【解决方案1】:

很遗憾,没有什么神奇的方法可以解决您的问题。您没有错过任何 DynamoDB 功能。实际上,正如您所说,使每个属性都可用于高效查询需要一个 GSI,这将花费您额外的钱——但这是合理的。实际上,正如您所说,没有有效的方法来搜索两个不同属性的交集 需求。事实上,“限制”功能并不能完全满足您的需求,您需要在客户端代码中模拟您的页面大小需求(要求更多页面,直到收到您想要的数量),可能具有不可接受的高延迟。

听起来您真正需要的是一个搜索引擎。这些正是您要求的功能。您仍然需要为这些功能付费(单个列的索引仍会占用 CPU 和磁盘空间,多个属性搜索的交集仍需要在查询时进行大量工作)但搜索引擎专为这些操作而设计,并且可以更有效地执行它们并且延迟更低(这对于交互式搜索很重要,因为它是搜索引擎的基础)。

【讨论】:

    【解决方案2】:

    您可以使用查询中的 limit 属性添加分页限制。但是您能否更具体地说明您的访问模式,您的客户是要查询所有订单还是只查询属于他们的订单?

    【讨论】:

    • 就像我在问题中所说的那样,过滤器在限制之后应用。客户端将根据这些值进行查询:类别、用户名、价格、项目、状态。对于管理员客户端,他们可以查询其他客户端的订单。
    猜你喜欢
    • 2019-11-09
    • 2021-06-30
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2010-10-29
    • 2019-01-11
    相关资源
    最近更新 更多