当前位置: 首页 > 面试题库 >

如何在DynamoDB中制作UUID?

帅银龙
2023-03-14
问题内容

在我的数据库方案中,我需要一个自动增量主键。我如何实现此功能?

PS要访问DynamoDB,我使用倍增极了Node.js的,模块


问题答案:

免责声明:我是Dynamodb-mapper项目的维护者

自动递增键的直观工作流程:

  1. 获得最后的柜台位置
  2. 加1
  3. 使用新数字作为对象的索引
  4. 保存新的计数器值
  5. 保存对象

这只是为了解释基本思想。绝对不要这样做,因为它不是原子的。在某些工作负载下,您可以将相同的ID分配给2个以上的不同对象,因为它不是原子的。这将导致数据丢失。

解决方案是将 原子ADD 操作与 UpdateItem
的ALL_NEW一起使用:

  1. 自动生成一个ID
  2. 使用新数字作为对象的索引
  3. 保存对象

在最坏的情况下,应用程序在保存对象之前崩溃,但绝不会冒险分配两次相同的ID。

还有一个问题:最后一个ID值存储在哪里?我们选择了:

{
    "hash_key"=-1, #0 was judged too risky as it is the default value for integers.
    "__max_hash_key__y"=N
}

当然,为了可靠地工作,所有插入数据的应用程序都必须注意该系统,否则您可能会(再次)覆盖数据。

最后一步是使过程自动化。例如:

When hash_key is 0:
    atomically_allocate_ID()
actual_save()

有关实现的详细信息(Python,抱歉),请参阅https://bitbucket.org/Ludia/dynamodb-
mapper/src/8173d0e8b55d/dynamodb_mapper/model.py#cl-67

实话实说,我的公司没有在生产中使用它,因为在大多数情况下,最好找到另一个密钥,例如,对于用户来说,是一个ID,用于交易,一个日期时间,…

我在dynamodb-mapper的文档中写了一些示例,可以轻松地将其推断到Node.JS。

如有任何疑问,请随时提问。



 类似资料:
  • 我正在使用AWS控制台和NodeJS。 我有一个带有分区键(user\u id)和排序键(company\u id)以及其他属性的dynamodb用户表。 我的一个属性是用户的电子邮件。电子邮件是唯一属性。 我需要通过电子邮件user_id,但我没有他的user_id和company_id。 我认为我应该使用全球二级指数。 我点击了用户表,打开索引选项卡并为该表创建了GSI。(名称:电子邮件,类型

  • 我有一个要求,在Dynamodb中查询表时只需要返回一行。我可以在aws cli中看到一个名为“max items”的参数,它显然限制了查询的结果大小。以下是示例查询: 但我无法在Go中找到任何类似的关键字/属性。 以下是我可以找到的相关内容:如何使用Java设置DynamoDB返回的匹配项的限制?

  • 问题内容: 喜欢标题中的内容如何对.txt文件进行过滤? 我写了这样的东西,但有错误:( 问题答案: 在这里,您将找到一些工作示例。这也是JFileChooser中使用的FileFilter的一个很好的示例。 基础是,您需要重写FileFilter类,并在其accpet方法中编写自定义代码。上例中的accept方法是根据文件类型进行过滤: 或更简单易用的是FileNameFilter,它具有以fi

  • 问题内容: 我想让一个微调框输入时间,就像这样:YoutubeVidéo 如果有人知道源代码隐藏在哪里,那将是完美的。但是,如果没有,我想尝试自己实现,但是我该如何使3个不同的(可聚焦的)文本区域像这样? 编辑:这是我所得到的,但是我希望能够选择小时数并增加小时数,而不仅仅是分钟数(和c的秒数相同) 这是我得到的结果: 谢谢 问题答案: 我认为选择编辑器各个部分的最佳方法是检查编辑器中的内容,并根

  • 我们正在使用DynamoDB全局表,并计划在DynamoDB顶部使用DAX来启用缓存。但是我没有看到任何关于DAX无效将如何在多区域设置中发生的提及。 例如,假设有2个集群,一个在美国-西-2,一个在美国-东-2。如果我们使用DAX客户端更新us-East 2中的内容,它的缓存将被更新,但是当将数据复制到us-West 2时,全局表也会更新us-West 2中的缓存吗?我在DynamoDB留档中没

  • 问题内容: 在JavaScript中有很多方法可以完成相同的操作。但是,我已经掌握了一些方式,但坦率地说,有些方式我不理解。有人可以帮我澄清一些事情吗?(我首先在PHP中学习了OOP。) 所以可以这样制作一个类: 到目前为止,这一切正确吗? 然后有人喜欢使用自执行匿名函数方法来创建名称空间。这样做的目的是什么,当您在上面做同样的事情时,提供了一个命名空间? 最后,您有一个我不理解的对象文字符号。