【发布时间】:2017-04-11 19:35:09
【问题描述】:
我试图在关系数据库中捕捉子类/超类关系的概念。如果我从
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);
但这似乎违反了open/closed principle:每次添加新的A子类时,我都必须重写taball。
我根本不知道这是否可能(特别是因为在实际插入过程中必然会违反完整性),但我希望有任何建议吗?
【问题讨论】:
-
数据库用于组织和表示共享状态。对象应该封装状态并对其表示进行抽象,以专注于接口和职责。数据库用于状态,OOP 用于状态机。这两个概念是正交的,如果你把它们混为一谈,你都不会得到任何好处。
标签: sql postgresql relational-database