2

我有4個表外鍵指的多個表

A(ida, name) 
B(ida, B-specific stuff) 
C(ida, C-specific stuff) 
D(ida, D-specific stuff) 

,我想另一個表E可能是指只B或C(不d)。我可以寫什麼

CREATE TABLE E 

+0

什麼是'A'的意義是什麼? 「B」,「C」和「D」是否繼承它? 'E'是否也需要繼承它,並且你描述的關係與繼承完全無關,或者需要從'B'或'C'繼承(或者甚至是相反的方向)? –

回答

2

在我看來,你試圖使用某種形式的超類型/子類型的 - 如與簡單的垂直分區相反。如果是這樣,請引入一個類型鑑別器。因爲這是一個通用的例子(A,B,C,D ..)很難猜出什麼與什麼有關,所以這裏有兩個選項是我最好的猜測。


選項1

enter image description here


選項2

enter image description here

1

你可以使用一個check約束來強制執行D只引用BC

create table D 
    (
    id int constraint PK_D primary key, 
    idb int constraint FK_D_IDB foreign key references B(id), 
    idc int constraint FK_D_IDC foreign key references C(id), 
    constraint CHK_D_B_OR_C check 
     (
     case when idb is null then 0 else 1 end + 
     case when idc is null then 0 else 1 end = 1 
     ) 
    ); 

Live example at SQL Fiddle.

+0

但我想它是指B或C,而不是它們兩個(並且我不認爲每行中的空fk是有效的。 –

+0

在你的方式或獨特的表中是否更好? A(ida,...,where)'?我剛剛做了2個月的「sql/mysql課程」,我們並沒有做太多的事情,所以我一直在想這樣做,然後在網站上我在做我可以檢查哪裏必須是B或C,然後我可以檢查觸發器,如果​​我插入E與E生D –

+0

觸發器是邪惡的,我會遠離它們。鍵通常比「類型」列更好,因爲類型列重複了外鍵中的信息 – Andomar