NoSQL数据模型设计 - 特殊应用建模 - 货币数据

本文为NoSQL数据模型设计系列的一部分。

货币数据需要精确数据类型并能够进行精确运算,但是常见的浮点型小数不支持精确计算。这成为货币数据建模的重要关注点

在mongodb中一般有两种模型处理货币数据

  • 数值模型
    当需要精确运算时,需要数值模型,有两种方式

    1. 采用十进制BSON类型
    2. 采用比例因子
  • 非数值模型
    不需要做精确运算时或可接受近似计算,可用非数值模型

数值模型

十进制BSON类型

mongodb 3.4开始支持decimal BSON类型,它能够支持精确数据存储和运算。

例如,使用NumberDecimal构造decimal BSON数据

db.gasprices.insert{ "_id" : 1, "date" : ISODate(), "price" : NumberDecimal("2.099"), "station" : "Quikstop", "grade" : "regular" }
采用比例因子

将货币数据乘以固定的10的方幂转化为64位整形(long BSON类型)。这里,转化系统10的方幂需要被应用记住,以便能够将存储的整形转换回货币数据。

例如,9.99美元以1000的比例因子保存为

{ price: 9990, currency: "USD" }

非数值模型

非数值模型使用两个字段保存货币数据

a. 采用非数值类型例如string或BinData保存精确数据
b. 采用浮点型例如double保存近似数据

例如

{
  price: { display: "9.99", approx: 9.9900000000000002, currency: "USD" },
  fee: { display: "0.25", approx: 0.2499999999999999, currency: "USD" }
}

近似值字段用来范围过滤或排序,精确值字段用于显示或进一步处理。

完整内容请查看NoSQL数据模型设计系列

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。