【问题标题】:DynamoDB - how to query by something that is not the primary keyDynamoDB - 如何通过非主键查询
【发布时间】:2020-06-06 23:00:31
【问题描述】:

所以,我在 DybamoDB 上有一个具有这种结构的表:

- userId as the primarykey (it's a uuid)
- email
- hashedPassword

当有人注册时,我想查明是否已经有人在使用该电子邮件。

这应该很容易,但据我所知,除非您使用主键作为参数或排序键,否则您无法在 DynamoDB 上进行查询(而且我不确定发送电子邮件是否有意义排序键)。

我发现的另一种方法是使用全局二级索引,它几乎是您使用另一个字段作为主要类型创建的索引表,但这是计费的,因为我仍在开发和测试,所以我没有想有开支。

还有其他选择吗?还是我错了,还有其他方法可以做到吗?

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-dynamodb


    【解决方案1】:

    与其他答案一样,我也认为 GSI 是最佳选择

    但我还想补充一点,由于 DynamoDB 的搜索功能非常有限,因此将 DynamoDB 与其他东西一起用于此目的并不少见。 AWS 博客中描述了一个这样的用例:

    DynamoDB 的主要查询功能以使用主键的查找为中心。但是,在某些时候需要更丰富的查询功能。使用 Elasticsearch 等搜索引擎为 DynamoDB 表的内容编制索引将允许进行全文搜索。

    显然,我不建议在您的场景中使用 ES 而不是 GSI。但值得了解的是,DynamoDB 可以并且经常与其他服务一起使用以扩展其搜索功能。

    【讨论】:

      【解决方案2】:

      即使您将emailsort key 放在一起,将userIdprimary key 放在一起,也不能仅使用电子邮件进行查询(除非是scan 操作)。您不想使用扫描来查看您的表中是否存在电子邮件。这就像通过扫描整个表来迭代每个值。

      我认为你最好的选择是global secondary index。另一种选择是创建一个仅包含 email 值的新表,但在这种情况下,您必须写入/维护多个表,这是不必要的。

      【讨论】:

      • 是的,我想到了另一张桌子,但是是的……不是最好的选择。我想 GSI 是当时的最佳选择,尽管我希望我可以避免支付任何费用,但谢谢!!
      • 我在想一件事:GSI 表就像一个常规表,但由 DynamoDB 维护,还是更像一个索引(例如在 sql 数据库中)?如果它是表的副本,但分区键是另一个,我想我宁愿按照您的建议创建另一个表并防止我被收费,因为这两个选项(GSI 或另一个表)都意味着双倍写作单位,所以至少我不会为更多的东西付钱(至少现在,我最终可以改变它)。
      • @user3648701 这可能是一个可以考虑的选项(我建议作为第二个选项,因为电子邮件的唯一性在大多数域中都至关重要)-docs.aws.amazon.com/amazondynamodb/latest/developerguide/… 读/写容量单位部分也可以提供一些见解
      【解决方案3】:

      我发现的另一种方法是使用全局二级索引,它几乎是您使用另一个字段作为主要类型创建的索引表,但这是可计费的,因为我仍在开发和测试,所以我没有想要花销。

      正如@Ersoy 所说,GSI 是合法的解决方案,即使它会增加消耗的写入单位。

      Dynamodb 对于低流量应用和/或测试环境来说很便宜,但要保持这些费用不变,您可以:

      1. 在本地开发/测试和 CI 构建期间使用 dynamodb local

      2. 为您的餐桌选择一个provisioned capacity mode(您可能会发现它的免费套餐很有趣)

      【讨论】:

      • 我没想过在本地进行测试,老实说,这可能是个好主意。但我也将阅读关于第二项的内容。谢谢!!
      猜你喜欢
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多