Database 在关系数据库中建模不同的用户类型

Database 在关系数据库中建模不同的用户类型,database,inheritance,modeling,Database,Inheritance,Modeling,首先,我对这个问题的反馈性质感到抱歉。我正在尽可能地推广它,以便其他人也能从中获益,但我真的没有人能给我反馈这个设计,所以我希望你们能帮助我 话虽如此,我不想在数据库中为不同的用户类型建模。不过,我想要共享用户类型的凭据。这个问题基本上是关于继承的,这是RDB做得不太好的事情 然而,我确实想出了这个设计: 。。但我不确定我是否应该对此感到满意。我不喜欢的是它里面的商业合同数量。首先,我不知道哪个用户类型属于给定的凭证,这意味着我可能必须搜索N个表,其中N是我得到的用户类型数。因此,我考虑将用户

首先,我对这个问题的反馈性质感到抱歉。我正在尽可能地推广它,以便其他人也能从中获益,但我真的没有人能给我反馈这个设计,所以我希望你们能帮助我

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

然而,我确实想出了这个设计:

。。但我不确定我是否应该对此感到满意。我不喜欢的是它里面的商业合同数量。首先,我不知道哪个用户类型属于给定的凭证,这意味着我可能必须搜索N个表,其中N是我得到的用户类型数。因此,我考虑将用户的类型与他或她所处的角色联系起来。因此,如果具有凭据a的用户具有UserType1和UserType2角色,我希望在UserType1和UserType2表中有一个代表他或她的拖拽。-我不确定我是否喜欢这些业务逻辑约束

任何关于这个设计的反馈都将非常感谢,就像任何替代设计一样


提前感谢

如果与OO中的抽象类类似,您可以在父级中放置一个鉴别器列。鉴别器对于每个子类型都有不同的值。如果你聪明的话,它是一个fk到一个表,每个子类型有一行

或者,您可以只依赖于authcredentials与usertype1的连接对于任何usertype1都是成功的,但是对于其他子类型,以及对于其他表也是如此。在每个子表的左外部联接上,所有列(尤其是它不是的类型的id)都为null,并且它不是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,并且基于公共的表的两个子类不一定具有相似的CTOR

<>正如在C++中,在派生类之前构造基类时,您必须创建父行,然后才能创建一个需要FK.< /P>的子行。
postgresql明确支持如下表继承。Hibernate ORM支持将表映射到Java子类。

如果它类似于OO中的抽象类,则可以在父类中放置一个鉴别器列。鉴别器对于每个子类型都有不同的值。如果你聪明的话,它是一个fk到一个表,每个子类型有一行

或者,您可以只依赖于authcredentials与usertype1的连接对于任何usertype1都是成功的,但是对于其他子类型,以及对于其他表也是如此。在每个子表的左外部联接上,所有列(尤其是它不是的类型的id)都为null,并且它不是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,并且基于公共的表的两个子类不一定具有相似的CTOR

<>正如在C++中,在派生类之前构造基类时,您必须创建父行,然后才能创建一个需要FK.< /P>的子行。 postgresql明确支持如下表继承。Hibernate ORM支持将表映射到Java子类