2009-05-19 18 views
0

私のデータベースには、親(フィード)とisA関係の子(パブリック・フィード、プライベート・フィード、生成フィード)の7つの表があります。フィードテーブルには外部キーを持つテーブル「サブスクリプション」があります。各ユーザーは任意の種類のフィードを購読できます。問題は、フィードの種類ごとに表示が異なることです。つまり、購読されているフィードの種類ごとに異なるリンクを生成する必要があります。現在のスキームでは、3つのクエリを実行してフィードIDからフィードのタイプを取得する必要があります。この問題の解決策はありますか?Isa関係で型を回復する

+0

- それは本当にあなたのように私に聞こえますそれらを必要としません。フィードは公開されているかプライベートORであるかfeed_typeを親フィードテーブルに格納して子テーブルを破棄することで、単純化することはできませんか? –

+0

各フィードに固有の制約があります。たとえば、プライベートフィードにはパスワードとユーザー名があり、生成されたフィードはエディタなどに関連付けられます。 –

答えて

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 ...; 
+0

こんにちは、ありがとうございます。しかし、親テーブルにはfeed_typeフィールドがないので、私はそれを持っていません。 –

+0

更新された回答を表示 –

関連する問題