Aula06-Álgebra Relacional
Transcrição
Aula06-Álgebra Relacional
Álgebra Relacional Os arquivos baseados no modelo relacional são manipulados através de operadores relacionais. Tais operadores são componentes da álgebra relacional. A execução de cada um desses operadores, produz uma relação. A Álgebra relacional compõe-se basicamente de oito operadores distribuídos entre: Fundamentais: • Unários: Seleção, Projeção • Binários: Produto Cartesiano, União e Diferença Derivados: • Binários: Intersecção, Junção e Divisão Especiais: • Renomeação (unário) e Atribuição Operador de Alteração (unário) Podemos considerar como sendo operadores unários, aqueles que operam em uma única relação. Já os operadores binários, operam em pares de relações. Abaixo, uma breve descrição de cada um destes operadores: 1. Seleção Seleciona tuplas que satisfaçam um determinado predicado. É representado pela letra Sigma (σ). σ nome_agencia = “Perryride” (Emprestimo) Agencia Emprestimo Perryde L_15 Perryde L_16 Total 1500 1600 Figura1. Resultado de σ nome_agencia = “Perryride” (Emprestimo) Selecionando todas as tuplas cujos totais são superiores a 1200. σ total > 1200 (Empréstimo) Predicados: = (Igual) ≠ (Diferente) < (Menor que) ≤ (Menor ou igual que) > (Maior que) ≥ (Maior ou igual que) ^ (e) V (Ou) Tuplas que contenham empréstimos acima de 1200, feitos na agência Perriryde. σ nome_agencia = “Perryride” ^ total > 1200 (Emprestimo) Prof. Antonio Almeida de Barros Júnior Pág. 1 2. Projeção A operação Projecti é primária e retorna o argumento da relação, deixando de lado certos atributos. É denotada pela letra Pi (π). π numero_emprestimo, total (Emprestimo) Emprestimo L_17 L_15 L_16 ... Total 1500 1600 1200 ... Figura 2. Número do empréstimo e total do empréstimo. A Operação Relacional de Comparação Consideramos a consulta: “encontre os clientes que moram em “Harrison””. π nome_cliente (σ cidade_cliente = “Harrison” (Cliente)) Desde que o resultado de uma operação em álgebra relacional seja do mesmo tipo que sua entrada (relação), as operações em álgebra relacional podem ser compostas juntas em uma expressão em álgebra relacional. Tais composições são similares às operações aritméticas (como +, -, *, e ÷). 3. Produto A operação Produto Cartesiano, representada por (x), permite-nos combinar informações de duas relações quaisquer. Representamos o produto das relações r1 e r2 pro r1 x r2. Neste contexto, é importante o uso de “alias” nos nomes de tabelas e ou campos. O esquema de relação para r = devedor x empréstimo é: (Devedor.Nome_Cliente, Devedor.Numero_Emprestimo, Emprestimo.Nome_Agencia, Emprestimo.Numero_Emprestimo, Emprestimo.Total) ou (Nome_Cliente, Devedor.NumeroEmprestimo, Nome_Agencia, Emprestimo.Numero_Emprestimo, Total) Devedor. Nome_Cliente NumeroEmprestimo Adams L_16 Adams L_16 Curry L_93 ... ... Nome_Agencia L_11 L_14 L_11 ... Emprestimo. Numero_Emprestimo Round Hill Downtown Round Hill ... Total 900 1500 900 ... Figura 7. Resultado Devedor x Emprestimo. Prof. Antonio Almeida de Barros Júnior Pág. 2 Desta forma, podemos ter n1 tuplas em Devedor e n2 tuplas em Emprestimo. Então existem n1 x n2 modos de escolher um par de tuplas – uma tupla de cada relação, assim há n1 x n2 tuplas em r. Nota-se que podemos ter: t[Devedor.Numero_Emprestimo] ≠ t[Emprestimo.Numero_Emprestimo]. No geral este tipo de relação e a concatenação de r1 com r2. Resultado: Uma relação com tuplas obtidas através da concatenação de cada tupla da relação A com cada tupla da relação B. 4. União Considere uma consulta para encontrar os nomes de todos os clientes do banco que tenham uma conta, um empréstimo ou ambos. Note que a relação cliente não possui esta informação, já que o cliente não precisa ter nem uma conta nem um empréstimo no banco. Para responder esta consulta, precisamos das informações na relação Depositante e na relação Devedor. Nome_Cliente Numero_Conta Hayes A‐102 Johnson A‐101 Johnson A‐201 Jones A‐217 Lindsay A‐222 Smith A‐215 Turner A‐305 Nome_Cliente Numero_Emprestimo Adams L_16 Curry L_93 Hayes L_15 Jackson L_14 Jones L_17 Smith L_11 Smith L_23 Willians L_17 Figura3. Relações Depositante e Devedor π nome_cliente (Devedor) π nome_cliente (Depositante) π nome_cliente (Devedor) ∪ π nome_cliente (Depositante) Prof. Antonio Almeida de Barros Júnior Pág. 3 A relação resultante dessa consulta aparece na figura 4. Nome_Cliente Adams Curry Hayes Jackson Jones Smith Willians Lindsay Johnson Turner Figura 4. Nomes de todos os clientes que têm um empréstimo ou uma conta. OBS: Para realizar a operação de união, é importante que as relações envolvidas contenham a mesma estrutura. Resultado: Uma única relação com a mesma estrutura das relações originais, composta de todas as tuplas da relação A e da relação B. 5. Diferença A operação Diferença entre conjuntos denotada por -, permite-nos encontrar as tuplas que estão em uma relação, mas não em outra. A expressão r-s resulta na relação que contém as tuplas que estão em r, mas não em s. Podemos encontrar todos os clientes do banco que possuem contas mas não adquiriram empréstimos escrevendo: π nome_cliente (Depositante) - π nome_cliente (Devedor) Nome_Cliente Johnson Lindsay Turner Figura 6. Clientes com contas, mas sem empréstimos. Prof. Antonio Almeida de Barros Júnior Pág. 4 Resultado: Uma relação com a mesma estrutura das relações originais, composta de tuplas pertencentes à relação A e não pertencentes à relação B. 6. Interseção A primeira operação adicional em álgebra relacional que podemos definir é a interseção de conjuntos (∩). Suponha que queiramos encontrar todos os clientes que tenham tanto empréstimo quanto conta. π nome_cliente (Devedor) ∩ π nome_cliente (Depositante) Nome_Cliente Hayes Jones Smith Figura 5. Clientes com conta e empréstimo no banco. OBS: Podemos reescrever qualquer expressão em álgebra relacional usando a interseção de conjuntos por meio de aplicação de um par de operações de diferença de conjuntos. Para realizar a operação de intersecção, é importante que as relações envolvidas contenham a mesma estrutura. r ∩ s = r – (r – s) Resultado: Uma única relação com a mesma estrutura das relações originais, composta de tuplas coincidentes da relação A e da relação B. Prof. Antonio Almeida de Barros Júnior Pág. 5 7. Junção Tipicamente, uma consulta em Produto Cartesiano envolve uma seleção de operações sobre o resultado desse Produto Cartesiano. Considere a consulta “Encontrar todos os nomes dos clientes que contenham um empréstimo no banco e encontrar o total emprestado”. π Nome_Cliente, Emprestimo.Numero_Emprestimo, Total (σ Devedor.Numero_Emprestimo = Emprestimo.NumeroEmprestimo (Devedor x Emprestimo)) A Junção é representada pelo símbolo de “Join” >< . Trata-se de uma operação de Produto Cartesiano, onde a Seleção obedece a equivalência dos atributos que aparecem e mambas relações. Vejamos o exemplo anterior: π Nome_Cliente, Numero_Emprestimo, Total (Devedor >< Emprestimo) Consideramos duas relações r(R) e s(S). A junção de R e S denotada por R >< S, é uma relação no esquema R ∪ S formalmente definida como: r >< s = π R ∩ S (σ r.A1=s.A1 ^ r.A2=s.A2 … r.An=s.An r x s) em que R ∩ S = {A1, A2, …, An} Exemplos: Encontrar os nomes de todas as agências com clients que tenham contas no banco e morem em “Muriaé”. π Nome_Agencia (σ Cidade_Cliente = “Muriaé” (Cliente >< Conta >< Depositante)) Encontrar todos os clients que tenham empréstimo e conta no banco. π Nome_Cliente (Devedor >< Depositante) Suponha que queiramos encontrar os nomes de todos os clientes que tenham um empréstimo na agência de “Muriaé”. Podemos precisar, para isso de informações das relações Devedor e Emprestimo. Se escrevermos: σ Nome_Agencia = “Muriaé” (Devedor x Emprestimo) Como operação Produto Cartesiano associa todas as tuplas de Emprestimo a todas as tuplas de Devedor, sabemos que se um Cliente contrair um empréstimo na agência “Muriaé”, então existe algumas tuplas em Devedor x Emprestimo que contém o seu nome. σ Devedor.Numero_Emprestimo = Emprestimo.Numero_Emprestimo (σ Nome_Agencia = “Muriaé” (Devedor x Emprestimo)) Prof. Antonio Almeida de Barros Júnior Pág. 6 A consulta pega apenas as tuplas de Devedor x Emprestimo que pertençam aos que tenham um empréstimo na agência de “Muriaé”. Uma vez que queiramos apenas o nome do cliente, podemos fazer uma projeção: π Nome_Cliente (σ Devedor.Numero_Emprestimo = Emprestimo.Numero_Emprestimo) (σ Nome_Agencia = “Muriaé” (Devedor x Emprestimo)) 8. Divisão Indicada por ÷, é apropriada para consultas que incluem a frase “para todo”. Suponha que desejamos encontrar todos os clientes que têm uma conta em todas as agências localizadas em “Viçosa” pela expressão: r1 = π Nome_Agencia (σ Cidade_Agencia = “Viçosa” (Agencia)) Para encontar todos os pares (Nome_Cliente, Nome_Agencia) para os quais o cliente tem conta. r2 = π Nome_Cliente, Nome_Agencia (Depositante >< Conta) Agora, precisamos encontrar Clientes que aparecem em r2 com cada nome da agencia em r1. Para isso, façamos a divisão: π Nome_Cliente, Nome_Agencia (Depositante >< Conta) ÷ π Nome_Agencia (σ Cidade_Agencia = “Viçosa” (Agencia)) Formalmente, sejam r(R) e s(S) relações, e SR; ou seja, cada atributo do esquema S também está no esquema R. A relação r÷s é uma relação no esquema R – S. Para isso, as seguintes condições devem ser satisfeitas: 1. T está em π R-S (r) 2. Para cada tupla ts em s, existe uma tupla TR em r satisfazendo estas duas condições: a. tr [S] = ts[S] b. tr[R-S] = t Prof. Antonio Almeida de Barros Júnior Pág. 7 9. Renomeação De modo diferente das relações no banco de dados, os resultados das expressões de álgebra relacional não possuem um nome para referenciá-las. É útil poder atribuir-lhes nomes; o operador renomeação, indicado pela letra grega minúscula ro (ρ), nos permite fazer isso. Considerando uma expressão de álgebra relacional E, a expressão: ρx (E) retorna o resultado da expressão E sob o nome x. Para ilustrar a renomeação de uma relação, consideramos a consulta “Encontre o maior saldo no banco”. Nossa estratégia é (1) calcular primeiro uma relação temporária consistindo nos saldos que não sejam o maior e (2) tomar a diferença de conjuntos entre a relação πSaldo (Conta) e a relação temporária recém-calculada, para obter o resultado. Etapa 1: Para calcular a relação temporária, precisamos comparar os valores de todos os saldos de conta. Fazemos essa comparação calculando o produto cartesiano conta X conta e formando uma seleção para comparar o valor de quaisquer dois saldos aparecendo em uma tupla. Primeiro precisamos criar um mecanismo para distinguir entre dois atributos saldo. Usaremos a operação renomeação para renomear uma referência à relação conta; portanto, podemos referenciar a relação duas vezes sem ambigüidade. πConta.Saldo (σ Conta.Saldo < d.Saldo (Conta x ρd (Conta))) Essa expressão fornece os saldos na relação conta para os quais um saldo maior aparece em algum lugar na relação conta (renomeada como d). O resultado contém todos os saldos exceto o maior. A figura abaixo, mostra esta relação. Saldo 500 400 700 750 350 Figura 7. Resultado da subexpressão πConta.Saldo (σ Conta.Saldo < d.Saldo (Conta × ρd (Conta))). A consulta para encontrar o maior saldo no banco pode ser escrita como: πConta.Saldo (Conta) - πConta.Saldo (σ Conta.Saldo < d.Saldo (Conta × ρd (Conta))) Prof. Antonio Almeida de Barros Júnior Pág. 8 A figura 8 mostra o resultado dessa consulta. Saldo 900 Figura 8. Maior saldo do banco. 10. Atribuição Algumas vezes é conveniente escrever uma expressão de álgebra relacional atribuindo partes dela a variáveis de relação temporárias. A operação atribuição, indicada por ←, age como a atribuição em uma linguagem de programação. Para ilustrar essa operação, considere a definição de divisão na seção “A operação divisão”. Poderíamos escrever r ÷ s como temp1 ← πR – S (r) temp2 ← πR – S ((temp1 × s) - πR – S,S (r)) temp2 ← temp1 - temp2 Com a operação atribuição, uma consulta pode ser escrita como um programa seqüencial consistindo em uma série de atribuições seguida de uma expressão cujo valor é exibido como o resultado da consulta. Prof. Antonio Almeida de Barros Júnior Pág. 9 Relações Agencia Nome_Agencia Cidade_Agencia Ativo Conta Número_Conta Nome_Agencia Saldo Emprestimo Numero_Emprestimo Nome_Agencia Valor Devedor Nome_Cliente Numero_Emprestimo Conta Numero_Conta Nome_Agencia Cliente Nome_Cliente Rua_Cliente Cidade_Cliente Depositante Nome_Cliente Numero_Conta Agencia Saldo Nome_Agencia Cidade_Agencia Ativo A‐101 Downtown 500 Brighton Brooklyn 7,100,000.00 A‐102 Perryridge 400 Downtown Brooklyn 9,000,000.00 A‐201 Brighton 900 Mianus Horseneck A‐215 Mianus 700 North Town Rye 3,700,000.00 A‐217 Brighton 750 Perryridge Horseneck 1,700,000.00 A‐222 Redwood 700 Pownal Bennigton 3,000,000.00 A‐305 Round Hill 350 Redwood Palo Alto 2,100,000.00 Round Hill Horseneck 8,000,000.00 Emprestimo Numero_Emprestimo Nome_Agencia 400,000.00 Cliente Quantia Nome_Cliente Rua_Cliente Cidade_Cliente L_11 Round Hill 900 Smith Spring Pittsfield L_11 Downtown 1500 Brooks Senator Brooklyn L_15 Perryridge 1500 Curry North Rye L_16 Perryridge 1300 Glenn Sand Hill Woodside L_17 Downtown 1000 Green Walnut Stamford L_23 Redwood 2000 Hayes Main Harrison L_93 Mianus Johnson Alma Harrison Johnson Main Harrison Lindsay Park Pittsfield Smith North Rye Turner Putnam Stamford Williams Nassau 500 Prof. Antonio Almeida de Barros Júnior Princeton Pág. 10 Depositante Nome_Cliente Devedor Numero_Conta Nome_Cliente Numero_Emprestimo Hayes A‐102 Adams L_16 Johnson A‐101 Curry L_93 Johnson A‐201 Hayes L_15 Jones A‐207 Jackson L_14 Lindsay A‐222 Jones L_17 Smith A‐215 Smith L_11 A‐305 Smith L_23 Williams L_17 Turner Referências a Silberschatz, A. et al. Sistema de Banco de Dados. Tradução da 5 edição. Editora Campus. São Paulo. 2006. Prof. Antonio Almeida de Barros Júnior Pág. 11