gpt4 book ai didi

amazon-web-services - 在 Dynamo DB 中使用 where 语句选择

转载 作者:行者123 更新时间:2023-12-03 22:57:53 24 4
gpt4 key购买 nike

所以,我使用 AWS Lambda 和 node.js 与 DynamoDB 交互,到目前为止一切都很好,因为我可以进行扫描、使用主键查询等等。

但是,现在我需要做一个我不知道主键的查询或扫描,我只有列的名称,我想按该列过滤的参数和表名。

例如在 SQL 语言中:

SELECT * FROM user WHERE user_type = 'Moderator';

我已经搜索了文档,但我仍然无法做到这一点。有人能帮我吗?

最佳答案

执行此操作的几种方法,取决于您的应用程序执行此查询的频率以及您对性能的关心程度,我将从最不费力但可扩展性最低到最费力但可扩展性最高。

  • 使用过滤器和投影表达式扫描表 - 所以 dynamo 根据分区键对您的数据进行分片,除非配置,否则不保留索引。因此,在没有任何额外表配置的情况下获得所有版主的完整列表的唯一方法是执行消耗大量 IOPS 的全表扫描,但如果这是偶尔发生的事情,这可能没问题。您可以添加 "filter expression"让 dynamo 只向您返回“user_type” = 'Moderator' 但在后端 dynamo 仍在扫描整个数据库的结果,它使过程更快,因为传输结果所需的时间更少,但它消耗了相同的 IOPS .. 你可以更进一步,使用“投影表达式”来过滤只从每一行返回“user_name”字段。 (如果您处理大型项目,这会很有帮助。这也不会减少消耗的 IOPS 量,但会减少返回给您的不必要的数据。尽管这种方法不会很好地扩展,即使只有 2 个主持人。 .. 数据库中的用户越多,它就会变得越来越慢。
  • 添加全局二级索引 这是中间地带,但它也有成本,因为您需要为索引提供足够的 IOPS 以跟上,但这里的事情更可控。您可以使用不同的分区键查看您的表的不同 View ,但请注意,即使对于您的索引,您也需要 a partition key that hashes以及它基本上是另一张 table 。 “user_type”不能很好地散列,所以你可以做的是有一个名为“moderator_name”的字段,它与“user_name”具有相同的值,但只存在于作为主持人的用户上。接下来,您在该字段上创建一个二级索引,该索引中将只存在主持人。然后您可以扫描此索引,以获取您的主持人列表,并且它不会消耗主表上的任何 IOPS。这可能看起来有点 hacky,但是对于 Dynamo,它不像 SQL,如果您构建一个良好的表结构,它可以处理任何查询,您需要专门构建您的 Dynamo 表以匹配您期望执行的读取和写入类型......所以这导致下一个选项
  • 创建一个单独的“版主”表 这是更多的工作开始,但如果您想向您的网站添加版主特定功能,这可能是更好的方法。如果你这样做,我建议你的主表中不要有“user_type”,而只是查询这个表,如果用户存在于其中,他们就是一个主持人。这样做的原因是,如果没有 SQL 事务来组合写入,您的“user_type”字段和您的 Moderators 表可能会变得不一致。
  • 使用 Dynamo Streams 将数据导出到 SQL DB 虽然 Dynamo 非常适合许多用例,但它不是 SQL 数据库,并且为了性能和可扩展性而牺牲了许多不错且方便的 SQL 功能。同样,让您的网站使用 Dynamo 来提高速度,然后创建有针对性的电子邮件事件可能是有意义的在 SQL 数据库中拥有相同的数据,因此您可以执行复杂的查询来创建针对特定用户子集的电子邮件事件。

  • 4种方法不同情况我都用过,需要强调的是 “...取决于您的用例...”

    关于amazon-web-services - 在 Dynamo DB 中使用 where 语句选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47973021/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com