2012-06-24 101 views
2

當使用幾個互斥排列的子類型建立超類型/子類型關係時,應該如何通過約束強制執行這種相互排斥?數據建模子類型超類型關係時使用什麼約束?

我的第一個猜測是:

SuperType 
    (PK) super_id 
    (PK) type_id 
    Constraint: type_id in (1,2) 

SubType1 
    (FK) super_id 
    (FK) type_id 
    Constraint: type_id = 1 


SubType2 
    (FK) super_id 
    (FK) type_id 
    Constraint: type_id = 2 
+1

是的,就是這樣做的。您還可以將'SuperType(type_id)'作爲FK指向'Types'參考表(僅有2行)。 –

+0

另一個類似的問題:[數據庫設計問題](http://stackoverflow.com/questions/4969133/database-design-problem) –

+0

我同意ypercube。你有正確的想法。這是限制條件最多的。正如布蘭科指出的那樣,這並不涉及寡居的超類型,但由於它們可能導致的複雜性,限制(甚至是對等的FK)對於這部分問題並不是一個好的答案。只需使用一些應用程序邏輯來解決喪偶超類型問題。 –

回答

0

你描述還是什麼不強制子行的存在。爲此,您需要消除類型鑑別器並向相反的方向添加FK,這將導致循環FK,這將需要延遲約束來解決 - something like this

我個人認爲這是最好只用最簡單的數據庫模型可能...

SuperType 
    (PK) super_id 

SubType1 
    (PK, FK) super_id 

SubType1 
    (PK, FK) super_id 

...和執行應用程序級別的排他性和孩子的存在。