Daten mit physikalischen Einheiten ablegen

Hallo

Ich habe in meiner Datenbank vor allem Grössen mit physikalischen Einheiten. Also z.B. Fläche: 50 m2, Energieverbrauch: 600000 kWh.

Dabei will ich in meinem Anwenderprogramm sowohl auf die Zahl als auch auf die Einheit zugreifen können. Die Einzelnen Datensätze eines Attributs haben immer die gleiche Einheit. Es soll aber in der Datenbank hinterlegt sein, welche Einheit dies ist.

Dazu habe ich mir ein paar Lösungsmöglichkeiten überlegt.

Variante 1: Die Einheit jeweils in den Attributnamen integrieren. Zb. „Fläche [m2]“
Das Problem wird so auf die Anwendung übertragen, und kann dort eigentlich relativ einfach gelöst werden, indem die Einheit aus dem Attributnamen gefiltert wird. Ist aber unschön, da es nicht in der Datenbank gelöst wird und die Attributnamen kompliziert werden.

Variante 2: Für jede Tabelle eine dazugehörige Tabelle erzeugen, in welcher die Attribute und deren Einheiten aufgelistet sind. Gibt recht viele Tabellen dafür ist das Problem in der Datenbank gelöst.

Es gibt wahrscheinlich noch viele andere Möglichkeiten. Mich würde interessieren was sich so bewährt hat bzw. was ihr mir empfehlen würdet.
Oder gibt es sogar eine Möglichkeit in einer Tabelle zusätzlich zum Attributnamen eine Einheit zu hinterlegen?

Gruss
Martin

Ich würde mir genau eine Tabelle anlegen, in der die Einheiten gespeichert sind. Und zwar die Grundeinheiten.
In der Datentabelle liegt dann bloß der Wert, eine zweite Spalte ist ein Pointer (Foreign Key) auf die Einheitentabelle.
Ggf. musst du NUMERIC für die Werte verwenden, um eine ausreichend hohe Genauigkeit zu erreichen.

Ich habe schon öfters das gleiche Problem gehabt und löse es in der Regel wie ads es beschrieben hat. Als Sahnestückchen kannst du die Einheiten-Tabelle mit sich selbst m:n verknüpfen, dann könntest du noch einen Faktor zur Umrechnung von Einheiten mitführen.
Grüße Uwe

Wenn ich das richtig verstanden habe, dann ergibt das in der Tabelle zwei Spalten pro gespeicherte Grösse. Eine Spalte für den Zahlenwert und eine Spalte für die Einheit (als Foreignkey auf die Einheitentabelle).
Da ich aber pro Spalte nur eine Einheit habe, würde mir das also einfach eine zusätzliche Spalte, in der überall der gleiche Foreign-Key steht, ergeben.
Aber ja, wenn das erfahrungsgemäss am sinnvollsten ist, werde ich es wohl so machen.

Danke für die Antworten!

Man könnte auch einen eigenen Datentyp dafür schaffen. Nur mal so als grobe Idee …

Das gefällt mir schon besser. Ich nehme an du meinst die composite types : PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: Composite Types

CREATE TYPE zahlmitEinheit AS (
wert numeric(10,2),
einheit varchar(10)
);

CREATE TYPE prozentzahl AS (
wert numeric(3,2) ,
einheit varchar(2)
);

Das probiere ich mal aus. Man könnte das wahrscheinlich auch mit dem ersten Vorschlag von einer Einheitentabelle kombinieren, und anstatt die Einheit als Text mittels Foreignkey hinterlegen.

Ja, so in etwa. Und als Bonus noch passende Funktionen dafür …


Andreas