2009-05-19 19 views
0

Meine Datenbank hat 7 Tabellen: Die eine ist die übergeordnete (Feeds) und die andere 3 sind die untergeordneten (öffentliche Feeds, private Feeds, generierte Feeds) einer isA-Beziehung. Es gibt eine Tabelle "Subskriptionen" mit einem Fremdschlüssel in der Feed-Tabelle. Jeder Benutzer kann einen Feed eines beliebigen Typs abonnieren. Das Problem ist, dass die Ansicht für jeden Feedtyp unterschiedlich ist. Das bedeutet, dass ich für jeden abonnierten Feedtyp unterschiedliche Links generieren muss. Unter dem aktuellen Schema muss ich 3 Abfragen durchführen, um den Typ des Feeds aus der Feed-ID zu erhalten. Gibt es eine bessere Lösung für dieses Problem?Wiederherstellen von Typen über eine Isa-Beziehung

+0

Welche zusätzlichen Informationen in den untergeordneten Tabellen gespeichert wird - es ist wie du mir klingt wirklich brauche sie nicht. Wird ein Feed entweder öffentlich ODER privat ODER generiert? Können Sie die Dinge nicht vereinfachen, indem Sie den feed_type in der übergeordneten Feed-Tabelle speichern und die untergeordneten Tabellen wegwerfen? –

+0

Es gibt andere Einschränkungen für jeden Feed, zum Beispiel private Feeds haben ein Passwort und Benutzernamen abgelegt, generierte Feeds können mit einem Editor usw. verbunden werden ... –

Antwort

0

Sie können eine Ansicht verwenden, um die untergeordneten Elemente den übergeordneten Elementen vorher beizuordnen, und um ein konsistentes Ergebnis unabhängig vom untergeordneten Typ zu erhalten. Zum Beispiel:

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

Oder wenn Ihre Feeds Tabelle nicht über eine feed_type Spalte (oder gleichwertig):

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

Hallo, danke für die Antwort. Allerdings habe ich es nicht bekommen, da es in der Elterntabelle kein feed_type-Feld gibt. –

+0

Siehe aktualisierte Antwort –

Verwandte Themen