Number 类型的 DynamoDB 属性可以存储 126 位整数(或 127 位无符号整数,有严重警告)。
据亚马逊documentation:
数字的精度最高可达 38 位。超过这个会导致异常。
这意味着(通过在 AWS 控制台中测试验证)DynamoDB 可以存储在 Number 属性中的最大正整数和最小负整数分别是:
99,999,999,999,999,999,999,999,999,999,999,999,999(又名 10^38-1)
-99,999,999,999,999,999,999,999,999,999,999,999,999(又名-10^38+1)
这些数字需要 126 位的存储空间,使用以下公式:
bits = floor (ln(number) / ln (2))
= floor (87.498 / 0.693)
= floor (126.259)
= 126
因此,您可以在 DynamoDB 中安全地存储 126 位带符号整数。
如果你想危险地生活,你也可以存储一个 127 位的 unsigned int,但有一些警告:
- 您需要避免(或至少要非常小心)使用这样的数字作为排序键,因为最高有效位为 1 的值将排序为负数。
- 在 DynamoDB 中存储或查询无符号整数时,您的应用需要将它们转换为有符号整数,并且在从 DynamoDB 读取数据后还需要将它们转换回无符号整数。
如果是我,如果没有非常非常好的理由,我不会再冒这些风险。
一个合乎逻辑的问题是 126(或考虑到上述警告的 127)是否足以存储 UUID。答案是:视情况而定。如果您可以控制 UUID 的生成,那么您始终可以从 UUID 中删除一两个并存储它。如果您从 4 个“版本”位中剔除(请参阅格式 here),那么如果您始终生成具有相同版本的 UUID,那么您可能根本不会丢失任何熵。
但是,如果其他人正在生成这些 UUID 并且期望无损存储,那么您可能无法使用 Number 来存储 UUID。但是,如果您将客户端限制在 4-8 UUID versions 的白名单中,则可以存储它。现在最大的版本是 0-15 范围内的 5 个,出于隐私原因,不鼓励使用一些旧版本,因此此限制可能是合理的,具体取决于您的客户以及他们是否遵守RFC 4122 中定义的版本位.
顺便说一句,我很惊讶这个位限制问题还没有出现在网上……至少不是在一个容易被谷歌搜索到的地方。所以贡献这个问答对,以便未来的搜索者可以找到它。