在向表中添加新项目时,是否可以让DynamoDB自动生成唯一ID?
我注意到Java API提到@DynamoDBAutoGeneratedKey,所以我假设有一种方法可以使用PHP。
如果是这样,应用程序代码是否会生成这些ID,还是在DynamoDB端完成?
答案 0 :(得分:22)
好问题 - 虽然在概念上可行,但目前似乎还没有作为DynamoDB API级别功能提供,因为CreateTable和PutItem都没有提到这样的功能。
您注意到的@DynamoDBAutoGeneratedKey
符号是Java annotation,即Java SDK提供的语法糖确实:
Java计算机编程语言中的注释是一种特殊的注释 可以添加到Java源代码的语法元数据形式。
因此@DynamoDBAutoGeneratedKey
是在Java SDK的高级API中作为对象持久性模型的一部分提供的 Amazon DynamoDB Annotations 之一(请参阅{ {3}}):
将哈希键或范围键属性标记为自动生成。该 对象持久性模型在保存时会生成随机UUID 属性。只有String属性可以标记为自动生成 密钥。
答案 1 :(得分:1)
通过在Node.js中使用基于模式的 AWS dynamodb数据映射器,将自动生成哈希密钥(id)。自动生成的ID基于uuid v4。
有关更多详细信息,请查看以下aws包。
Data Mapper package for Javascript
示例snipet
@table('my_table')
class MyDomainClass {
@autoGeneratedHashKey()
id: string;
@rangeKey({defaultProvider: () => new Date()})
createdAt: Date;
}
答案 2 :(得分:0)
答案 3 :(得分:0)
客户端可以通过选择一个长随机ID(例如,DynamoDB支持128位整数),或者通过选择一个包含客户端IP地址,CPU编号的ID,来创建(出于所有目的和目的)唯一ID。 ,以及当前时间-或类似的内容。 UUID标准甚至包括执行此操作的标准方法(并且您具有各种语言的库可在客户端上创建此类UUID),但实际上并不需要使用标准。 有趣的问题是,如果它们具有随机密钥,您打算如何查找它们。还是打算使用二级索引?
答案 4 :(得分:-3)
这是从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());
答案 5 :(得分:-5)
我采用的方法是使用当前时间戳作为哈希键(或范围键,如果也使用范围键)。将时间戳存储为整数,表示自“UNIX纪元”开始以来(以UTC时区为单位)的毫秒数。许多日期/时间库可以为您生成此编号。
这样做的好处是,如果您希望在表中有“创建时间”字段,则您的UUID已经存储了此信息。只需在日期/时间库中调用另一个方法,即可将时间戳转换为可读格式。
(确保处理在同一个表中使用相同的毫秒时间戳创建第二个项目时会发生的异常;只需稍后退一步并在稍后的当前时间戳中重试该操作。)< / p>
例如:
User table
仅限hash-key:userID(创建此用户的时间戳)。
WidgetAttributes table
hash-key加range-key。
hash-key:userID(使用小部件所属用户的User表中的userID)。 range-key:attribID(使用创建此widget属性的时间戳)。
现在,您可以在WidgetAttributes表上运行“查询”操作,以获取特定用户的所有窗口小部件属性;通过使用“大于零”作为范围键的查询参数。