Operação de Projeção

Autor

Douglas Braga

A operação de projeção retorna uma relação com apenas um subconjunto dos atributos da relação original, eliminando colunas indesejadas.

Notação e Sintaxe

\[\Pi_{A_1, A_2, \ldots, A_k}(r)\]

onde \(r\) é uma relação e \(A_1, A_2, \ldots, A_k\) são os atributos que devem ser mantidos no resultado.

Como o resultado é uma relação (um conjunto), linhas duplicadas são automaticamente eliminadas.

Exemplo 1: Projeção Simples

Para obter apenas id_prof e nome de todos os professores — omitindo id_escola e ch_semanal:

\[\Pi_{id\_prof,\ nome}(professor)\]

Relação original professor:

id_prof nome id_escola ch_semanal
21200001 Eduarda Souza 21 20
21400002 Felipe Araujo 21 40
31200001 Gustavo Costa 31 20
31400002 Helena Carvalho 31 40
31200003 Igor Melo 31 20
11400001 Bruno Teixeira 11 40
11400002 Carla Pinto 11 40

Resultado de \(\Pi_{id\_prof,\ nome}(professor)\):

id_prof nome
21200001 Eduarda Souza
21400002 Felipe Araujo
31200001 Gustavo Costa
31400002 Helena Carvalho
31200003 Igor Melo
11400001 Bruno Teixeira
11400002 Carla Pinto

Eliminação de Duplicatas

Se projetarmos apenas id_escola de professor, o resultado terá somente os valores distintos:

\[\Pi_{id\_escola}(professor)\]

id_escola
21
31
11

Mesmo que 31 apareça em três tuplas (Gustavo, Helena e Igor), o resultado contém cada valor apenas uma vez.

Composição de Operações

Como o resultado de qualquer operação é uma relação, operações podem ser compostas — o resultado de uma operação serve como entrada da próxima.

Composição de operações: expressões de álgebra relacional são construídas aninhando operações. O resultado de uma operação interna é passado como argumento para a operação externa.

Para obter os nomes de todos os professores da ESETI, combina-se seleção e projeção:

\[\Pi_{nome}\!\left(\sigma_{id\_escola = 31}(professor)\right)\]

Passo 1 — Seleção \(\sigma_{id\_escola = 31}(professor)\):

id_prof nome id_escola ch_semanal
31200001 Gustavo Costa 31 20
31400002 Helena Carvalho 31 40
31200003 Igor Melo 31 20

Passo 2 — Projeção \(\Pi_{nome}(\cdot)\):

nome
Gustavo Costa
Helena Carvalho
Igor Melo

Para Praticar

1. Idempotência da projeção. A projeção é idempotente quando aplicada sobre o mesmo conjunto de atributos:

\[\Pi_A\!\left(\Pi_{A,B}(r)\right) = \Pi_A(r)\]

Mas o que acontece se tentarmos \(\Pi_{A,B}\!\left(\Pi_A(r)\right)\) quando \(B \notin A\)?

A expressão é inválida: \(\Pi_A(r)\) elimina o atributo \(B\), que passa a não existir na relação resultante. Tentar projetar \(B\) de uma relação que não o possui é um erro de schema. Isso ilustra que a projeção é destrutiva em relação aos atributos não selecionados.


2. Quantas tuplas? Calcule o número de tuplas esperado em cada resultado:

  1. \(\Pi_{id\_escola}(professor)\) — a tabela professor tem 7 tuplas distribuídas em 3 escolas
  2. \(\Pi_{id\_curso}(disciplina)\) — 24 disciplinas distribuídas em 3 cursos
  3. \(\Pi_{id\_prof, id\_escola}(professor)\) — 7 tuplas, combinação de atributos
  1. 3 tuplas — a projeção elimina duplicatas; há exatamente 3 valores distintos de id_escola.
  2. 3 tuplas — idem; 3 cursos distintos.
  3. 7 tuplas — como id_prof é a chave primária, cada combinação (id_prof, id_escola) já é única. A projeção não elimina nenhuma tupla.

Observação: a projeção sobre a chave primária nunca elimina tuplas — o número é preservado.


3. Projeção e junção. Após fazer a junção \(professor \bowtie_{professor.id\_escola = escola.id\_escola} escola\), queremos apenas os nomes dos professores e o nome completo da escola. Escreva a expressão completa.

\[\Pi_{professor.nome,\ escola.nome\_escola}\!\left(professor \bowtie_{professor.id\_escola = escola.id\_escola} escola\right)\]

O resultado tem 7 tuplas (uma por professor), com os atributos nome e nome_escola.