Database 如何为单位转换表建模?
我希望创建一个各种单元及其相互关系的db模型。例如,36英寸=3英尺=1码=0.9144米等等。这张桌子还可以储存盎司、磅、千克、克、厘米和各种尺寸的杯子 你是怎么做到的?我在想这样的事情: Amount | Units | ConversionFactor | ConversionUnits 1 | foot | 12 | inches 1 | yard | 36 | inches 金额|单位|换算系数|换算单位 1英尺12英寸 1码36英寸 但坦率地说,这似乎是个糟糕的主意。试图计算出一个院子里有多少英尺是非常复杂的,而且我认为我永远无法存储我需要的所有转换 还有什么其他想法?我知道这是一个已解决的问题。谢谢 存储,而不是其他非公制单位。然后,您可以在中的单元之间进行转换,而无需知道显式转换Database 如何为单位转换表建模?,database,modeling,Database,Modeling,我希望创建一个各种单元及其相互关系的db模型。例如,36英寸=3英尺=1码=0.9144米等等。这张桌子还可以储存盎司、磅、千克、克、厘米和各种尺寸的杯子 你是怎么做到的?我在想这样的事情: Amount | Units | ConversionFactor | ConversionUnits 1 | foot | 12 | inches 1 | yard | 36 | inches 金额|单位|换算系数|换算单位
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
我认为原始帖子提出的模式很好,除了不包括类(如Seth的回答中所述)——你不想尝试在品脱和英寸之间转换 如果两个单位都不是转换单位,则只需检索两个单位的转换记录并将一个系数除以另一个系数(例如36/12=一码中的3英尺),即可实现两个单位之间的转换 如果您特别关心准确性,您可以确保给定类的所有单元都有同一类中所有其他单元的条目-但这让我觉得有些过分。为您感兴趣的每个单元选择一个基本单元(阅读该wiki页面,它会很有用)。例如,如果您的大多数数据是以国际单位制为单位的,那么您可以选择千克表示质量,秒表示时间,米表示距离,等等。如果您的大多数数据以美国单位表示,请从中选择单位,例如磅表示质量,英尺表示长度,秒表示时间 然后,对于您希望能够处理的每个实际单位,将转换系数存储到尺寸合适的基本单位。所以,如果你选择脚作为你的基本距离单位,储存
Unit Dimension Factor
Foot Distance 1
Metre Distance 3.28084
Mile Distance 5280
要真正进行转换,检查尺寸匹配后,只需乘以源单位的因子
,然后除以目标单位的因子
。例如,要从米到英里,乘以3.28084,然后除以5280
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为什么需要在数据库中存储转换单位?他们不会改变的。啊,如果你们采用公制,这将是多么简单。但这是另一个讨论,因为我想储存食物及其营养信息。我想输入一个以克为单位的配方,并在我喜欢时将其转换为盎司。-1对于国际单位制-此解决方案仅在国际单位制为标准的情况下可能有用,否则可能会引入舍入误差(例如,如果在英尺和码之间转换)。包括等级,以+1进行平衡。@马克-国际单位制是标准(无论如何,对于我们60亿人来说:)此外,你也可能会得到英制单位的舍入误差,例如:
1英尺=0.000189394英里。
。你在哪个波特兰?:)我通常会建议选择尽可能最小的转换单位作为基本单位。有没有办法将这种方法扩展到包括温度(F-C,反之亦然)等转换,这些转换与单个乘数无关?(见后续问题。)