【问题标题】:UUIDs for DynamoDB?DynamoDB 的 UUID?
【发布时间】:2012-01-24 04:53:40
【问题描述】:

是否可以让 DynamoDB 在向表中添加新项目时自动生成唯一 ID?

我注意到 Java API 提到了@DynamoDBAutoGeneratedKey,所以我假设有一种方法可以让它与 PHP 一起使用。

如果是,应用程序代码是生成这些 ID 还是在 DynamoDB 端完成?

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb uuid


    【解决方案1】:

    好问题 - 虽然从概念上讲是可行的,但这似乎目前不能作为 DynamoDB API 级别的功能使用,因为CreateTablePutItem 都没有提到这样的功能。

    您注意到的@DynamoDBAutoGeneratedKey 表示法是Java annotation,即确实是Java SDK 提供的语法糖:

    注解,在 Java 计算机编程语言中,是一种特殊的 可以添加到 Java 源代码中的语法元数据形式。

    因此,@DynamoDBAutoGeneratedKeyAmazon DynamoDB 注释 之一,作为 Java SDK 的高级 API 中的对象持久性模型 的一部分提供(请参阅 Using the Object Persistence Model with Amazon DynamoDB ):

    将哈希键或范围键属性标记为自动生成。这 对象持久化模型在保存这些时会生成一个随机的 UUID 属性。只有字符串属性可以标记为自动生成 键。

    【讨论】:

    • 谢谢我不熟悉Java,所以你的回答真的很有帮助。所以@DynamoDBAutoGeneratedKey 只是让Java API 生成一个UUID,而不是Dynamo 本身,对吗?如果 Dynamo 有一个 UUID 属性类型,它会在他们身边生成 ID 并在添加新项目时返回它们,那就太好了。
    • @Adam:确实,@DynamoDBAutoGeneratedKey 只是 Java SDK 提供的一个自定义注解,它生成在编译时生成的代码,然后在 Java 应用程序中执行以在运行时生成 UUID -这与 DynamoDB 本身无关。我同意,原生 DynamoDB UUID 数据类型会非常方便 - 希望 AWS 团队随着时间的推移扩展 DynamoDB 功能,他们以响应客户需求和相应创新而闻名!
    【解决方案2】:

    在使用 nodejs 在 javascript 中使用 dynamodb 时。我使用 npm 模块 uuid 来生成唯一键。

    例如:

    id=uuid.v1();

    参考:uuid npm

    【讨论】:

      【解决方案3】:

      通过在 Node.js 中使用基于架构的 AWS dynamodb 数据映射库,将自动生成哈希键 (id)。自动生成的 id 基于 uuid v4。

      更多详情,请查看以下 aws 包。

      Data Mapper with annotation

      Data Mapper package for Javascript

      示例代码

      @table('my_table')
      class MyDomainClass {
          @autoGeneratedHashKey()
          id: string;
      
          @rangeKey({defaultProvider: () => new Date()})
          createdAt: Date;
      }
      

      【讨论】:

        【解决方案4】:

        客户端可以通过选择一个长随机 ID(例如,DynamoDB 支持 128 位整数)或通过选择一个包含客户端 IP 地址、CPU 编号的 ID 来创建(用于所有意图和目的)唯一 ID , 和当前时间 - 或类似的东西。 UUID 标准甚至包括执行此操作的标准方法(并且您拥有各种语言的库来在客户端创建此类 UUID),但您实际上并不需要使用标准。 有趣的问题是,如果这些项目有随机键,你打算如何找到它们。还是您打算使用二级索引?

        【讨论】:

          【解决方案5】:

          2022 年的答案在这里: https://dev.to/prabusah_53/aws-lambda-in-built-uuid-382f

          不再需要外部库。

          【讨论】:

            【解决方案6】:

            这是从 mkyong 中获得的另一个好方法

            http://www.mkyong.com/java/how-to-get-current-timestamps-in-java/

            我调整了他的方法以获取毫秒而不是实际日期

            java.util.Date date= new java.util.Date();
            System.out.println(new Timestamp(date.getTime()).getTime());
            

            【讨论】:

              【解决方案7】:

              我采用的方法是使用哈希键的当前时间戳(或范围键,如果也使用范围键)。将时间戳存储为整数,表示自“UNIX 纪元”开始以来的毫秒数(在 UTC 时区中)。许多日期/时间库可以为您生成此数字。

              这样做的好处是,如果您想在表中包含“创建时间”字段,您的 UUID 已经存储了此信息。只需调用日期/时间库中的另一个方法即可将时间戳转换为可读格式。

              (请务必处理如果在同一个表中创建具有相同毫秒时间戳的第二个项目时将发生的异常;在这种情况下,只需回退并重试该操作,稍晚一点,当前时间戳。)

              例如:

              User table
              

              仅哈希键:用户 ID(创建此用户的时间戳)。

              WidgetAttributes table
              

              哈希键加范围键。
              hash-key:userID(使用小部件所属用户的 User 表中的 userID)。 range-key:attribID(使用创建此小部件属性的时间戳)。

              现在您可以在 WidgetAttributes 表上运行“查询”操作来获取某个用户的所有小部件属性;通过使用“大于零”作为范围键的查询参数。

              【讨论】:

              • 时间戳不能保证是唯一的,尤其是在多个客户端并行运行的情况下。
              • @shle2821 最好只为 id 生成一个 UUID 并将时间戳存储在一个单独的字段中,而不是这个建议。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-07-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-11-11
              相关资源
              最近更新 更多