在 DynamoDB 模板中使用查询操作进行分页和过滤

Tah*_*qui 1 amazon-dynamodb aws-appsync dynamodb-queries

我希望能够在考虑限制之前使用查询操作过滤分页结果。是否有任何建议可以在过滤后的结果上获得正确的分页?

我想使用以下逻辑实现 DynamoDB 扫描或查询:

Scanning -> Filtering(boolean true or false) -> Limiting(for pagination)
Run Code Online (Sandbox Code Playgroud)

但是,我只能使用以下逻辑实现扫描或查询:

Scanning -> Limiting(for pagination) -> Filtering(boolean true or false)
Run Code Online (Sandbox Code Playgroud)

注意:我已经尝试过全局二级索引,但在我的情况下它不起作用,因为我有 5 个不同的属性要过滤和限制。

lib*_*bik 5

不幸的是,DynamoDB 无法做到这一点,一旦您对其中一个索引进行查询,它就会读取满足您的分区和排序键的每一个项目。

让我们检查您的示例 - 您有布尔值并且您在该字段上有索引。假设 50% 的项目是假的,50% 是真的。一旦您按该索引进行搜索,您将通读表中所有项目的 50%(因此它几乎类似于 SCAN)。如果您设置了限制,它将仅读取该数量的项目,然后停止。您不能使用的组合limitskip/page/offset其他数据库一样。

有一定程度的分页https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.Pagination.html但它不允许您跳转到第 10 页,它只允许您浏览所有一页一页。此外,我不确定它是如何定价的,也许在内部 AWS 会在为您准备结果之前检查所有项目,因此即使您在到达结束之前停止迭代,您也将支付阅读整个表的 50% 的费用。

还有一个限制,即索引最多可以有 2 个字段(分区、排序)。


例子

您写道,您有 5 个要查询的参数。用于解决这些限制的解决方法是创建和管理具有要查询的参数组合的额外字段。假设您有用户表,并且在那里gender, age, name, surname and position。假设其庞大的数据库,因此您必须考虑可以加载的数据量。那么如果你想使用DynamoDB,你必须考虑你想要做的所有查询。

您很可能希望按姓名和姓氏进行搜索,因此您可以使用姓氏作为分区键和姓名作为排序键来创建索引(在这种情况下,您可以按姓氏或同时按姓氏和姓名进行搜索)。它可以用于很多名称,但您发现某些名称组合太常见,您还需要按位置过滤。在这种情况下,您创建名为 ie 的新字段(列)name-surname,每当您创建或更新项目时,您都需要在您的应用程序中处理此字段以确保它包含这两个字段,即will-smith. 然后你可以创建另一个索引,它具有name-surname分区键和position排序键。现在您可以将其用于此类搜索。

但是您发现,对于某些姓名-姓氏-职位组合,您会得到太多结果,您不想在应用程序级别处理它,并且还想按年龄限制结果。然后,您可以使用name-surname-position作为分区键和年龄作为排序键创建索引。此时您还可以确定您的旧name-surname字段和索引可以被删除,因为它不再用于服务(名称和姓氏由另一个索引处理,并且仅搜索名称-姓氏-位置,您可以使用此索引)

您有时也想按性别查询?在应用程序级别(或数据库查询中的额外过滤器)处理它可能更好,而不是创建必须处理和付费的新索引。只有两种类型的性别(好吧,可以说存在更多,但 99% 的人只会有男性或女性)所以如果有人只想检查男性/女性/,在应用程序级别隐藏几个字段可能更便宜变性人......,但加载所有这些。因为对于额外的索引,您必须为每个插入付费,但此过滤器只会不时使用。此外,当有人已经按姓名、姓氏和职位进行搜索时,您无论如何都不会期望得到那么多结果,因此,如果您得到 20 个(所有性别)或仅 10 个(仅限男性)结果并没有太大区别。


此 ^^ 只是您如何思考和使用 DynamoDB 的示例。您究竟如何使用它取决于您的业务逻辑。

非常重要的提示:DynamoDB 是非常简单的数据库,只能进行非常简单的查询。它的功能比 Redis 多一点,但比传统数据库少很多。考虑您的业务模型/用例的有效结果是,您可能根本不应该使用 DynamoDB,因为它根本无法满足您的需求和查询。

一些基本的想法可以是这样的:

  • 键值持久存储是否足够?使用 DynamoDB
  • 键值持久存储,其中一个项目可以有多个键,我可以按最多 2 个字段进行搜索和过滤吗?使用 DynamoDB
  • 是持久存储,我想在其中通过多个键搜索单个表/集合并提供很多选项吗?使用 MongoDB
  • 我是否需要搜索多个表或进行复杂的连接或需要事务?使用传统的 SQL 数据库