在我的db方案中,我需要一个自动增量主键.我怎样才能实现这个功能?

PS要访问DynamoDB,我使用dynode,模块用于Node.js.

推荐答案

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

自动增量密钥的直观工作流程:

  1. 获取最后一个计数器位置
  2. 添加1
  3. 使用新编号作为对象的索引
  4. 保存新的计数器值
  5. 保存对象

这只是为了解释根本的 idea .永远不要这样做,因为它不是原子的.在特定的工作负载下,您可能会将相同的ID分配给2+个不同的对象,因为它不是原子的.这将导致数据丢失.

解决方案是使用atomic ADD操作和UpdateItem中的ALL_NEW:

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

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

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

{
    "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's documentation编写了一些示例,可以很容易地将其推断为Node.js

如果你有什么问题,尽管问.

Database相关问答推荐

使用存储过程从子表中删除数据

我应该使用哪种数据库模型在运行时动态修改实体/属性?

有没有办法使用 JPA 注释和 Hibernate 动态 Select @GeneratedValue 策略?

如何以编程方式在 C# 中创建 Microsoft Access 数据库?

tzname字段/时区标识符名称的最大长度

使 H2 将引用的名称和未引用的名称视为相同

内存数据库和磁盘内存数据库的区别

使用十进制数据类型(MySQL / Postgres)是否会影响性能

为数据库应用程序留下审计跟踪/更改历史的有效策略?

SQLite同时读写

conflict serializable和conflict equivalent有什么区别?

删除 PHP 中的所有小数

如何在 SSIS 中插入新记录之前清空我的目标表?

在数据库中存储年份

如何从 PostgreSQL 数据库中的文本文件加载数据?

PostgreSQL 唯一索引和字符串大小写

如何将sqlite表从磁盘数据库复制到python中的内存数据库?

有哪些不同类型的索引,每种索引的好处是什么?

是否有任何支持协议缓冲区的数据库?

Cassandra - 事务支持