Was ist eine gute relationale Struktur für Einheiten und komplexe Einheitenumrechnungen?

8

Mein Unternehmen ist in der Energiebranche tätig und ich muss einen guten Weg finden, um die Umrechnung von Maßeinheiten darzustellen. Ich habe ein bisschen gesucht und noch keinen guten Artikel gefunden, der dies in der Tiefe behandelt, die ich brauche. Die meisten Informationen, die über Einheitenumrechnungen veröffentlicht wurden, gehen davon aus, dass es bei Einheit 1 eine bekannte (fest codierte) Umrechnungsrate gibt, um zu Einheit 2 zu gelangen, und es ist eine einfache Mathematik ( dies ist das komplexeste Beispiel, das ich gefunden habe und das immer noch nicht hilft). Dies gilt jedoch nicht immer in der realen Welt und sicherlich nicht für das, was wir handhaben müssen. (Entschuldigung für das lange Schreiben - ich versuche so viele Informationen wie möglich zu liefern!)

Kniffliges Beispiel 1: Einige Umrechnungen variieren mit der Zeit, z. B. die Umrechnung von 5 US-Dollar in Euro oder umgekehrt. Das hört sich so an, als hätte es nichts mit der Energie zu tun, aber es tut es wirklich auf dem Energierohstoffmarkt (denken Sie an den Aktienmarkt).

Tricky Beispiel 2: (stark vereinfacht) Einige Erdgase verbrennen heißer als andere . Zusätzlich kann Erdgas entweder basierend auf der Energie im Gas (wie z. B. Therms ) oder basierend auf dem Volumen des Gases (wie z. B. MCF, das 1000 Kubikfuß beträgt ) gemessen / gespeichert werden , und es gibt auch andere Möglichkeiten (wie z als Tonne für die Messe ). Eine Analogie von Benzin ist, dass 1 Gallone bleifreies 87-Oktan weniger Energie liefert als 1 Gallone bleifreies 93-Oktan.

Kniffliges Beispiel 3: Zusätzlich zu diesen Maßeinheiten müssen wir uns häufig mit Raten wie $ pro Therm oder € pro MCF befassen . Wir brauchen also eine Möglichkeit, mit diesen Raten zu arbeiten und wie sie sich auf die Basiseinheiten beziehen. Wenn wir also von $ pro Therm auf € pro MCF umrechnen müssen , können wir und es werden dieselben veröffentlichten Raten verwendet wie bei der Umrechnung von Therm auf MCF .

Kniffliges Beispiel 4: Bisher habe ich den Begriff Energie sehr locker und möglicherweise manchmal falsch verwendet. An diesem Punkt und von nun an ändert sich das. So ist die letzte Curveball ist , dass wir mit beiden umgehen Energie sowie Energie . Bei Elektrizität bedeutet dies kWh gegenüber kW ( eine ziemlich gute Erklärung, obwohl es sich um Yahoo Answers handelt ). Eine Datenanalogie: Es wäre, als würde man die gesamten MB der heruntergeladenen Daten mit Ihren Mbit / s vergleichenBandbreite, die Ihnen Ihr ISP zur Verfügung stellt. Wie Daten braucht Energie Zeit, um geliefert zu werden. Wenn wir mit der Datenanalogie fortfahren, müssen wir möglicherweise die durchschnittliche effektive Bandbreite berechnen, die über einen bestimmten Zeitraum verbraucht wird. Wenn also 60 MB über 1 Minute heruntergeladen werden, beträgt die "effektive" Rate 60 * 8/60 = 8 Mbit / s. Der "Trick" hier ist, dass wir, wenn wir Mbit / s als Einheit selbst speichern , eine Möglichkeit benötigen, es auch direkt mit einem MB in Beziehung zu setzen , obwohl es auch eine Zeitkomponente beinhaltet. Glücklicherweise ist die Umstellung von Energie auf Energie (oder umgekehrt) für uns eine ziemlich seltene Sache, daher sollte unsere Lösung für alle anderen kniffligen Beispiele optimiert werden und hoffentlich auch dieses berücksichtigen, aber keine damit zusammenhängenden Energieto Power ist eine Option.

Tricky Beispiel 5: Dies ist im Wesentlichen 3 + 4. Wir können sowohl $ pro KW als auch $ pro KWh haben , also beziehen sich die Raten sowohl auf Leistung als auch auf Energie .

Einfaches Beispiel: Einige Conversions sind sehr einfach und können von den meisten Informationen im Web verarbeitet werden. 1000 Wh = 1 kWh und so. Das Gleiche gilt für Therms und Decatherms oder kW zu MW usw. Ich brauche hier keine Hilfe, denke aber daran, dass ~ 70% unserer Umrechnungen von diesem Typ sein werden.


Meine Gedanken darüber, wie ich anfangen soll, aber ich bin mir nicht sicher, wie ich enden soll:

  1. Dies ist eindeutig SEHR chaotisch, daher schlage ich vor, dass wir eine Standardmaßeinheit auswählen, in der alle Daten für jede Ware und "Verwendungsart" gespeichert werden. Für Strom wäre unsere Standardenergieeinheit kWH und unsere Standardleistung kW. Um auf andere Energie- / Leistungseinheiten umzurechnen, benötigen wir nur eine Umrechnungsrate zu / von unserem Standard und nicht jede mögliche Kombination. Wenn wir jemals von MW auf W umstellen müssen, können wir dies immer durch Umrechnung auf / von kW tun.
  2. Da die Umrechnungskurse von einer bestimmten Zeit abhängig sein können, müssen wir zulassen, dass diese Zeit in Bezug auf die Messung gespeichert werden kann. Ich vermute, wir brauchen uns keine Sorgen zu machen, dass sich diese Conversion-Raten schneller als einmal pro Stunde ändern, und wir können möglicherweise sogar einmal am Tag davon ausgehen.
  3. Da die Umrechnungskurse von veröffentlichten Werten abhängen können, müssen wir berücksichtigen, dass dieser Wert in Bezug auf die Messung gespeichert werden kann. Ich vermute, wir brauchen uns keine Sorgen zu machen, dass sich diese Conversion-Raten schneller als einmal pro Stunde ändern, und wir können möglicherweise sogar einmal am Tag davon ausgehen.
  4. Nachdem dies alles herausgefunden hat, erwarte ich, einen Webdienst zu erstellen, der nichts weiter tut als alle Einheitenumrechnungen zu erledigen. Ich suche NICHT nach SQL, um diese Konvertierungen durchzuführen, und ich kann ein kreatives Caching durchführen, um dies zu erreichen, sodass ich diese Tabellen nicht unbedingt hämmere, aber manchmal muss die Konvertierung von ~ 400 Werten pro Seitenladevorgang auf der vom Benutzer aufgerufenen Website durchgeführt werden . Ich bin mir nicht sicher, ob / wie das wichtig ist.

Ich weiß nicht, auf welcher Ebene ich die Conversion-Raten speichern soll, die sich nie ändern, im Vergleich zu den Conversion-Raten, die sich ändern, und genau, wie ich sie so eingeben kann, dass ich schnell und einfach auf diese zugreifen kann arbeiten mit.

Irgendwelche Gedanken darüber, wie man dieses oder sogar ein veröffentlichtes Lesematerial angehen kann, das helfen könnte? Ich verwende SQL Server (bald SQL Azure), aber das sollte eigentlich keine Rolle spielen. Das Schema, um dies richtig darzustellen, ist das, womit ich hier Probleme habe. Wenn es so einfach wie Zoll gegen Zentimeter wäre, wäre es einfach. Aber die unterschiedlichen Conversion-Raten sind hier das Problem.

Jaxidian
quelle
1
Es könnte sich lohnen, das Buch Joe Celkos Daten, Messungen und Standards in SQL zu lesen .
Tag, wenn
Wenn ich eine Standardeinheit wählen würde (was eine gute Idee zu sein scheint), dann wäre dies Wangemessener als KW. Das Internationale Einheitensystem (SI) enthält weitere Informationen zum metrischen System.
Ypercubeᵀᴹ

Antworten:

5

Es gibt einige Dinge, die Sie in Ihr Design einbeziehen möchten:

1. Messungen benötigen einen Zeitstempel

Stellen Sie sicher, dass alle Ihre Messungen Folgendes anzeigen:

  • Skalarwert
  • Maßeinheit
  • Datum und Uhrzeit der Messung

Auf diese Weise können Sie mit Messungen arbeiten, für die zeitabhängige Umrechnungsberechnungen erforderlich sind.

2. Maßeinheiten haben Attribute

Jede Maßeinheit hat einige unterschiedliche Attribute. Die offensichtlichen sind bezeichnend, wie ein Code und vielleicht ein beschreibender Name. Es gibt auch einige wichtige andere Attribute, die für jede Maßeinheit beibehalten werden müssen. (i) Einheitentyp und (ii) Umrechnungsfaktor zur Basiseinheit .

Die erste sagt Ihnen, ob Ihre Maßeinheit eine Länge, ein Gewicht, Energie, Kraft, Währung usw. usw. ist. Sie sollte Ihnen auch sagen, was die Basismaßeinheit ist. Sie sollten für jeden Einheitentyp genau einen auswählen. Sie können Dinge wie kWh verwenden, wenn Sie möchten, aber ich würde mich an die Basis-SI-Einheiten (falls zutreffend) halten, wenn ich Sie wäre.

Die zweite sagt Ihnen, mit welcher Maßeinheit Sie multipliziert werden müssen, um sie zur Basis zu bringen. Ich habe erwähnt, dass dies ein Attribut Ihrer UOM ist, aber tatsächlich muss es sich in einer untergeordneten Tabelle befinden. Der Geschäftsschlüssel der untergeordneten Tabelle, die diesen Basisumrechnungsfaktor enthält, ist die Kombination aus der UOM, ihrem Basiseinheitentyp und einem Datum / einer Uhrzeit. Ich würde sowohl ein effektives als auch ein Ablaufdatum / eine Ablaufzeit in der Basisumrechnungsfaktortabelle behalten. Auf diese Weise können Sie schnell den richtigen Tarif finden, der zu einem bestimmten Zeitpunkt gilt. Wenn es sich um eine Rate handelt, die sich nicht ändert, ist das in Ordnung. Verwenden Sie einfach ein Datum des Inkrafttretens der minimalen Sortierung und ein Ablaufdatum der maximalen Kollatierung für den einen Datensatz.

3. Wenn Sie versuchen, alles auf den Tisch zu bringen, werden Sie verrückt. Das letzte Puzzleteil besteht darin, die Berechnung für den Wechsel von einer Art von Einheit zu einer anderen Art von Einheit zu bestimmen. Sie könnten versuchen, diese Art der Berechnung auf dem Tisch zu steuern, aber am Ende werden die kniffligen das Design so allgemein (kompliziert und langsam lesen) machen, dass es unpraktisch wird. Erstellen Sie stattdessen eine Codetabelle mit Umrechnungsberechnungen und verknüpfen Sie damit eine Art von Einheitentyp mit einer anderen Art von Einheitentyp. Führen Sie die eigentlichen Berechnungen in einem Code irgendwo durch. Welchen Code Sie für eine bestimmte Konvertierung verwenden, wird in der Codetabelle angegeben. Wie die Berechnung durchgeführt wirdist nur im Code. Sie können jeweils eine Berechnung für die verschiedenen einfachen Dinge durchführen, z. B. Fläche benötigt zwei Längen und Volumen benötigt drei Längen, und die schwierigeren wie Arbeit benötigt Energie und Zeit.

Wenn Sie die Details Ihres Designs herausgefunden haben, sollten Sie es bloggen und hierher zurückkehren, um einen Link zu posten!

Joel Brown
quelle
In Bezug auf Punkt 3 stimme ich voll und ganz zu. Aus diesem Grund plane ich, den Webdienst zu verwenden, um diese Konvertierungen tatsächlich durchzuführen. Oder zumindest das, was ich für "komplexe" oder "dynamische" Konvertierungen halte - die "einfachen" oder "Standard" -Konvertierungen, die ich möglicherweise am Tisch fahren kann (wie kW in MW), aber ich kann es immer noch nicht (ich werde in Azure sein, damit ich kann EINFACH Lastausgleich / Skalierung dieses Webdienstes, falls erforderlich). Lassen Sie mich Ihre Idee untersuchen, die verschiedenen Conversion-Raten aus der UOM-Tabelle zu binden. Ich fürchte, ich vermisse ein Unentschieden, um zu verfolgen, zu welcher dieser Conversion-Raten eine bestimmte Messung gehört, aber lassen Sie mich sehen ...
Jaxidian
@Jaxidian - Ich denke, die Bindung, um zu verfolgen, welche Umrechnungsberechnung verwendet werden soll, ist ein Schnittpunkt zwischen zwei Einheitentypen. Technisch gesehen können es zwei Schnittpunkte sein, einer für jede Richtung der Umwandlung, da inverse Funktionen für die komplizierteren Berechnungen möglicherweise nicht trivial sind. Welche Umrechnungskurse zu einer bestimmten Messung gehören, sollte ein Schnittpunkt zwischen einem Einheitentyp und einer Maßeinheit sein. (Siehe 2 (i) und 2 (ii) in meiner Antwort.) Ihre Berechnungen sollten mit Einheiten in der Basis-UOM funktionieren, damit Eingaben mit einer anderen UOM auf dem Weg zur Verwendung der Schnittraten "standardisiert" werden können.
Joel Brown
1

Hierfür können Sie Ansichten oder Abfragen verwenden. Haben Sie eine Tabelle mit den Rohdaten und eine andere mit dem Conversion-Verhältnis, das Sie anwenden müssen - möglicherweise mit einem Datum oder anderen Informationen, wenn das anzuwendende Verhältnis zeit- oder situationsabhängig ist. Erstellen Sie dann eine Abfrage oder Ansicht, die die erforderliche Konvertierung durchführt, indem Sie die Tabellen zusammenfügen. Auf diese Weise können Sie den Wert für das Conversion-Verhältnis nach Bedarf ändern und neu berechnen.

Ein einfaches Beispiel (PostgreSQL) für ein hypothetisches Szenario, Ihr Beispiel wird anders sein:

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'   ;
Adam f
quelle
Ich glaube nicht, dass dies für einige meiner Variablen verantwortlich ist, und dies behandelt nur die einfachen Szenarien. Sie berücksichtigen nicht die Tatsache, dass sich das Verhältnis für die Konvertierung fast jede Sekunde (oder in meinem Fall jeden Tag) ändert und ich sicherstellen muss, dass ich die Konvertierung mit dem entsprechenden Verhältnis durchführe. Es ist nicht immer nur das "aktuelle" Verhältnis, das ich brauche, sondern möglicherweise alle auf Conversion-Basis.
Jaxidian