2017-04-11 57 views
0

我想捕捉關係數據庫中的子類/超類關係的概念。如果我開始建模子類/超類,同時保持關係完整性

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違反:我添加了一個新的子類每一次,我不得不重寫taball。

我不知道這是否可能(特別是因爲在實際插入過程中必須違反完整性),但是我會很感激任何建議嗎?

+0

數據庫用於組織和表示共享狀態。對象應該將狀態和抽象封裝在其表示中,以關注接口和責任。數據庫用於狀態,OOP用於狀態機。這兩個概念是正交的,如果你將它們混爲一談,你將不會從中獲益。 – reaanb

回答

0

PostgreSQL支持inheritance的表,所以你可以做同樣的事情在數據庫中代碼:

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

當你插入tabbtabc這種方式也將在taba提供一排。取決於情況,如果這是一個很好的方法去或沒有。