2015-10-19 46 views
5

OCaml/F #/SML/Haskell uygulamasında bir uygulama yazdığınızı ve ilişkisel bir veritabanındaki verileri sürdürmek istediğinizi varsayalım. Ürün türlerini (kayıtlar ve kopyalar) ilişkilere göre haritalamak kolaydır, ancak varyant türlerini ilişkilere nasıl haritalandırırsınız?İlişkisel veri tabanını kullanarak cebirsel veri türlerini modelleme

Somut olmak gerekirse, ilişkisel bir veritabanında aşağıdaki gibi bir türü nasıl sürdürürsünüz?

(* OCaml *) 
type t = 
    | Foo 
    | Bar of string 
    | Baz of int * int * int 
+0

Saklamak isteyebileceğiniz gerçek verilerden örnek verebilir misiniz? – Shnugo

+0

İlk fikrim XML olurdu. Her türlü hiyerarşik olarak yapılandırılmış verileri açıklayıcı meta verilerle (öznitelikler) birlikte saklayabilirsiniz. Ama bunu yorumlamak için yüksek mantığa ihtiyacın olacak ... – Shnugo

+0

@shnugo Bahsettiğim gibi ilişkisel veritabanları ile ilgileniyorum. – Halst

cevap

2

Sıkıcı görünüyor ama her bir ürün için toplamda bir tablo oluştururdum. Hatta daha sıkı sen eğer

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

Ve:

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

Muhtemelen her tür kayıtlarla birlikte bazı meta verileri depolamak istiyorum:

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

Ve bu yabancı anahtar kısıtlamasını da anlaşılacağı ty sütununu ile depolamanın türünün adını ve kompozit bir yabancı anahtar oluşturmak için kullandığını hayal edebilir. (LederSMB blogunda "Where Not to Use Table Inheritance" altında açıklandığı gibi olarak.)

+0

Son zamanlarda bu konuda daha fazla düşündüm ve bir yabancı anahtar hedef olarak hizmet etmek için bir ara tablo içeren bir şema var. Bazı örnek kodlar şu adreste bulunabilir: https://github.com/solidsnack/pg-sql-variants – solidsnack

+0

Bir referansı nasıl 't' saklardım? – nafg

+0

Zarfa bir başvuru depolayın. – solidsnack