在SQL数据库中存储权重的最佳实践?

时间:2012-10-19 15:00:58

标签: mysql database-design

我正在处理的应用程序需要存储格式X pounds, y.y ounces的权重。数据库是MySQL,但我认为这与数据库无关。

我可以想到三种方法:

  1. 将重量转换为十进制磅并存储在单个字段中。 (5磅6.2盎司= 5.33671875磅)
  2. 将重量转换为十进制盎司并存储在单个字段中。 (5磅6.2盎司= 86.2盎司)
  3. 在两个字段中将磅部分存储为整数,将盎司部分存储为小数。
  4. 我认为#1不是一个好主意,因为十进制磅将产生任意精度的数字,这需要存储为浮点数,这可能导致浮点数固有的不准确性。

    是否有令人信服的理由选择#2而非#3或反之亦然?

3 个答案:

答案 0 :(得分:7)

我很想将它存储在公制单位中,因为它们往往是简单的小数,而不是像磅和盎司这样的复杂值。这样,你可以存储一个值(即103.25千克)而不是磅 - 盎司当量,并且更容易执行转换。

这是我过去处理过的事情。我在职业摔跤和混合武术(MMA)网站上做了很多工作,需要记录战士的身高和体重。它们往往显示为英尺和英寸以及磅和盎司,但我仍然将这些值存储在它们的厘米和千克当量中,然后在网站上显示时进行转换。

答案 1 :(得分:0)

首先,我不知道浮点数是如何不准确的 - 谢天谢地,搜索后者帮助我理解:Floating Point Inaccuracy Examples

我完全同意@eggyal - 将数据保存在一个列中的单一格式中。这允许您将它暴露给应用程序并让应用程序处理它的呈现 - 无论是lbs / oz,四舍五入的lbs,等等。

数据库应保留原始数据,而表示层指示布局。

答案 2 :(得分:0)

您可以为权重列使用十进制数据类型。

decimal('weight', 8, 2);        // precision = 8, scale = 2
Storage size:
Precision 1-9       5 Bytes
Precision 10-19     9 Bytes
Precision 20-28     13 Bytes
Precision 29-38     17 Bytes