2

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

话虽如此,我不想在我的数据库中对不同的用户类型进行建模。我想要共享用户类型的凭据。这个问题基本上是关于继承的,这是 RDB 做得不太好的事情。

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

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

非常感谢您对此给定设计的任何反馈,就像任何替代设计一样。

提前致谢

4

1 回答 1

4

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

或者,您可以仅仅依赖于任何 usertype1 的 authcredentials 到 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 编程中,ctor 也不会被继承,并且基于 common 的两个子类不一定具有相似的 ctor。

就像在 C++ 中,基类在派生类之前构造,您必须先创建父行,然后才能创建子行(您需要 FK)。

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

于 2009-04-05T16:59:35.943 回答