2015-10-19 19 views
5

OCaml/F#/ SML/Haskellにアプリケーションを作成し、リレーショナルデータベースにデータを保持したいとします。製品タイプ(レコードとタプル)をリレーションにマップするのは簡単ですが、バリアントタイプをリレーションシップにどのようにマップしますか?リレーショナルデータベースを使用した代数データ型のモデリング

具体的には、次のような型をリレーショナルデータベースにどのように保持しますか?

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

保存したい実際のデータの例を教えてください。 – Shnugo

+0

私の最初の考えはXMLでしょう。階層的に構造化されたあらゆる種類のデータを記述的なメタデータ(属性)と一緒に格納できます。しかし、これを解釈するには高い論理が必要です。 – Shnugo

+0

@shnugo私が言及しているように、私はリレーショナルデータベースに興味があります。 – Halst

答えて

2

私は面倒ですが、私は合計で各製品のテーブルを作成します。あなたも厳しいあなたをしている場合

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

そして:

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

はおそらく、各タイプのレコードと一緒にいくつかのメタデータを格納したい:

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

そして、これは外部キー制約を示唆します の型の名前を持つty列を格納し、これを使用して複合外部キーを構築することができます。 (LedgerSMBブログで"Where Not to Use Table Inheritance"として記載されている )

+0

最近私はこれについてもっと考えて、外来のキーターゲットとして機能する中間テーブルを含むスキームを持っています。いくつかのコード例はここにあります:https://github.com/solidsnack/pg-sql-variants – solidsnack

+0

't'への参照をどのように保存しますか? – nafg

+0

エンベロープへの参照を格納します。 – solidsnack

関連する問題