2009-05-19 57 views
0

我的数据库有7个表格:其中一个是父代(饲料),另外3个是isA关系的子代(公共饲料,私人饲料,生成的饲料)。在提要表上有一个带有外键的“订阅”表。每个用户都可以订阅任何类型的订阅源。问题是每种Feed的视图都不一样,这意味着我需要为订阅的每种Feed提供不同的链接。在目前的计划下,我需要执行3个查询来从Feed ID获取Feed的类型。有没有更好的解决这个问题?通过Isa关系恢复类型

+0

什么额外的信息存储在子表 - 这听起来像你对我真的不需要它们。 Feed是公开还是私人还是生成的?你是否可以通过将feed_type存储在父提要表中来简化事情,并丢弃子表? – 2009-05-19 16:37:41

+0

还有其他的限制,特别是每个饲料,例如私人饲料有一个密码和用户名提交,生成的饲料可以与编辑器等相关联... – 2009-05-19 20:07:52

回答

0

您可以使用视图将孩子预先加入父母,并获得一致的结果,而不管哪个孩子类型。例如:

create view feed_links as 
select f.feed_name 
,  case f.feed_type 
      when 'public' then pub.x + pub.y 
      when 'private' then pri.z 
      when 'generated' then gen.v + gen.w 
      end as link 
from feeds f 
left outer join public_feeds pub on pub.feed_id = f.feed_id 
left outer join private_feeds pri on pri.feed_id = f.feed_id 
left outer join generated_feeds gen on gen.feed_id = f.feed_id 
where ...; 

或者,如果您的供稿表没有一个FEED_TYPE列(或同等学历):

create view feed_links as 
select f.feed_name 
,  case when pub.feed_id is not null then pub.x + pub.y 
      when pri.feed_id is not null then pri.z 
      when gen.feed_id is not null then gen.v + gen.w 
      end as link 
from feeds f 
left outer join public_feeds pub on pub.feed_id = f.feed_id 
left outer join private_feeds pri on pri.feed_id = f.feed_id 
left outer join generated_feeds gen on gen.feed_id = f.feed_id 
where ...;