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用于状态机。这两个概念是正交的,如果你把它们混为一谈,你将得不到任何好处。