2010-10-18 8 views
7

Szukam utworzyć model db różnych jednostek i ich wzajemne relacje. Na przykład, 36 cali = 3 stopy = 1 jard = = 9144 metrów itp. Tabela ta będzie również przechowywać kubki w uncjach, funtach, kg, gramach, cm i wszelkiego rodzaju pomiarach.Jak modelujesz stół do konwersji jednostek?

Jak to zrobić? Myślałem o czymś takim:

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

Ale, szczerze mówiąc, wydaje się to okropnym pomysłem. Próbując ustalić, ile metrów na podwórzu byłoby bardzo zawiłych, i nie sądzę, żebym mógł przechowywać wszystkie potrzebne konwersje.

Jakie są inne pomysły? Wiem, że to rozwiązany problem. Dzięki!

+0

Dlaczego trzeba przechowywać jednostki przeliczeniowe w bazie danych? Oni się nie zmienią. –

+1

Ahh, jakie to proste, gdybyście przyjęli system metryczny. Ale to kolejna dyskusja. – steinar

+0

Ponieważ chcę przechowywać żywność i ich informacje o wartości odżywczej. Chcę wprowadzić przepis w gramach i przełączać go na uncje, kiedy tylko mam na to ochotę. –

Odpowiedz

5

Przechowuj conversions to SI units, a nie na innych jednostkach niemetrycznych. Następnie możesz konwertować między jednostkami bez znajomości jawnej konwersji.

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

So 14 stóp w stoczni to:

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

-1 dla jednostek SI - to rozwiązanie może być użyteczne tylko w sytuacjach, w których jednostki SI są normą, w przeciwnym razie może wprowadzić błędy zaokrąglania (na przykład w przypadku konwersji między stopami i podwórkami). Równoważony o +1 dla włączenia klasy. –

+3

@ Mark - jednostki SI * są * normą (dla 6 miliardów z nas, w każdym razie). Poza tym, możesz otrzymać błędy zaokrąglania z jednostkami calowymi, np .: '1 stopa = 0,0001893939393939 mil'. – Seth

+0

w którym Portland jesteś? :) Normalnie sugerowałbym wybór najmniejszej możliwej jednostki konwersji jako jednostki bazowej. –

2

myślę zaproponowany schemat oryginalny post jest w porządku, oprócz nie w tym klasa (jak w odpowiedzi Setha) - nie chcesz, aby spróbować konwertować pomiędzy kuflami i caliami.

Konwersja pomiędzy dwiema jednostkami, w których żadna z nich nie jest jednostką konwersji, jest po prostu osiągnięta przez pobranie rekordów konwersji obu jednostek i podzielenie jednego czynnika przez drugi (np. 36/12 = 3 stopy w stoczni).

Jeśli jesteś szczególnie zaniepokojony dokładnością, możesz upewnić się, że wszystkie jednostki dla danej klasy mają wpisy dla wszystkich innych jednostek w tej samej klasie - to jednak wydaje mi się przesadą.

3

Wybierz jednostkę bazową dla każdego interesującego Cię dimension (przeczytaj tę stronę wiki, będzie przydatna). Na przykład, jeśli większość danych znajduje się w jednostkach SI, należy wybrać kilogram masy, sekundę czasu, licznik odległości i tak dalej. Jeśli większość twoich danych znajduje się w jednostkach USA, wybierz jednostki od US customary units, na przykład funt masy, stopa długości, sekunda czasu.

Następnie przechowaj, dla każdej rzeczywistej jednostki, którą chcesz obsłużyć, współczynnik konwersji do odpowiedniej dla wymiaru jednostki bazowej. Więc jeśli zdecydujesz stopę jako jednostki podstawowej odległości, sklep

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

faktycznie zrobić konwersję, Po sprawdzeniu, że wymiary pasują do siebie, po prostu pomnożyć przez Factor jednostki źródłowej i podzielić przez Factor docelowej jednostki. Na przykład, aby uzyskać z liczników na mile, należy pomnożyć przez 3.28084, a następnie podzielić przez 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) * iloczynu/Mianownik + ToOffset