amazon-web-services - 为 DynamoDB 表生成合成分区键
问题描述
我确信这是一个关于 DynamoDB 的微不足道且常见的问题,但 Google 或 AWS 文档并没有太大帮助。
我的问题很简单:
生成分区键的模式是什么?
在 RDBMS 中,这非常简单,例如使用标识列 (MSSQL) 或序列 (Postgres)。但是,当涉及到 DynamoDB(我想这适用于任何 NoSQL 数据库)时,尚不清楚如何生成分区键——它应该是一个 GUID 还是一个在表本身中维护的序列?
这是来自AWS 文档的示例模式- 它使用递增的数字作为分区键。但是我想不出一种在应用程序级别生成非重叠序列号的方法(而不是在提供 DynamoDB 不提供的原子事务的数据库级别)
解决方案
几乎可以肯定,您希望分区键是您知道是唯一的东西,而不参考现有数据,因为它的唯一性在您的业务逻辑中被假定(如产品的序列号或用户的电子邮件地址)或者因为它是普遍唯一的(最简单的方式是作为 GUID、时间戳或其他一些一次性属性)。
大规模生成顺序唯一标识符实际上很难进行,而且大多数 RDBMS 实现实际上并不像您期望的那样严格(例如,它们通常不保证不会跳过数字,只保证它们会是唯一且单调递增的)。如果您认为需要在表中使用递增的 id,请仔细考虑为什么以及是否可以避免这样做。
如果你确实需要一个递增的数字分区键,你需要在你的应用程序中有一个服务来为你生成它。您可以将其实现为一个单独的 dynamodb 表,该表仅包含一行,并带有一个“计数器值”字段,您可以使用ADD 更新表达式递增该字段。扩展此实现将是有问题的。
推荐阅读
- c# - PDFSharp:添加到每个 PDF 第一页的书签最终都链接到组合 pdf 的第一页
- html - 将组件样式应用于页面中的最后一次出现
- java - 使用 @CrossOrigin 时未显示 CORS 响应标头
- achartengine - x 轴的偏移标记 achartengine 条形图与值的比较
- c# - 需要根据输入文件号查找确切的文件名列表
- javascript - Crypto.getRandomValues 的熵源是什么?
- quarkus - 如何覆盖 Quarkus 中的 CDI bean 进行测试?
- laravel - 在应用服务提供者中使用 app()->setLocale() 时类翻译器不存在
- vhdl - 制作一个小的 VHDL 脚本,当输入 1 时输出 1(5v) 2 秒,然后返回到零
- typescript - 从对象字面量派生 TypeScript 接口