Qu'est-ce qu'une bonne structure relationnelle pour les unités et les conversions d'unités complexes?

dba.stackexchange https://dba.stackexchange.com/questions/12590

Question

Mon entreprise est dans l'industrie de l'énergie et je dois trouver une bonne façon de représenter la conversion des unités de mesure. Je l'ai fait quelques recherches et ont encore trouvé un bon article couvrant ce au besoin I de profondeur. La plupart des informations publiées sur les conversions d'unité suppose que l'unité donnée 1 il y a un taux de conversion connu (codé en dur) pour se rendre à l'unité 2 et il est simple de math (this être qui ne toujours pas l'aide) l'exemple le plus complexe que j'ai trouvé . Cependant, ce n'est pas toujours vrai dans le monde réel et est certainement pas vrai pour ce que nous devons gérer. (Désolé pour la longue écriture-up - Je suis en train de fournir autant d'information que possible)

Exemple Tricky 1: Certaines conversions varient avec le temps, telles que la conversion en euros de 5 $ ou vice versa. Cela sonne comme ça n'a rien à voir avec l'énergie, mais il fait vraiment dans le marché des matières premières énergétiques (pensez marché boursier).

Exemple Tricky 2: (En simplifiant) Certains gaz naturel brûle plus chaud que d'autres . En outre, le gaz naturel peut être mesuré / stocké soit sur la base du Energie dans le gaz (par exemple Therms ) ou sur la base du Volume de ledit gaz (comme MCF qui est de 1000 pieds cubes), et il y a d'autres possibilités aussi (par exemple Ton Mass ). Une analogie de l'essence est que 1 gallon d'octane sans plomb 87 fournit moins d'énergie que 1 gallon d'octane sans plomb 93.

Exemple Tricky 3: En plus d'avoir ces unités de mesure, nous avons aussi souvent faire face à des taux tels que $ par Therm ou € par MCF . Nous avons donc besoin d'un moyen de travailler avec ces taux et la façon dont ils se rapportent aux unités de base, donc si nous devons convertir $ par Therm € par MCF , nous pouvons et il utilise les mêmes tarifs publiés que la conversion de Therm MCF .

Exemple Tricky 4: Auparavant, je l'ai utilisé le terme Energie très vaguement et peut-être parfois de manière incorrecte. A ce stade, et à partir de maintenant, qui change. Ainsi, la dernière balle courbe est que nous traitons à la fois Energie et Power . Avec l'électricité, ce moyen KWH contre kW ( une assez bonne explication malgré qu'il soit Yahoo Answers ). Une analogie de données: ce serait comme comparer au total MB de données téléchargées par rapport à votre Mbps bande passante que votre FAI vous fournit. Comme les données, l'énergie prend du temps à livrer. En continuant avec l'analogie des données, nous pourrions avoir à calculer la bande passante effective moyenne consommée sur une période de temps, donc, étant donné que 60 Mo a été téléchargé plus de 1 minute, le taux « effectif » serait 60 * 8/60 = 8Mbps. Le « truc » est ici que si nous stored Mbps comme unité elle-même, nous avons besoin d'une certaine façon de le relier directement à un MB et même si elle implique aussi un temps composant. HEUREUSEMENT, conversion de Energie Power (ou vice-versa) est une chose assez rare pour que nous devons faire, notre solution doit être optimisée pour tous les autres difficiles exemples et permettent à celui-ci nous l'espérons aussi, mais pas le traitement relatif Energie Power est une option.

Exemple Tricky 5: Ceci est essentiellement 3 + 4. Nous pouvons avoir les deux $ par KW et $ par KWh , de sorte que les taux face à la fois puissance Energie .

Exemple simple: Certaines conversions sont très faciles et ce sont ceux que la plupart d'information sur le Web peut gérer. 1000 Wh = 1 kWh et autres. même thING Therms et Decatherms ou kW à MW, etc. Je ne l'aide pas besoin ici, mais gardez à l'esprit que ~ 70% de nos conversions sera de ce type.


Mes réflexions sur la façon de commencer, mais incertain sur la façon de terminer:

  1. Ceci est clairement très salissant donc je propose que nous choisissons une unité de mesure standard pour stocker toutes les données pour chaque produit et « type d'utilisation ». Donc, pour l'électricité, notre unité d'énergie norme serait KWH et notre unité de puissance standard serait kW. Donc, pour convertir à d'autres unités d'énergie / puissance, nous seulement besoin d'un taux de conversion / de notre norme et non toutes les combinaisons possibles. Si jamais nous devons convertir de MW à W, on peut toujours le faire par le biais de la conversion en / de kW.
  2. Étant donné que les taux de conversion peuvent dépendre d'un temps spécifique, nous devons permettre à la capacité de ce temps à stocker par rapport à la mesure. Je soupçonne que nous avons besoin de vous inquiétez pas au sujet de ces taux de conversion changeant plus vite que une fois par heure et nous pourrions même être en mesure de prendre une fois par jour.
  3. Étant donné que les taux de conversion peuvent dépendre de valeurs publiées, nous devons tenir compte de la capacité de cette valeur à stocker par rapport à la mesure. Je soupçonne que nous avons besoin de vous inquiétez pas au sujet de ces taux de conversion changeant plus vite que une fois par heure et nous pourrions même être en mesure de prendre une fois par jour.
  4. Une fois tout cela est compris, je prévois la création d'un service Web qui ne fait rien de plus que de traiter toutes les conversions d'unité. Je ne suis pas à la recherche de SQL pour effectuer ces conversions et je peux faire une mise en cache créative pour faire en sorte que je suis tout à fait marteler pas ces tableaux, mais il devra gérer parfois convertir ~ 400 valeurs par chargement de la page dans le site Web accessible par l'utilisateur . Je ne sais pas si / comment cette question est importante.

Je ne sais pas à quel niveau je stocker les taux de conversion qui ne changent jamais par rapport aux taux de conversion qui ne changent, et exactement comment des étouffoirs d'entre eux d'une manière qui me permettra d'accéder rapidement à ces problèmes de manière qui est facile à travailler.

Toute réflexion sur la façon d'aborder ce ou même certains matériel de lecture PUBLIÉ qui pourrait être en mesure d'aider? J'utilise SQL Server (bientôt SQL Azure) mais cela ne devrait pas vraiment d'importance. Le schéma pour représenter correctement ce que je vais avoir du mal ici. Si elle était aussi simple que pouces par rapport aux centimètres, il est facile. Mais les différents taux de conversion sont le problème ici.

Était-ce utile?

La solution

Il y a quelques choses que vous voulez facteur dans votre conception:

1. Les mesures ont besoin d'un timestamp

Assurez-vous que toutes vos mesures ont une indication:

  • Scalar valeur
  • Unité de mesure
  • Date et heure de la mesure a été prise

Cela vous permettra de travailler avec les mesures que les calculs de conversion en fonction du temps de besoin.

2. Unités de mesure ont des attributs

Chaque unité de mesure a quelques attributs différents. Les plus évidentes sont à titre indicatif, comme un code et peut-être un nom descriptif. Il y a aussi quelques autres attributs essentiels à conserver pour chaque unité de mesure. (I) Type d'unité et (ii) Facteur de conversion à l'unité de base .

La première vous indique si votre unité de mesure est une longueur, un poids, l'énergie, la puissance, la monnaie, etc., etc. Il faut aussi vous dire ce que l'unité de mesure de base est. Vous devez choisir exactement un pour chaque type d'unité. Vous pouvez utiliser des choses comme kWh si vous voulez, mais je bâton aux unités de base de SI (selon le cas) si je vous étais.

La seconde vous indique ce que votre unité de mesure doit être multipliée par obtenir à la base. Je l'ai mentionné que c'est un attribut de votre UOM, mais en fait, il doit être dans une table enfant. La clé d'affaires de la table des enfants qui détient ce facteur de conversion de base est la combinaison de l'unité de mesure, le type d'unité de base et une date / heure. Je garderais à la fois un moyen efficace et une date d'expiration / heure sur la table de facteur de conversion de base. Cela vous permet de trouver rapidement le taux droit applicable à tout moment donné. Si cela arrive à un taux qui ne change pas, c'est OK. Il suffit d'utiliser un min-collationner date d'effet et une date d'expiration max-collationner pour l'un enregistrement.

3. Essayer de table-Drive Everything Will Make You Nuts La dernière pièce du puzzle est de déterminer le calcul pour passer d'un type d'unité à l'autre type d'unité. Vous pouvez essayer de table conduire ce genre de calcul, mais à la fin les difficiles vont faire la conception de manière générale (lire compliqué et lent) qu'il sera impossible. Au lieu de cela, créer un code-table des calculs de conversion et l'utiliser pour lier un type d'unité de type à un autre type de type d'unité. Effectuer les calculs réels dans certains de code quelque part. Quel morceau de code que vous utilisez pour une conversion donnée est ce que la table de code vous indique. Comment le calcul est effectué est juste dans le code. Vous pouvez avoir un calcul chacun pour les différentes choses faciles, comme a besoin d'espace deux longueurs et le volume a besoin de trois longueurs, ainsi que les plus difficiles, comme le travail a besoin d'énergie et de temps.

Lorsque vous obtenez les détails de votre conception cernées vous devriez blog et revenir ici pour poster un lien!

Autres conseils

Ceci est quelque chose que vous pouvez utiliser des vues ou des requêtes pour. Avoir une table avec les données brutes et une autre avec le taux de conversion que vous devez appliquer - peut-être avec une date ou d'une toute autre information si le rapport est temps d'appliquer ou d'une situation sensible. Ensuite, créez une requête ou une vue qui fait la conversion dont vous avez besoin en joignant les tables ensemble. De cette façon, vous pouvez modifier la valeur du rapport de conversion selon les besoins et recalculées.

Exemple simple (PostgreSQL) pour un scénario hypothétique, le vôtre sera différent:

CREATE TABLE join_test.amounts
(
  amount integer,
  unit character varying(10)
);

CREATE TABLE join_test."conversion"
(
  unit character varying(10),
  ratio integer
);

insert into join_test.amounts ( amount,unit) values (10 , 'dollar' );
insert into join_test.amounts ( amount,unit) values (10 , 'euro' );
insert into join_test.amounts ( amount,unit) values (15 , 'dollar' );
insert into join_test.amounts ( amount,unit) values (15 , 'euro' );

insert into join_test.conversion ( unit, ratio) values ('dollar', 2 );
insert into join_test.conversion ( unit, ratio) values ('euro', 3 );

-- create this as a view
select a.amount, c.ratio, a.amount * c.ratio as "result"
from    join_test.amounts a,
    join_test.conversion c
where a.unit = c.unit
and   c.unit = 'euro'
and   a.unit = 'euro'   ;
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top