11
votes

Comment modélisez-vous une table pour la conversion d'unité?

Je cherche à créer un modèle de DB de différentes unités et leur relation les unes aux autres. Par exemple, 36 pouces = 3 pieds = 1 mètre = 0,9144 mètres, etc. Cette table stockerait également des tasses en onces, livres, kg, grammes, cm et toutes sortes de mesures.

Comment faites-vous cela? Je pensais à quelque chose comme ceci: xxx

mais franchement, cela semble être une idée terrible. En essayant de déterminer combien de pieds dans une cour serait très compliqué et je ne pense pas que je puisse jamais stocker toutes les conversions dont j'ai besoin.

Quelles autres idées y a-t-il? Je sais que c'est un problème résolu. Merci!


3 commentaires

Pourquoi avez-vous besoin de stocker des unités de conversion dans une base de données? Ils ne vont pas changer.


Ahh, quelle simplicité serait-elle si vous avez suivi le système métrique. Mais c'est une autre discussion.


Parce que je veux stocker des aliments et leurs informations nutritionnelles. Je veux entrer dans une recette en grammes et le changer en onces chaque fois que j'en ai envie.


4 Réponses :


9
votes

Store conversions vers unités SI , non à d'autres unités non métriques. Ensuite, vous pouvez convertir entre les unités sans avoir besoin de connaître la conversion explicite.

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


4 commentaires

-1 Pour les unités SI - Cette solution n'est probablement susceptible d'être utile dans des situations où les unités SI sont la norme, sinon il est susceptible d'introduire des erreurs d'arrondies (si elle convertit entre les pieds et les cours, par exemple). Contre-équilibré par +1 pour la classe y compris.


@Mark - Unités SI sont la norme (pour 6 milliards d'entre nous, de toute façon :) En outre, vous pouvez également obtenir des erreurs d'arrondi avec des unités impériales, par exemple: 1 pied = 0.000189393939394 miles .


Dans quel Portland es-tu? :) Je suggérerais normalement de choisir la plus petite unité de conversion possible comme unité de base.


Existe-t-il un moyen d'étendre cette approche pour inclure des conversions telles que la température (F-C et inversement), qui ne sont pas liées par un seul multiplicateur? (Voir Question de suivi ici .)



2
votes

Je pense que le schéma proposé de la poste d'origine est bien, à l'exception de la classe non comprise (comme dans la réponse de Seth) - vous ne voulez pas essayer de convertir entre les pintes et les pouces.

Conversion entre deux unités où aucun d'entre eux n'est que l'unité de conversion n'est simplement obtenue en récupérant les enregistrements de conversion des deux unités et en divisant un facteur par l'autre (par exemple, 36/12 = 3 pieds dans une cour).

Si vous êtes particulièrement préoccupé par la précision, vous pouvez vous assurer que toutes les unités d'une classe donnée ont des entrées pour toutes les autres unités de la même classe - cela me frappe comme surkill, cependant.


0 commentaires

4
votes

Choisissez une unité de base pour chaque dimension Vous êtes intéressé (lisez cette page wiki, elle "ll sera utile). Par exemple, si la plupart de vos données sont dans des unités SI, vous choisiriez de la masse de masse, de la deuxième fois, du mètre pour la distance, etc. Si la plupart de vos données sont dans des unités américaines, choisissez des unités de Unités US Customary , par exemple la livre Pour la masse, le pied pendant la longueur, le second pour le temps.

puis stocker, pour chaque unité réelle que vous souhaitez pouvoir manipuler, le facteur de conversion sur l'unité de base appropriée de dimensions. Donc, si vous choisissez le pied comme une unité de base de distance, stockez xxx

pour effectuer une conversion, une fois que vous avez vérifié que les dimensions correspondent, multipliez simplement par le Facteur de l'unité source et diviser par le facteur de l'unité de destination. Par exemple, pour obtenir des compteurs sur des milles, multipliez par 3.28084, puis divisez par 5280.


0 commentaires

3
votes
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

0 commentaires