2015-10-19 34 views
5

Si supponga di scrivere un'app in OCaml/F #/SML/Haskell e di voler conservare i dati in un database relazionale. È facile mappare i tipi di prodotto (record e tuple) alle relazioni, ma come associare i tipi di varianti alle relazioni?Modellazione dei tipi di dati algebrici tramite database relazionale

Per essere concreti, come si manterrebbe un tipo come il seguente, in un database relazionale?

+0

Potrebbe per favore fornire un esempio di dati reali che si potrebbero desiderare di memorizzare? – Shnugo

+0

La mia prima idea sarebbe XML. È possibile memorizzare qualsiasi tipo di dati gerarchicamente strutturati insieme a metadati descrittivi (attributi). Ma avrai bisogno di alta logica per interpretare questo ... – Shnugo

+0

@shnugo Come menzionato sono interessato ai database relazionali. – Halst

risposta

2

Sembra noioso ma vorrei creare un tavolo per ogni prodotto nella somma.

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); 

probabilmente si desidera memorizzare alcuni metadati insieme con i record di ogni tipo:

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

E questo suggerisce un vincolo di chiave esterna:

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); 

E se siete ancora più severi si potrebbe immaginare di memorizzare una colonna ty con il nome del tipo e utilizzarlo per costruire una chiave esterna composita. (Come descritto sotto "Where Not to Use Table Inheritance" nel blog LedgerSMB.)

+0

Ultimamente ho pensato di più a questo e ho uno schema che coinvolge un tavolo intermedio per servire come obiettivo chiave estera. Qualche esempio di codice può essere trovato qui: https://github.com/solidsnack/pg-sql-variants – solidsnack

+0

Come potrei memorizzare un riferimento a un 't'? – nafg

+0

Conservare un riferimento alla busta. – solidsnack