amazon-dynamodb - dynamodb 中的自增整数
问题描述
我正在为发票应用程序建模 dynamodb 图,我正在寻找生成需要从 1 递增到 X 的唯一发票 ID。在 2019 年,有一个解决方案可以解决将 aws appsync 和 dynamodb 作为数据源的此类问题?
解决方案
在 DynamoDB 中不推荐使用自动递增整数模式,尽管可以使用应用程序级逻辑实现类似的东西。DynamoDB 表根据表的分区键分布到许多逻辑分区。然后根据它们的排序键在该分区内对项目进行排序。你需要决定什么样的结构对你的应用有意义,以及自动递增对你的应用意味着什么。最简单的情况是省略排序键并将自动递增的 id 视为分区键,这将保证其唯一性,但也意味着每一行都存在于自己的分区中,因此列出所有发票必须是Scan和因此不会保留对您的应用可能有意义或可能没有意义的顺序。
正如这篇 SO 帖子(How to use auto increment for primary key id in dynamodb)中所述,您可以使用如下代码:
const params = {
TableName: 'CounterTable',
Key: { HashKey : 'auto-incrementing-counter' },
UpdateExpression: 'ADD #a :x',
ExpressionAttributeNames: {'#a' : "counter_value"},
ExpressionAttributeValues: {':x' : 1},
ReturnValues: "UPDATED_NEW" // ensures you get value back the new key
};
new AWS.DynamoDB.DocumentClient().update(params, function(err, data) {});
以原子方式递增存储在由分区键“auto-incrementing-counter”指定的CounterTable行中的整数。在原子增量之后,您可以使用返回的 id 创建新的Invoice。
您可以使用 DynamoDB 和 AppSync 实现此模式,但首先要确定它是否适合您的用例。您可能还对通过 RDS 数据 API 进行的 RDS 集成感兴趣,该 API 将对自动递增 ID 提供更多本机支持,但会失去它并忘记它对 DynamoDB 的扩展。
推荐阅读
- java - Junit 在 EntityManager 上抛出 NullPointerException
- rust - 如何访问 Rust 枚举中的结构字段?
- javascript - (React Native)设置 AsyncStorage 值但在我检索它时得到垃圾
- java - java/kotlin 中是否有诸如“Work in progress”、“todo”、“implementation not finished”或“draft”之类的注释?
- java - 没有获得全屏背景或字体
- html - 提交表单域重叠
- python - 用前两列之间的差异替换数据帧的几个零
- javascript - Node.js 承诺 .then() 不是序列
- flutter - 基于 StateProvider 更新生成一个临时的 OverlayEntry
- javascript - 在 reactjs 中注销后更改导航栏链接