如何有效地检查一个值是否存在于 DynamoDB 中?

How to check if a value exists in DynamoDB effectively?

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

Table 看起来像这样:

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

我想编写一个 Lambda 函数来检查数据库中是否存在特定标记。
如果在 DB 中退出,returns TRUE。
如果不存在,returns FALSE。

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

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

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

  3. 重新编辑
    为什么我需要从一开始就创建 GSI?
    这样做意味着我需要额外持有 table...
    我可以只使用主键作为令牌值的原始 table 吗?

  1. 是的。您可以将 GSI 与您的令牌的主键一起使用。

  2. 是的,GetItem 就可以了。

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

  1. 是的。请记住,您不能在二级索引上添加唯一性约束
  2. 使用主键(散列+潜在范围键)时,可以使用GetItem。否则,您必须在 table 或索引上使用查询命令(您可以对字符串 https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html 使用包含运算符)

第三部分,需要单性吗?您可以创建一个辅助 table,它将值键与令牌值上的主键反转。添加新令牌时,您将令牌 + id 添加到 table (有交易?)。写入成本更高。

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

  • 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