2010-10-18 9 views
7

Ich suche ein DB-Modell von verschiedenen Einheiten und ihre Beziehung zueinander zu erstellen. Zum Beispiel 36 Zoll = 3 Fuß = 1 Yard = 0,9144 Meter usw. Dieser Tisch würde auch Tassen in Unzen, Pfund, Kilogramm, Gramm, cm und alle Arten von Messungen speichern.Wie modellieren Sie eine Tabelle für die Einheitenumrechnung?

Wie machst du das? Ich dachte über so etwas nach:

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

Aber offen gesagt scheint dies wie eine schreckliche Idee. Ich versuchte herauszufinden, wie viele Fuß in einem Garten sehr verworren wären, und ich glaube nicht, dass ich jemals alle Umbauten speichern könnte, die ich brauche.

Welche anderen Ideen gibt es? Ich weiß, das ist ein gelöstes Problem. Vielen Dank!

+0

Warum brauchen Sie Konvertierungseinheiten zu speichern, in einer Datenbank? Sie werden sich nicht ändern. –

+1

Ahh, wie einfach wäre das, wenn ihr das metrische System benutzt hättet. Aber das ist eine andere Diskussion. – steinar

+0

Weil ich Lebensmittel und ihre Ernährungsinformationen speichern möchte. Ich möchte ein Rezept in Gramm eingeben und es auf Unzen umstellen, wann immer mir danach ist. –

Antwort

5

Store conversions to SI units, nicht zu anderen nicht metrischen Einheiten. Dann können Sie zwischen Einheiten konvertieren, ohne die explizite Konvertierung zu kennen.

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

So 14 Fuß in Metern ist:

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

-1 für SI-Einheiten - diese Lösung ist nur in Situationen sinnvoll, in denen SI-Einheiten die Norm sind, da sonst Rundungsfehler auftreten können (z. B. bei der Konvertierung zwischen Fuß und Yard). Counter-Balanced von +1 für die Einbeziehung der Klasse. –

+3

@Mark - SI-Einheiten * sind * die Norm (für 6 Milliarden von uns sowieso :) Außerdem können Sie Rundungsfehler auch mit imperialen Einheiten erhalten, z. B. '1 Fuß = 0,000189393939394 Meilen'. – Seth

+0

in welchem ​​Portland bist du? :) Ich würde normalerweise vorschlagen, die kleinste mögliche Umwandlungseinheit als die Basiseinheit auszuwählen. –

2

ich glaube, die vorgeschlagene Schema der ursprünglichen Nachricht ist in Ordnung, abgesehen von nicht einschließlich Klasse (wie in Seths Antwort) - Sie wollen nicht versuchen, um zwischen Pints ​​und Zoll zu konvertieren.

Konvertieren zwischen zwei Einheiten, bei denen keine die Konvertierungseinheit ist, wird einfach dadurch erreicht, dass die Umwandlungsdatensätze beider Einheiten abgerufen werden und ein Faktor durch den anderen geteilt wird (z. B. 36/12 = 3 Fuß in einem Hof).

Wenn Sie besonders auf Genauigkeit achten, können Sie sicherstellen, dass alle Einheiten für eine bestimmte Klasse Einträge für alle anderen Einheiten der gleichen Klasse haben - das erscheint mir jedoch als Overkill.

3

Wählen Sie eine Basiseinheit für jede dimension Sie interessiert sind (lesen Sie die Wiki-Seite, es wird nützlich sein). Wenn beispielsweise die meisten Daten in SI-Einheiten vorliegen, würden Sie Kilogramm für Masse, Sekunde für Zeit, Meter für Entfernung usw. auswählen. Wenn die meisten Ihrer Daten in US-Einheiten sind, wählen Sie Einheiten aus der US customary units, zum Beispiel Pfund für Masse, Fuß für Länge, Sekunde für Zeit.

Speichern Sie dann für jede tatsächlich zu verwaltende Einheit den Umrechnungsfaktor auf die maßgerechte Basiseinheit. Also, wenn Sie einen Fuß als Basiseinheit der Entfernung auswählen, speichern

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

Dazu tatsächlich eine Umwandlung, wenn man einmal überprüft, dass die Abmessungen entsprechen, multiplizieren Sie einfach mit der Factor der Quelleneinheit und Dividieren durch die Factor der Zieleinheit. Zum Beispiel von m Meilen zu erhalten, multiplizieren mit 3,28084, dann teilen von 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) * Multiplikand/Denominator + toOffset

Verwandte Themen