类型的 DynamoDB 属性Number
可以存储 126 位整数(或 127 位无符号整数,但需要注意)。
根据亚马逊的文档 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.Number:
数字的精度可达 38 位。超过此值将导致异常。
这意味着(通过在 AWS 控制台中测试验证)DynamoDB 可以分别存储在 a 中的最大正整数和最小负整数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位的unsignedint 也是如此,但有一些注意事项:
- 您需要避免(或者至少要非常小心)使用这样的数字作为排序键,因为最高有效位为 1 的值将排序为负数。
- 您的应用程序在 DynamoDB 中存储或查询无符号整数时需要将它们转换为有符号整数,并且在从 DynamoDB 读取数据后还需要将它们转换回无符号整数。
如果是我,如果没有非常非常充分的理由,我不会再冒一点风险。
一个合乎逻辑的问题是 126(或考虑到上述注意事项的 127)是否足以存储 UUID。答案是:视情况而定。如果您可以控制 UUID 的生成,那么您始终可以从 UUID 中删除一两个位并存储它。如果您从 4 个“版本”位开始(参见格式here https://en.wikipedia.org/wiki/Universally_unique_identifier#Format)那么如果您始终生成具有相同版本的 UUID,您可能根本不会丢失任何熵。
但是,如果其他人正在生成这些 UUID 并且期望无损存储,那么您可能无法使用Number
来存储UUID。但如果您将客户端限制为 4-8 个白名单,您也许可以存储它UUID 版本 https://en.wikipedia.org/wiki/Universally_unique_identifier#Versions。现在最大的版本是 0-15 范围内的 5 个,并且出于隐私原因不鼓励使用某些旧版本,因此此限制可能是合理的,具体取决于您的客户以及他们是否遵守中定义的版本位RFC 4122 https://www.rfc-editor.org/rfc/rfc4122#page-7.
顺便说一句,我很惊讶这个位限制问题还没有在线……至少不是在一个容易通过谷歌搜索的地方。因此,请贡献此问答对,以便未来的搜索者可以找到它。