2017-04-04 6 views
0

Ich habe eine Tabelle, die einige Eigenschaften von Objekten speichert. Jede Eigenschaft hat eine eigene Zeile in der Tabelle und verweist auf die ID des Objekts aus einer anderen Tabelle. Eigenschaften haben derzeit den Typ boolean (0), numerisch (1) oder Freitext (2) und sie speichern einen einzelnen Wert.Verschiedene Datentypen in Spalte

Die Frage ist, wie kann ich feststellen, welche Zeile welcher Art ist? Sollte die Eigenschaftentabelle eine Spalte mit dem Namen type haben und den Wert dann in einer separaten Spalte TEXT speichern oder den Wert möglicherweise als JSON-Objekt speichern? Gibt es dafür eine einzige gute Lösung? Ich glaube, hier geht es um den Erhalt des Datentyps, der schwierig zu handhaben sein könnte, wenn die Daten in einer Spalte TEXT gespeichert werden.

Mein Bauch sagt mir, dass das Speichern des Typs und Wertes in einem JSON-Objekt der Weg wäre, hier zu gehen.

Objekttabelle:

id | name 
-----+----- 
123 | abc 

Idee für Eigenschaftstabelle:

id | object_id | type | data 
----+-----------+------+------- 
    1 | 123  | 1 | 123.12 
    2 | 123  | 0 | f 

Andere Ideen für Eigenschaftstabelle:

id | object_id | type | data 
----+-----------+----------------------- 
    1 | 112  | 1 | {value:123.12} 
    2 | 112  | 0 | {value:false} 
+0

'pg_typeof (column_name)' würde Ihnen den Typ –

+0

Ich möchte verschiedene Arten von Daten in einer einzigen Spalte speichern und ihre Datentypen beibehalten, so dass ich denke, 'pg_typeof()' wird mir hier helfen. Ich habe den Titel bearbeitet, um meine Frage besser zu beschreiben. – Nysten

+0

Dann erwägen Sie die Verwendung von JSON-Datentyp anstelle von Text –

Antwort

1

Jede Spalte einen bestimmten Typ in PostgreSQL haben muss, so Sie können kein Feld haben, das verschiedene Typen enthalten kann.

Die Verwendung von JSON wird nicht viel helfen, wenn Sie die Attribute innerhalb der Datenbank benötigen, da Sie nur text von JSON-Werten erhalten können.

würde ich drei Tabellen dafür verwenden, eine für jeden Typ:

CREATE TABLE bool_property (
    id integer PRIMARY KEY, 
    object_id integer NOT NULL REFERENCES object(id), 
    data boolean NOT NULL 
); 

CREATE TABLE num_property (
    id integer PRIMARY KEY, 
    object_id integer NOT NULL REFERENCES object(id), 
    data numeric NOT NULL 
); 

CREATE TABLE text_property (
    id integer PRIMARY KEY, 
    object_id integer NOT NULL REFERENCES object(id), 
    data text NOT NULL 
); 

Alternativ, wenn Sie eine einzelne Tabelle wollen,

CREATE TABLE property (
    id integer PRIMARY KEY, 
    object_id integer NOT NULL REFERENCES object(id), 
    datatype regtype NOT NULL, 
    bool_data boolean, 
    num_data numeric, 
    text_data text, 
    CHECK (CASE datatype 
      WHEN 'boolean'::regtype 
      THEN bool_data IS NOT NULL 
       AND num_data IS NULL 
       AND text_data IS NULL 
      WHEN 'numeric'::regtype 
      THEN bool_data IS NULL 
       AND num_data IS NOT NULL 
       AND text_data IS NULL 
      WHEN 'text'::regtype 
      THEN bool_data IS NULL 
       AND num_data IS NULL 
       AND text_data IS NOT NULL 
      ELSE FALSE 
      END 
     ) 
); 

verwenden, aber das könnte schwieriger sein, in beitritt.

Verwandte Themen