假设你正在使用OCaml/F#/SML/Haskell编写应用程序,并想要将数据持久化到关系数据库中。将产品类型(记录和元组)映射到关系很容易,但如何将变量类型映射到关系呢?
具体来说,如果有以下类型,你该如何在关系数据库中进行持久化?
(* OCaml *)
type t =
| Foo
| Bar of string
| Baz of int * int * int
假设你正在使用OCaml/F#/SML/Haskell编写应用程序,并想要将数据持久化到关系数据库中。将产品类型(记录和元组)映射到关系很容易,但如何将变量类型映射到关系呢?
具体来说,如果有以下类型,你该如何在关系数据库中进行持久化?
(* OCaml *)
type t =
| Foo
| Bar of string
| Baz of int * int * int
看起来很繁琐,但我会为每个产品创建一个总计表。
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);
如果您更加严格,可以考虑存储一个名为ty
的列,并使用它来构建一个复合外键。(如LedgerSMB博客中所述的“不要使用表继承的地方”。)
t
的引用? - nafg