NoSQL數(shù)據(jù)模型設(shè)計(jì) - 特殊應(yīng)用建模 - 貨幣數(shù)據(jù)

本文為NoSQL數(shù)據(jù)模型設(shè)計(jì)系列的一部分。

貨幣數(shù)據(jù)需要精確數(shù)據(jù)類(lèi)型并能夠進(jìn)行精確運(yùn)算,但是常見(jiàn)的浮點(diǎn)型小數(shù)不支持精確計(jì)算。這成為貨幣數(shù)據(jù)建模的重要關(guān)注點(diǎn)

在mongodb中一般有兩種模型處理貨幣數(shù)據(jù)

  • 數(shù)值模型
    當(dāng)需要精確運(yùn)算時(shí),需要數(shù)值模型,有兩種方式

    1. 采用十進(jìn)制BSON類(lèi)型
    2. 采用比例因子
  • 非數(shù)值模型
    不需要做精確運(yùn)算時(shí)或可接受近似計(jì)算,可用非數(shù)值模型

數(shù)值模型

十進(jìn)制BSON類(lèi)型

mongodb 3.4開(kāi)始支持decimal BSON類(lèi)型,它能夠支持精確數(shù)據(jù)存儲(chǔ)和運(yùn)算。

例如,使用NumberDecimal構(gòu)造decimal BSON數(shù)據(jù)

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

將貨幣數(shù)據(jù)乘以固定的10的方冪轉(zhuǎn)化為64位整形(long BSON類(lèi)型)。這里,轉(zhuǎn)化系統(tǒng)10的方冪需要被應(yīng)用記住,以便能夠?qū)⒋鎯?chǔ)的整形轉(zhuǎn)換回貨幣數(shù)據(jù)。

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

{ price: 9990, currency: "USD" }

非數(shù)值模型

非數(shù)值模型使用兩個(gè)字段保存貨幣數(shù)據(jù)

a. 采用非數(shù)值類(lèi)型例如string或BinData保存精確數(shù)據(jù)
b. 采用浮點(diǎn)型例如double保存近似數(shù)據(jù)

例如

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

近似值字段用來(lái)范圍過(guò)濾或排序,精確值字段用于顯示或進(jìn)一步處理。

完整內(nèi)容請(qǐng)查看NoSQL數(shù)據(jù)模型設(shè)計(jì)系列

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容