我想在数据库中存储度量单位 - 我应该使用哪种数据类型?

5
我希望在数据库中存储身高数据,最终会以英制/美制(例如6英尺4英寸)的形式显示。目前我使用的是MySQL数据库(计划迁移到PostgreSQL)。我想知道哪种单位适合这种存储方式,应该使用哪种列类型?我认为厘米/公制系统和一些数字列类型比较合适,但如果有人能提供更多见解就更好了。

1
只有三个国家使用英制度量单位,所以我会支持公制单位。 - OMG Ponies
1
尽管美式足球场地的度量市场相对较小,但是天哪。 - Martin Beckett
1
@Martin Beckett:转换只是一个表示问题。 - OMG Ponies
1
@OMG 在这种情况下,使用英制的国家有多少并不重要 - 即使每个国家都使用英制。 - user533832
6个回答

1

我认为这主要取决于对数据进行哪些操作。如果只是存储和检索以供显示,那么将其存储为文本。如果需要进行像平均值和范围之类的计算,则在将其缩减到基本度量单位(例如英寸或百分之一英寸)后将其存储为数字类型。整数或浮点类型的选择再次取决于您需要执行的计算。

将数据库转换为公制单位,然后再将其转换回英制单位以进行输出的唯一原因是,如果您需要公制单位用于其他原因,并且比生成英制输出更重要/频繁。否则,您只会在两个方向上引入舍入误差。


2
-1 建议将其存储为文本 - 即使它只是作为文本输出,也不会进行任何计算,数字类型更好,因为“文本”将引入一致性问题(一个记录说6'4",另一个说6ft4in - 真糟糕)。+1 对于无意义转换的优秀理由。 - user533832
同意以上观点,有类似情况的经验。数据格式完全不一致,在应用程序中和运行报告时都会引起很多问题。 - Mohgeroth
@user533832 如果你不需要进行任何计算,将数字存储为文本是一个好主意。 - srh

1

使用int数据类型将其存储为厘米。注意1厘米=0.39370078740157477英寸


1
更方便地说,根据定义,1英寸等于25.4毫米。 - Martin Beckett
1
实际上,表达这个的方式是 2.54 厘米恰好等于 1 英寸。 (参考这里。) (就像 @Martin 在我写这篇文章时所写的一样。 :)) - Ted Hopp

1
如果它们是连续的量,那么请将它们存储为浮点数以米为单位,并在报告中转换为米、米+厘米、英尺、弗隆。如果它们是固定单位,您不希望出现舍入误差,例如产品尺寸,请将它们存储为最小度量单位毫升、毫米、毫克等的整数,并在输出时再次进行转换。

1
如果您正在存储一个人的身高,那么存在一个上限(2.5米?),您不太可能测量超过1毫米 - 可能更接近1厘米,因此只需使用毫米的整数(或者无符号厘米的字符,如果您真的想节省空间!) - Martin Beckett
1
浮点数不可靠。"由于浮点数是近似值,而不是精确值,试图在比较中将它们视为精确值可能会导致问题。" http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html - OMG Ponies
1
@OMG 尝试精确比较像身高这样的两个物理属性可能会遇到海森堡博士的问题。 - Martin Beckett
2
@Ted - 如果你测量一个人的身高为172厘米,那么你只知道他们的身高在171.5到172.5厘米之间,任何比这更精确的陈述都是没有意义的。更明智的做法是将其存储为具有有限二进制表示的浮点数,这意味着它将返回1.7200000000001,而不是将其存储为(int)172,这意味着它是一个固定的数字。这就是为什么在Fortran中浮点数被称为REAL。 - Martin Beckett
1
@Martin - 实际上,“172cm”并没有告诉您有关测量不确定性的任何信息。您混淆了分辨率和不确定性,这是一个常见的错误。如果每次测量的不确定性为+/-2cm呢?实验者应该怎么办?四舍五入到最近的4吗?不!实验者应该记录测得的数字(最好连同不确定性一起记录),而不会引入更多误差。 - Ted Hopp
显示剩余8条评论

0

就我个人而言,我看不出为什么任何数据库在存储公制单位和英制单位方面会比其他数据库更好。在处理测量存储问题时,我认为有两种主要的思路。一种是以最小合理单位存储并将其用作一切的基础(即所有单位均为克和厘米)。另一种方法是如果使用混合单位,则存储单位与比例,但这可能会使设置变得比必要更加复杂。

如果不存在比基本单位更高分辨率的测量可能性,则可以使用int或long存储值。


0

如果您只会显示英制单位,那么存储公制单位可能没有什么好处。您可以使用int来存储英寸数,这样可以避免麻烦。如果您需要更高的分辨率,则可以选择以下两种方法:

  • 使用int来存储(例如)英寸的十分之一
  • 使用数字来存储小数值

由于您只需存储“数百/数千人的身高”,因此存储问题极不可能成为一个问题。


-2

这听起来可能有些奇怪,但如果英制度量衡是默认的话,这种方法可能适用于您。然后我会将长度存储为CHAR(2)的十六进制值。例如6英尺11英寸变成了6B,该列是可排序的,并且您不会遇到在存储公制长度时可能发生的四舍五入问题。


2
-1 非常聪明,但肯定不只有我会称之为“一个坏主意”。 - user533832
好的,对于公制单位来说不是一个好主意,但对于英尺和英寸,你能想到更好的方法吗? :) - jhavrda
1
我想不出还有什么比这更糟的了。身高是一个数字,让我们将其作为数字存储!我的建议是以英寸为单位存储并在表示层将其转换为可读格式。 - user533832

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接