2012-06-24 53 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 

...和执行应用程序级别的排他性和孩子的存在。