2010-10-18 63 views
7

我期待创建各种单位的数据库模型和他们之间的关系。例如,36英寸= 3英尺= 1码= 0.9144米等。此表还将以盎司,磅,千克,克,厘米和各种测量值存储杯子。你如何建立单位换算表格?

你是如何做到这一点的?我在想这样的事情:

 
Amount | Units | ConversionFactor | ConversionUnits 
1  | foot | 12    | inches 
1  | yard | 36    | inches 

但坦率地说,这似乎是一个可怕的想法。试图找出院子里有多少脚会非常复杂,而且我不认为我能存储所有需要的转换。

还有什么其他想法?我知道这是一个解决的问题。谢谢!

+0

为什么你需要存储转换单元在数据库中?他们不会改变。 – 2010-10-18 01:17:22

+1

啊,这是多么简单,如果你们采取公制系统。但那是另一个讨论。 – steinar 2010-10-18 01:42:47

+0

因为我想存储食物及其营养信息。我想以克为单位输入配方,只要我喜欢它就将它切换到盎司。国际单位制的 – 2010-10-18 01:48:37

回答

5

商店conversions to SI units,而不适用于其他非十进制单位。然后你可以在不需要知道显式转换的单元之间进行转换。

Unit   | Class  | Base Unit Multiplier 
------------------------------------------------------ 
foot   | length  | 0.304800610 
yard   | length  | 0.914401830 
square foot | area  | 0.092903040 
... 

所以14英尺中码为:

14 feet * 0.304800610 = 4.26720854 meters 
4.26720854 meters * 0.914401830⁻¹ = 4.66666667 yards 
+1

-1 - 这种解决方案只适用于SI单位为标准的情况,否则可能会引入舍入误差(例如,如果在脚和码之间转换)。包括Class在内的+1平衡。 – 2010-10-18 10:32:25

+3

@Mark - 国际单位*是常态(对于我们60亿,无论如何:)此外,您也可能会得到英制单位的舍入误差,例如: '1英尺= 0.000189393939394英里'。 – Seth 2010-10-18 16:59:37

+0

波特兰你在吗? :)我通常会建议选择尽可能小的转换单位作为基本单位。 – 2010-10-18 17:23:14

2

我觉得原来的职位提出的模式是好的,除了不包括类(如Seth的回答) - 你不想尝试在品脱和英寸之间进行转换。

两个单元,其中它们都不是转换单元被简单地通过检索这两个单元的转换记录和由其它(例如36/12 = 3脚在码)除以一个因子来实现之间转换。

如果你特别关心的准确性,您可以确保所有单位给定类具有对于同一类别的所有其他单位的条目 - 这在我看来是矫枉过正,但。

3

选择每个dimension你有兴趣在一个基本单元(读取wiki页面,它会很有用)。例如,如果您的大部分数据都是国际单位制单位,您需要选择质量数,千分之一,米数等等。如果您的大部分数据都是美制单位,请从US customary units中选取单位,例如质量英尺,长度单位,秒数。

然后存储,您要能够处理各单位实际,转换系数到该尺寸相适应的基本单元。所以,如果你选择的脚作为距离的您的基本单元,存储

Unit Dimension Factor 
Foot Distance  1 
Metre Distance  3.28084 
Mile Distance  5280 

要真正做一个转换,一旦你选中的尺寸相匹配,简单地乘以源单元的Factor,再除以目的地单元的Factor。例如,从米到英里,由3.28084相乘,然后通过除以5280

2
CREATE TABLE UnitConversion 
(
    [FromUnit] NVARCHAR(100), 
    [ToUnit] NVARCHAR(100), 
    [FromOffset] DECIMAL(29,10), 
    [Multiplicand] DECIMAL(29,10), 
    [Denominator] DECIMAL(29,10), 
    [ToOffset] DECIMAL(29,10) 
) 

ToUnit =(FromUnit + FromOffset)*被乘数/分母+ ToOffset