【问题标题】:Amazon DynamoDB: Storing integers as Numbers vs. StringsAmazon DynamoDB:将整数存储为数字与字符串
【发布时间】:2017-02-01 17:24:03
【问题描述】:

我有一个使用 DynamoDB 的应用程序,我需要能够存储一些数字。目前,这些数字只会是正整数或偶尔会是小数点后 1 位的正数。

由于 DynamoDB 只有一种 Number 数据类型,我认为它在某种程度上相当于浮点数,将整数存储为 Numbers 是否安全,而不必担心精度会导致返回值不正确(即 1.999999999999 而不是 2)?或者我应该将它们保存为字符串并在需要时从字符串中解析整数。我知道 DynamoDB 已经在后台的某个时间点将数字存储为字符串,但我不确定在转换之前是否存在准确性损失的可能性。

正如我所说,我只会使用最多 1 位小数的正数。

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

    数字类型的属性。例如:

    “N”:“123.45”

    数字作为字符串通过网络发送到 DynamoDB,以 最大限度地提高跨语言和库的兼容性。然而, DynamoDB 将它们视为数学的数字类型属性 操作。

    类型:字符串必填:否

    根据文档,如果您将数字存储为 1.999999,您将得到 1.999999。

    还有更多文档:

    数字

    一个数字最多可以有 38 位的精度,并且可以是正数, 负数或零。

    正值范围:1E-130 到 9.9999999999999999999999999999999999999E+125 负值范围:-9.9999999999999999999999999999999999999E+125 到 -1E-130 DynamoDB 使用 JSON 字符串来表示请求和回复中的数字数据。有关更多信息,请参阅 DynamoDB 低级 API。

    如果数字精度很重要,您应该将数字传递给 DynamoDB 使用从数字类型转换而来的字符串。

    【讨论】:

    • 文档第二个引用中的粗体线正是激发了这个问题的原因,但再次阅读它,我意识到我混淆了准确性和精确性。我的意思是数字可能无法准确存储,而实际上这意味着如果我想存储一个超出其系统精度限制的数字,那么最好将其存储为字符串。谢谢!
    • @GeoffMcLennan Exaclty 我如何从文档中理解它。由于数字的类型是字符串,并且数字转换只发生在内部,所以应该没有任何问题。但是,一旦您准备好设置,请始终测试所有内容以确保其按预期工作。
    【解决方案2】:

    将数字存储为 DynamoDB Number data type 的另一个优点。

    UpdateExpression中,可以使用+ or -来加/减数值。

    示例:-

    添加:-

    UpdateExpression : "SET total_val = total_val + :value",            
        ExpressionAttributeValues: {                
                ':value': 2
        },
    

    减法:-

    UpdateExpression : "SET total_val = total_val - :value",            
            ExpressionAttributeValues: {                
                    ':value': 2
            },
    

    如果您将数字作为字符串数据类型存储在 DynamoDB 中,则上述情况是不可能的。

    【讨论】:

    • 这是一个很好的观点,但不幸的是不适用于我的具体情况,因为我只会手动设置值,不会以任何方式递增。一个有效的答案。
    • 这不是真的。如果您将数字存储为“1000001”,您仍然可以在更新语句中执行相同的数学表达式。也许这个答案在 2017 年 2 月是正确的,但现在不是。
    • 算术精度是多少?具体来说,当您欺骗 dynamodb 执行像 1e40 + 1 这样的更新表达式时会发生什么?
    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2018-01-04
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多