2015-10-19 9 views
5

Angenommen, Sie schreiben eine App in OCaml/F #/SML/Haskell und möchten Daten in einer relationalen Datenbank persistieren. Es ist einfach, Produkttypen (Datensätze und Tupel) Beziehungen zuzuordnen, aber wie ordnen Sie Variantentypen Relationen zu?Modellierung algebraischer Datentypen mit relationaler Datenbank

Um konkret zu sein, wie würden Sie einen Typ wie den folgenden in einer relationalen Datenbank beibehalten?

+0

Könnten Sie bitte ein Beispiel für echte Daten geben, die Sie speichern möchten? – Shnugo

+0

Meine erste Idee wäre XML. Sie können beliebige hierarchisch strukturierte Daten zusammen mit beschreibenden Metadaten (Attributen) hinterlegen. Aber du wirst eine hohe Logik brauchen, um das zu interpretieren ... – Shnugo

+0

@shnugo Wie ich schon erwähnt habe, bin ich an relationalen Datenbanken interessiert. – Halst

Antwort

2

Es scheint langweilig, aber ich würde eine Tabelle für jedes Produkt in der Summe erstellen.

CREATE TABLE foo (id uuid PRIMARY KEY); 

CREATE TABLE bar (id uuid PRIMARY KEY, 
        s text NOT NULL); 

CREATE TABLE baz (id uuid PRIMARY KEY, 
        a integer NOT NULL, 
        b integer NOT NULL, 
        c integer NOT NULL); 

Sie wollen wahrscheinlich einige Metadaten speichern, zusammen mit Aufzeichnungen jeder Art:

CREATE TABLE envelope (id uuid PRIMARY KEY, 
         t timestamptz NOT NULL DEFAULT now(), 
         by text NOT NULL DEFAULT sessions_user); 

Und dies deutet auf eine Fremdschlüssel:

CREATE TABLE foo (id uuid PRIMARY KEY REFERENCES envelope); 

CREATE TABLE bar (id uuid PRIMARY KEY REFERENCES envelope, 
        s text NOT NULL); 

CREATE TABLE baz (id uuid PRIMARY KEY REFERENCES envelope, 
        a integer NOT NULL, 
        b integer NOT NULL, 
        c integer NOT NULL); 

Und wenn Sie sogar Sie strengere könnte vorstellen, eine ty Spalte mit den Namen des Typs zu speichern und damit einen zusammengesetzten Fremdschlüssel zu erstellen. (Wie beschrieben unter "Where Not to Use Table Inheritance" in der LedgerSMB Blog.)

+0

Ich habe in letzter Zeit mehr darüber nachgedacht und habe ein Schema mit einer Zwischentabelle, die als fremdes Schlüsselziel dient. Ein Beispielcode finden Sie hier: https://github.com/solidsnack/pg-sql-variants – solidsnack

+0

Wie würde ich einen Verweis auf ein "t" speichern? – nafg

+0

Speichern Sie einen Verweis auf den Umschlag. – solidsnack