Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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_Postgresql_Relational Database - Fatal编程技术网

Sql 在维护关系完整性的同时对子类/超类进行建模

Sql 在维护关系完整性的同时对子类/超类进行建模,sql,postgresql,relational-database,Sql,Postgresql,Relational Database,我试图捕捉关系数据库中的子类/超类关系的概念。如果我从 abstract class A { id: UUID } class B extends A { data: String } class C extends A { data: Int } 我可以写: create table taba (id uuid not null unique, typ char not null); create table tabb (id uuid not null uniqu

我试图捕捉关系数据库中的子类/超类关系的概念。如果我从

abstract class A {
   id: UUID
}

class B extends A {
    data: String
}

class C extends A {
    data: Int
}
我可以写:

create table taba (id uuid not null unique, typ char not null);
create table tabb (id uuid not null unique references taba(id), 
          data varchar);
create table tabc (id uuid not null unique references taba(id),
          data int);
它的关系完整性在一个方向上由
references
子句保证:每个派生实例B或C必须有其基础实例A

但是另一个方向呢?我想保证每个基本实例A都有其派生实例B或C,理想情况下,它与给定的
typ
匹配

我想在一张桌子上做,像这样:

create table taball (id uuid not null unique, typ char not null,
          b_data varchar,
          c_ data int);
但这似乎违反了规则:每次我添加一个新的子类,我都必须重写taball

我不知道这是否可行(特别是因为在实际插入过程中,完整性必然会受到破坏),但我希望您能提供任何建议?

PostgreSQL支持表,以便您可以在数据库中执行与代码中完全相同的操作:

create table taba (id uuid not null unique);
create table tabb (data varchar) inherits (taba);
create table tabc (data int) inherits (taba);

这样,当您插入到
tabb
tabc
中时,
taba
中也会有一行可用。取决于情况,这是否是一种好方法。

数据库用于组织和表示共享状态。对象应该封装状态并对其表示进行抽象,以关注接口和职责。数据库用于状态,OOP用于状态机。这两个概念是正交的,如果你把它们混为一谈,你将得不到任何好处。