在关系数据库中建模不同的usertypes

时间:2009-04-05 16:20:31

标签: database inheritance modeling

首先,我很抱歉这个问题的反馈性质。我试图尽可能多地概括它,以便其他人也可以从中获益,但我真的没有人给我反馈这个设计,所以我希望你们能帮助我。

说到这里,我不想在我的数据库中建模不同的usertypes。我想要共享usertypes的凭据。这个问题基本上是关于继承,这是RDB不能做得太好的事情。

然而,我确实提出了这个设计: DB design http://img48.imageshack.us/img48/9196/dbdesign.png

..但我不确定我是否应该对此感到满意。我不喜欢它的是商业合同的数量。首先,我不知道哪个usertype属于给定的凭证,这意味着我可能必须搜索N个表,其中N是我得到的usertype的数量。因此,我想到了将用户的类型与他或她所处的角色相关联。因此,如果具有凭据A的用户具有“UserType1”和“UserType2”的角色,我希望在UserType1和UserType2表代表他或她。 - 我不确定我是否喜欢这些“商业逻辑” - 约束.. :)

对于这个给定设计的任何反馈都将非常感激,就像任何替代设计一样。

提前致谢

1 个答案:

答案 0 :(得分:4)

如果它与OO中的抽象类类似,则可以在父级中放置一个鉴别器列。鉴别器对于每种子类型具有不同的值。如果你很聪明,那么对于每个孩子类型只有一行的表来说,这是一个fk。

或者您可以依赖于authcredentials与usertype1的连接对任何usertype1都成功,但对于其他子类型没有成功,对于其他表也是如此。在每个子表的左外连接上,它不是的类型的所有列(但特别是id)都是null,并且它的id不是null。然后,您可以根据以下内容添加计算列:

select 
 a.*, b.*, c.*, 
 case when b.id is not null then 1 else 0 end as is_usertype1, 
 case when c.id is not null then 1 else 0 end as is_usertype2,
from authcredentials a 
 left outer join usertype1 b on (a.id = b.authcredential_id )
 left outer join usertype2 c on (a.id = c.authcredential_id );

然后选择一个视图以方便使用。插入仍将是单独的表usertype和usertype2,但是在OO编程中,ctors也不会被继承,并且两个基于公共的子类不一定具有类似的ctors。

就像在C ++中,在派生类之前构造基类一样,你必须在创建子行之前创建父行(你需要FK)。

postgresql显式支持表继承,就像这样。 Hibernate ORM支持将表映射到Java子类。