使用关系数据库对代数数据类型建模

时间:2015-10-19 11:18:03

标签: sql orm relational-database variant algebraic-data-types

假设您正在OCaml / F#/ SML / Haskell中编写应用程序,并希望将数据保存在关系数据库中。将产品类型(记录和元组)映射到关系很容易,但是如何将变体类型映射到关系?

具体来说,如何在关系数据库中保留类似下面的类型?

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

1 个答案:

答案 0 :(得分:3)

这似乎很乏味,但我会为每个产品创建一个表格。

android:scaleType="fitCenter" 

您可能希望存储一些元数据以及每种类型的记录:

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

如果你更严格,你可以想象存储一个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); 列 类型的名称并使用它来构造复合外键。 (如 在LedgerSMB博客的"Where Not to Use Table Inheritance"下描述。)