【问题标题】:How to check if a value exists in DynamoDB effectively?如何有效地检查 DynamoDB 中是否存在值?
【发布时间】:2021-05-04 11:16:52
【问题描述】:

假设我有一个存储 100 万个令牌的 DynamoDB(令牌是一个简单的字符串)。
我们自己生成令牌(没有 AWS Cognito、没有 JWT、没有 AWS KMS 等)。
令牌是唯一的(没有重复)。

表格如下:

Key ID Token Value
1 !@#$%^
2 ^&*()!
3 !#%&()

我想编写一个 Lambda 函数来检查数据库中是否存在特定令牌。
如果在 DB 中退出,则返回 TRUE。
如果不存在,则返回 FALSE。

但是,token不是主键, 所以在这个表中搜索一个标记意味着
数据库将需要逐条检查每条记录,
查找令牌是否存在于数据库中,
这是非常资源和耗时的。

  1. 如果我将“token value”列变成全局二级索引,
    DynamoDB 可以通过直接转到该 KEY 来检查令牌是否存在
    而不是逐条搜索每条记录?
    ?

  2. 哪个 DynamoDB 函数用于检查数据库中是否存在密钥?
    是GetItem吗?

  3. 重新编辑
    为什么我需要从一开始就创建 GSI?
    这样做意味着我需要准备一张额外的桌子...
    我可以只使用主键作为 TOKEN VALUE 的原始表吗?

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:
    1. 是的。您可以将 GSI 与令牌的主键一起使用。

    2. 是的,GetItem 将完成这项工作。

    3. 不知道你在这里是什么意思。但我认为 DynamoDB 中没有任何功能可以搜索子字符串。您必须先获取记录,然后在客户端对其进行过滤。

    【讨论】:

    • 嗨马尔辛。感谢您的回复。 (1) 谢谢。 (2) 所以“GetItem”会在一秒钟内确认数据库中是否存在具有数百万条记录的密钥,对吗? (3) 我重新编辑了这个问题:为什么我需要从一开始就创建一个 GSI...必须创建 GSI 意味着我需要持有第二个表。我可以将原始表以令牌作为主键吗?
    【解决方案2】:
    1. 是的。请记住,您不能对二级索引添加唯一性约束
    2. 当使用主键(哈希 + 可能的范围键)时,您可以使用 GetItem。否则,您必须对表或索引使用查询命令(您可以对字符串 https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html 使用包含运算符)

    对于第三部分,你需要唯一性吗?您可以创建一个辅助表,它使用令牌值上的主键来反转值键。添加新令牌时,您将令牌 + id 添加到两个表(带有事务?)。写入成本更高。

    您还可以设计一个具有不同项目类型的单个表

    • pk:id#{id},令牌
    • pk:token#{token},id
    pk id token
    id#{id} id token
    token#{token} id token

    这样,在通过 id 或 token 查找时,可以直接使用GetItem

    您可以在这里找到更多示例https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-modeling-nosql-B.html

    【讨论】:

    • 嗨。 (1) 我不需要添加唯一性约束,因为令牌已经是唯一的。 (2) 通过使用 GSI,我不需要“哈希”,不需要“范围键”,我只希望主键是 TOKEN 值,这样我就可以搜索数据库中是否存在特定令牌,而无需使用搜索整个数据库“查询”或“扫描”。 (3) 我重新编辑我的问题。创建 GSI 意味着我拥有一个额外的表。我可以将带有令牌值的原始表作为 PRIMARY KEY...吗?
    • 我已经更新了我的答案。对于单行/项​​目,您不能拥有 2 个主键。您可以通过添加 2 个具有 2 个不同 pk 的项目来表示相同的数据。它在写入时增加了一点努力(和成本)。为确保原子性,可以使用 dynamodb 事务(更广泛)。
    猜你喜欢
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多