我正在寻找创建各种单位的数据库模型及其相互关系。例如,36英寸= 3英尺= 1码= .9144米等。该表还将以盎司,磅,千克,克,厘米和各种测量值存储杯子。
你是怎么做到的?我在考虑这样的事情:
Amount | Units | ConversionFactor | ConversionUnits 1 | foot | 12 | inches 1 | yard | 36 | inches
但坦率地说,这似乎是个糟糕的主意。试图弄清楚院子里有多少英尺会很复杂,我认为我不能存储我需要的所有转换。
还有其他想法吗?我知道这是一个已解决的问题。谢谢!
答案 0 :(得分:7)
存储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 :(得分:4)
为您感兴趣的每个dimension选择一个基本单位(阅读该Wiki页面,它会很有用)。例如,如果您的大部分数据都是SI单位,那么您将选择千克质量,秒为时间,米为距离,等等。如果您的大部分数据都是美国单位,请从US customary units中选择单位,例如磅为质量,英尺为长度,第二为时间。
然后,为您希望能够处理的每个实际单位存储转换因子到尺寸合适的基本单位。因此,如果您选择英尺作为距离的基本单位,请存储
Unit Dimension Factor
Foot Distance 1
Metre Distance 3.28084
Mile Distance 5280
要实际进行转换,一旦检查了尺寸匹配,只需乘以源单位的Factor
,然后除以目标单位的Factor
即可。例如,要从米到英里,乘以3.28084,再除以5280。
答案 2 :(得分:2)
我认为原帖的提议架构很好,除了不包括Class(如Seth的答案) - 你不想尝试在品脱和英寸之间进行转换。
通过检索两个单位的转换记录并将一个因子除以另一个因子(例如36/12 = 3码在一码),可以简单地实现两个单位之间的转换,而这两个单位都不是转换单位。
如果你特别关注准确性,你可以确保给定班级的所有单位都有同一班级中所有其他单位的作品 - 但这对我来说太过分了。
答案 3 :(得分: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)* Multiplicand / Denominator + ToOffset