Number类型的DynamoDB属性中可以存储多少位整数数据?

时间:2018-10-30 02:23:55

标签: amazon-dynamodb aws-sdk aws-sdk-js aws-sdk-nodejs

DynamoDB的Number类型支持38位十进制精度。这不足以存储需要39位数字的128位整数。对于无符号128位整数,最大值为340,282,366,920,938,463,463,374,607,431,768,211,455,对于有符号128位整数为170,141,183,460,469,231,731,687,303,715,884,105,727。这些都是39位数字。

如果我不能存储128位,那么我可以在Number中存储多少位整数数据

1 个答案:

答案 0 :(得分:1)

类型为Number的DynamoDB属性可以存储126位整数(或127位无符号整数,但有一些警告)。

根据Amazon的documentation

  

数字的精度最高为38位。超出此范围将导致异常。

(通过AWS控制台中的测试验证)这意味着DynamoDB可以存储在Number属性中的最大正整数和最小负整数分别是:

  

99,999,999,999,999,999,999,999,999,999,999,999,999,999(aka 10 ^ 38-1)   -99,999,999,999,999,999,999,999,999,999,999,999,999,999(aka -10 ^ 38 + 1)

这些数字需要使用以下公式存储126位:

bits = floor (ln(number) / ln (2))
     = floor (87.498 / 0.693)
     = floor (126.259)
     = 126

因此,您可以安全地在DynamoDB中存储126位带符号的int。

如果您想过着危险的生活,也可以存储一个127位的 unsigned int,但是有一些警告:

  • 您需要避免(或至少要非常小心)使用这样的数字作为排序键,因为最高有效位为1的值将作为负数排序。
  • 您的应用在存储DynamoDB或在DynamoDB中查询无符号整数时需要将它们转换为无符号整数,并且从DynamoDB读取数据后,还需要将它们转换回无符号整数。

如果是我,没有非常非常好的理由,我就不会再冒这些风险。

一个逻辑问题是126(在上面的警告中为127)是否足以存储UUID。答案是:这取决于。如果您控制着UUID的生成,那么您始终可以从UUID中剃掉一两个字并进行存储。如果您从4个“版本”位中刮除(请参阅格式here),则如果始终生成具有相同版本的UUID,则可能根本不会丢失任何熵。

但是,如果其他人正在生成这些UUID并期望无损存储,则您可能无法使用Number来存储UUID。但是,如果将客户端限制为4-8 UUID versions的白名单,则可以存储它。目前最大的版本是0-15范围内的5,并且出于隐私原因不建议使用某些较旧的版本,因此此限制可能是合理的,具体取决于您的客户端以及它们是否遵循{{3 }}。

顺便说一句,令我惊讶的是,这个位限制问题还没有在线……至少在一个易于使用Google的地方。因此,贡献这对问答对,以便将来的搜索者可以找到它。