2010-10-18 8 views
7

Estoy buscando crear un modelo db de varias unidades y su relación entre ellas. Por ejemplo, 36 pulgadas = 3 pies = 1 yarda = .9144 metros, etc. Esta tabla también almacenaría tazas en onzas, libras, kg, gramos, cm y todo tipo de mediciones.¿Cómo modelas una tabla para conversión de unidades?

¿Cómo se hace esto? Estaba pensando en algo como esto:

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

Pero francamente, esto parece una idea terrible. Intentar averiguar cuántos pies en un jardín sería complicado, y no creo que pueda almacenar todas las conversiones que necesito.

¿Qué otras ideas hay? Sé que este es un problema resuelto. ¡Gracias!

+0

¿Por qué necesita para almacenar unidades de conversión en una base de datos? No van a cambiar. –

+1

Ahh, qué simple sería si ustedes tomaran el sistema métrico. Pero esa es otra discusión. – steinar

+0

Porque quiero almacenar alimentos y su información nutricional. Quiero ingresar una receta en gramos y cambiarla a onces cada vez que me apetezca. –

Respuesta

5

Tienda conversions to SI units, no a otras unidades no métricas. Luego puede convertir entre unidades sin necesidad de conocer la conversión explícita.

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

Así que 14 pies de yardas es:

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

-1 para unidades SI: esta solución solo es útil en situaciones en las que las unidades SI son la norma; de lo contrario, es probable que presente errores de redondeo (por ejemplo, conversión entre pies y yardas). Contador equilibrado por +1 para incluir Class. –

+3

@Mark - Las unidades SI * son * la norma (para 6 billones de nosotros, de todos modos :) Además, también puede obtener errores de redondeo con unidades imperiales, por ejemplo: '1 pie = 0.000189393939394 millas'. – Seth

+0

en que Portland estas? :) Normalmente sugeriría elegir la unidad de conversión más pequeña posible como unidad base. –

2

creo que el esquema propuesto por el post original está muy bien, aparte de no incluida Clase (como en la respuesta de Seth) - usted no desea probar para convertir entre pintas y pulgadas.

La conversión entre dos unidades donde ninguna de ellas es la unidad de conversión se logra simplemente recuperando los registros de conversión de ambas unidades y dividiendo un factor por el otro (por ejemplo, 36/12 = 3 pies en una yarda).

Si le preocupa particularmente la precisión, puede asegurarse de que todas las unidades de una clase determinada tengan entradas para todas las demás unidades de la misma clase; sin embargo, esto me parece una exageración.

3

Elija una unidad base para cada dimension que le interese (lea esa página wiki, será útil). Por ejemplo, si la mayoría de sus datos están en unidades SI, usted escogería kilogramo para masa, segundo para tiempo, metro para distancia, y así sucesivamente. Si la mayoría de sus datos están en unidades de EE. UU., Elija unidades del US customary units, por ejemplo libras para masa, pie para longitud, segundo para tiempo.

A continuación, almacene, para cada unidad real que desee controlar, el factor de conversión en la unidad base dimensionalmente adecuada. Así que si usted elige el pie como la unidad base de la distancia, almacenar

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

para realmente hacer una conversión, una vez que haya comprobado que las dimensiones coinciden, simplemente multiplique por el Factor de la unidad de origen, y se divide por el Factor de la unidad de destino. Por ejemplo, para obtener de metros a millas, multiplicar por 3,28084, y se divide por 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) * Multiplicando/Denominador + ToOffset

Cuestiones relacionadas