2009-05-19 3 views
0

В моей базе данных есть 7 таблиц: один из них - родительский (кормовой), а третий - это дети (общедоступные каналы, частные каналы, созданные каналы) отношения isA. В таблице каналов есть таблица «Подписки» с внешним ключом. Каждый пользователь может подписаться на канал любого типа. Проблема в том, что представление для каждого типа фида отличается, это означает, что мне нужно создавать разные ссылки для каждого подписанного канала. В рамках текущей схемы мне нужно выполнить 3 запроса, чтобы получить тип фида из идентификатора фида. Есть ли лучшее решение этой проблемы?Восстановление типов с помощью отношений с Исой

+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

См. Обновленный ответ –

Смежные вопросы