存储各种测量单位(kg、ml、mm、pl)的浮点值

mis*_*iso 5 postgresql database-design floating-point

我有一张如下表:

order_item
------------
serial      | id (PK)
integer     | order_id
????        | quantity
integer     | unit_of_measure_id (PK) --> ml, l, kg, mg, mm, m, etc.
Run Code Online (Sandbox Code Playgroud)

我正在做一个应用程序,我需要存储化学分析中使用的材料量。有时材料的用量很小,如微升,有时则更多,如一两升。

它的numeric数据类型是否足够好?

我读过将值转换为最小度量单位是个好主意。所以如果我有 10 升,我必须传递到 10000000 微升。但是,如果您将来需要使用更低的度量单位怎么办?像皮升?不可避免地,我认为应用程序将不得不使用浮点数。

Erw*_*ter 3

如果您需要精确存储精度未知的数字,那么数据类型 numeric就是最佳选择。就像 @dezso 已经评论过的那样,它准确地存储您传递的内容,而无需四舍五入,最多可达疯狂的数字量。根据文档:

小数点前最多 131072 位;小数点后最多 16383 位

但请注意,甚至numeric无法准确地存储计算结果1::numeric/3,因为原则上这是不可能的。除非另有说明,Postgres 似乎会以 20 的比例截断结果,而 JDBC 仅显示 12 的比例:
SQL Fiddle。

你要为极端的精确付出代价。根据文档:

然而,与类型或下一节中描述的浮点类型numeric相比,对值进行算术非常慢 。integer

只要您不对数字进行大量计算,就没有多大关系。

至于单位,我不会对同一个计量单位使用多个竞争单位。只带一个。所以只是m为了米,而不是mm等等km

如果这对于您的用例来说是实用的,我会坚持使用SI 单位。

您已经提到了获得更好性能的替代方案:将integer(或bigint?)数字与最小测量单位结合起来。