Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用关系数据库建模代数数据类型_Sql_Orm_Relational Database_Variant_Algebraic Data Types - Fatal编程技术网

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

Sql 使用关系数据库建模代数数据类型,sql,orm,relational-database,variant,algebraic-data-types,Sql,Orm,Relational Database,Variant,Algebraic Data Types,假设您正在用OCaml/F#/SML/Haskell编写一个应用程序,并希望将数据持久化到关系数据库中。将产品类型(记录和元组)映射到关系很容易,但是如何将变量类型映射到关系 具体来说,您将如何在关系数据库中持久化以下类型 (* OCaml *) type t = | Foo | Bar of string | Baz of int * int * int 这看起来很乏味,但我会为总和中的每个产品创建一个表 CREATE TABLE foo (id uuid PRIMARY KE

假设您正在用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);
如果你更严格,你可以想象用 类型的名称,并使用它构造复合外键。(作为
在LedgerSMB博客中介绍。)

您能给出一个您可能想要存储的真实数据的示例吗?我的第一个想法是XML。您可以将任何类型的分层结构数据与描述性元数据(属性)一起存储。但是你需要高逻辑来解释这个…@shnugo,正如我提到的,我对关系数据库感兴趣。嗨,你没有提到,你想使用哪种RDBMS。我正在使用SQL Server。在关系数据库模式中使用XML有着令人难以置信的可能性。只需将一个XML列定义为表的一部分,并将所需的任何数据放在表中即可。这样,您可以将RDBMS的优点与XML的灵活性结合起来。这只是一个想法……我最近对此有了更多的思考,并且有一个方案涉及一个中间表作为外键目标。这里可以找到一些示例代码:如何存储对
t
的引用?存储对信封的引用。是否编辑了任何内容?我不明白我自己的问题;)