0
我的数据库有7个表格:其中一个是父代(饲料),另外3个是isA关系的子代(公共饲料,私人饲料,生成的饲料)。在提要表上有一个带有外键的“订阅”表。每个用户都可以订阅任何类型的订阅源。问题是每种Feed的视图都不一样,这意味着我需要为订阅的每种Feed提供不同的链接。在目前的计划下,我需要执行3个查询来从Feed ID获取Feed的类型。有没有更好的解决这个问题?通过Isa关系恢复类型
我的数据库有7个表格:其中一个是父代(饲料),另外3个是isA关系的子代(公共饲料,私人饲料,生成的饲料)。在提要表上有一个带有外键的“订阅”表。每个用户都可以订阅任何类型的订阅源。问题是每种Feed的视图都不一样,这意味着我需要为订阅的每种Feed提供不同的链接。在目前的计划下,我需要执行3个查询来从Feed ID获取Feed的类型。有没有更好的解决这个问题?通过Isa关系恢复类型
您可以使用视图将孩子预先加入父母,并获得一致的结果,而不管哪个孩子类型。例如:
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 ...;
什么额外的信息存储在子表 - 这听起来像你对我真的不需要它们。 Feed是公开还是私人还是生成的?你是否可以通过将feed_type存储在父提要表中来简化事情,并丢弃子表? – 2009-05-19 16:37:41
还有其他的限制,特别是每个饲料,例如私人饲料有一个密码和用户名提交,生成的饲料可以与编辑器等相关联... – 2009-05-19 20:07:52