Álgebra relacional
[editar] Introdução
A Álgebra Relacional é uma linguagem de consulta formal, porém procedimental, ou seja, o usuário dá as instruções ao sistema para que o mesmo realize uma seqüência de operações na base de dados para calcular o resultado desejado.
Na terminologia formal de modelo relacional:
- Uma linha é chamada de tupla
- O cabeçalho da coluna é chamado de atributo
- Tabela é chamada de relação
- O tipo de dados que descreve os tipos de valores que podem aparecer em cada coluna é chamado de domínio
A álgebra relacional é uma forma de cálculo sobre conjuntos ou relações.
Há seis operações fundamentais na álgebra relacional. Estas operações são: seleção, projeção, renomear, produto cartesiano, união e diferença entre conjuntos. Todas essas operações produzem uma nova relação como seu resultado.
Em adição às operações fundamentais há outras de uso comum que são frequentemente utilizadas: interseção de conjuntos, junção natural, divisão e junção theta.
Uma aplicação prática da álgebra relacional é na execução de consultas a bancos de dados relacionais. Por essa razão, foram criadas novas operações, denominadas estendidas, que são: Eliminação de duplicatas, ordenação, agrupamento e agregação e junção externa.
As álgebras relacionais recebiam pouca atenção até a publicação do modelo relacional de dados de E.F Codd, em 1970. Codd propôs tal álgebra como uma base para linguagens de consulta em banco de dados.
A álgebra relacional tem poder de expressão essencialmente equivalente ao do cálculo relacional (também ao da Lógica de primeira ordem); esse resultado é conhecido como teorema de Codd. Algum cuidado, porém, deve ser tomado para evitar divergência que pode surgir entre as duas linguagens, já que a negação, aplicada a fórmula do cálculo, constrói uma fórmula que pode ser verdadeira em um grupo infinito de tuplas possíveis, enquanto o operador de diferença da álgebra relacional retorna um resultado finito. Para sobrepor essas dificuldades, Codd restringiu os operados da álgebra relacional somente para relações finitas, e também propôs uso restrito da negação (NOT) e disjunção (OR). Analogamente restrições são encontradas em muitas outras linguagens de computação baseadas em lógica. Codd definiu o termo completeza relacional para referir uma linguagem que é completa no que diz respeito a calculo de predicados de primeira ordem à parte das restrições por ele propostas. Na prática as restrições não tem efeito adverso na aplicabilidade da álgebra relacional para propósitos de banco de dados.
[editar] Operadores Primitivos
Como em qualquer álgebra, alguns operadores são primitivos e os outros, que são descritos em termos dos primitivos, são definidos como derivados. É útil que a escolha dos operadores paralelos primitivos faça uso dos operadores lógicos primitivos. Embora seja sabido que na lógica do E, OU e NÃO a escolha é um pouco arbitrária, Codd usou de escolha semelhantes para a sua álgebra.
Os seis operadores primitivos de Codd na álgebra são o de seleção, projeção, produto cartesiano(também chamado de produto cruz ou junção cruz), união, diferença e renomeação. (Na verdade, Codd omite o renomear, para proceder, mas a sua inclusão foi mostrada pelos inventores da ISBL.) Estes seis operadores são fundamentais no sentido de que nenhum deles pode ser omitido sem perder poder expressivo. Muitos outros operadores foram definidos em termos destes seis. Entre os mais importantes são interseção, divisão e o natural join. Na verdade a ISBL fez a substituição do produto cartesiano pelo natural join, dado que o produto cartesiano é um caso degenerado.
Ao todo, os operadores da álgebra relacional têm poder expressivo idêntico ao do calculo de domínio relacional ou calculo de tuplas relacionais. No entanto, pelas razões apontadas na introdução acima, a álgebra relacional tem estritamente menos poder expressivo do que a lógica de primeira ordem sem função símbolos. Álgebra relacional efectivamente corresponde a um subconjunto da lógica de primeira ordem que é a cláusula de horn sem recursão e negação.
[editar] Operações de Conjuntos
[editar] Projeção (
)
A projeção é uma operação unária escrita como
onde
é um conjunto de atributos. O resultado de tal projeção é definida como conjunto que é obtido quando todas as enuplas em
são restritas ao conjunto
.
[editar] Seleção (
)
Uma seleção generalizada é uma operação unária escrita como
onde
é uma fórmula proposicional que consiste de atoms como é permitido na seleção normal e operadores lógicos
(e),
(ou) e
(negação). Esta seleção seleciona todas as tuplas em
para cada
.
[editar] Seleção e cruzamento de produto
Cruzamento de produto é o de maior custo de operação para avaliar. Se a entrada de relação tem
e
linhas, o resultado irá conter
linhas. Portanto isso é muito importante para ter um menor tamanho de ambos os operadores antes de ser aplicado o operador de cruzamento de produto.
Isso pode ser feito de forma eficaz, se o cruzamento de produto for seguido de um operador de seleção, ex.
(
×
). Considerando a definição de seleção, isto é o caso mais provável. Se o cruzamento de produto não for seguido de um operador de seleção, podemos tentar descer até um nível mais baixo a partir de níveis mais altos da árvore de expressões usando outra regra de seleção.
No caso acima quebramos a condição
introduzindo a condição
,
e
usando regras de divisão sobre complexas condições de seleção, de modo que
=
e
somente contém atributos de
,
contém atributos somente de
e
contém partes de
que contém os atributos tanto de
como de
. Observe que
,
ou
podem ser possívelmente vazios. Depois os seguintes detém:
[editar] Renomear (
)
Renomear é uma operação unária escrita como
onde o resultado é idêntico ao
exceto que o campo
em todas as tuplas é renomeado para um campo
. Isto é simplesmente usado para mudar o nome do atributo de uma relação ou a relação em si.
[editar] Junções e operações com as junções
[editar] Junção natural (
)
Junção natural é uma operação binária que é escrita como (R
S) onde R e S são relações.[1] O resultado da junção natural é uma tabela com todas as combinações das tuplas em R e S que seu atributos em comum são iguais. Por exemplo, considerando as tabelas Empregado e Departamento e sua junção natural:
|
|
|
Isso também pode ser usado para definir as composição das relações. Na teoria das categorias, a junção é, precisamente, o produto fibrado.
A junção natural é, indiscutivelmente, uma das mais importante operações visto que ela é a contraparte relacional do E lógico. Observe com atenção que se as mesmas variáveis forem utilizadas nos dois predicados que são conectados pelo E, então essa variável representa a mesma coisa e ambas as aparências sempre devem ser substituídas pelo mesmo valor. Particularmente, junção natural permite a combinação de relações que são associados por uma chave estrangeira. No exemplo a seguir, provavelmente existe uma chave estrangeira em Empregado.DeptNome para Departamento.DeptNome e então a junção natural de Empregado e Departamento combina todos os empregados com seus departamentos. Note que isso funciona, porque a chave estrangeira detém os atributos de mesmo nome. Se esse não for o caso, como em uma chave estrangeira de Departamento.Gerente para Empregado.número-emp, deve-se, então, renomear essas colunas antes de fazer a junção natural. Essa é, as vezes, uma equijoin (veja θ-join).
Mais formalmente, a semântica da junção natural é definida como segue:
onde
é um predicado que é verdadeiro para uma relação binária
Se e somente se
é uma relação funcional binária. Normalmente, é necessário que
e
tenham, pelo menos, um atributo em comum, mas se essa restrição é omitida, então a junção natural torna-se, exatamente, o produto cartesiano.
A junção natural pode ser simulada com Codd's primitives, como segue. Supoem-se que b1,…,bm são nomes de atributos comuns em R, S, a1,…,an são os atributos de nome único de R e c1,…,ck são os atributos de nome único de S. Além disso, assume-se que os nomes dos atributos d1,…,dm não são nem de R ou de S. Primeiramente, nós podemos mudar, agora, o nome do atributo em comum em S:
Então toma-se o produto cartesiano e faz-se a seleção as tuplas que devem ser ligadas:
Finalmente, pegue a projeção para se livrar dos atributos renomeados:
[editar] Anti-junção
A antijunção, escrito como R
S onde R e S são relações, é similar à junção natural, mas o resultado de uma antijunção é apenas aquelas tuplas em R para as quais NÃO existe uma tupla em S que possua os mesmos nomes de atributos.
Por exemplo, considerando as tabelas Empregado e Departamento e sua antijunção:
|
|
|
A antijunção é formalmente definida como segue:
- R
S = { t : t
R
s
S : fun (t
s) }
ou
- R
S = { t : t
R, não existe uma tupla s de S que satisfaz fun (t
s) }
onde fun(r) está definida como na junção natural.
A antijunção também pode ser definida como o complemento da semi-junção, como segue:
- R
S = R - R
S
Sendo assim, a antijunção às vezes é chamada de anti-semi-junção, e o operador de antijunção às vezes é escrito como um símbolo da semi-junção com uma barra acima, ao invés de
.
[editar] Outer Joins
Considerando que o resultado de um join (ou inner join) consiste em combinar tuplas correspondentes nos dois operandos, um outer join contém essas tuplas e mais algumas formadas pelo "enchimento" dos valores que não casam em um operador com cada atributo do outro operador.
Os operadores definidos nessa seção assumem que existe um valor null(ω), que não definem, para ser utilizado para o "enchimento" de valores. Não se deve assumir que é o NULL definido para a linguagem SQL, nem que o ω é uma marca em vez de um valor.
Três operadores outer join são definidos: left outer join, rigth outer join, e full outer join. (Algumas vezes a palavra outer é omitida.)
[editar] Left Outer Join
O left outer join é escrito comoR =X S onde R e S são relações. O resultado do left join é o conjunto de todas as combinações das tuplas em R e S que seus atributos em comum são iguais , além disso, tuplas em R que não tem correspondencia em S.
Por exemplo considere as tabelas Empregado e Departamento e seu left outer join:
|
|
|
Na relação resultante, tuplas em S que não tem valores com os mesmos nomes de atributos com tuplas em R recebem um valor null, ω.
Dado que não existem tuplas em Departamento com DeptNome igual a Finanças ou Executivo, ωs aparecem na relação resultante onde tuplas em DeptNome tem Finanças ou Executivo.
Sendo r1, r2, …, rn atributos da relação R e {(ω, …, ω)} os únicos atributos que são unique para a relação S (aqueles que não são atributos de R). Então o left outer join pode ser excrito em termos do natural join(utilizando operadores básicos) como segue:
[editar] Right Outer Join
Se comporta da mesma maneira que o anterios, só que os buracos da tabela são comutados.
O right outer join das relações R e S é escrito como R X= S. O resultado do right join é é o conjunto de todas as combinações das tuplas em R e S que seus atributos em comum são iguais, além disso, tuplas em S que não possuem correspondênca com tuplas em R.
Por exemplo considere as tabelas Empregado e Departamento e seu right outer join:
|
|
|
Na relação resultante, tuplas em R que não tem valores com os mesmos nomes de atributos com tuplas em S recebem um valor null, ω.
Dado que não existem tuplas em Empregado com DeptNome igual a Produção, ωs aparecem na relação resultante onde tuplas em DeptNome tem tuplas com Produção.
Sendo s1, s2, …, sn atributos da relação S e {(ω, …, ω)} os únicos atributos que são unique para a relação R (aqueles que não são atributos de S). Então, como no left join, o right outer join pode ser excrito em termos do natural join(utilizando operadores básicos) como segue:
[editar] Outer Join
O outer join ou full outer join combina os efeitos dos resultados do left e do rigth outer joins.
O full outer join é escrito como R =X= S onde R e S são relações. O resultado do full outer join é o conjunto de todas as combinações em R e S que são iguais em seus atributos com nomes iguais, além de tuplas em S que não possuem casamento com tuplas em R e tuplas em R que não possuem casamento com tuplas em S em seus atributos com nomes iguais.
Por exemplo, considere as tabelas Empregado e Departamento e o outer join:
|
|
|
Na relação resultante, tuplas em R que não têm valores em comum nos nomes dos atributos com as tuplas em S recebem um valor null", ω. Tuplas em S que não têm valores em comum nos nomes dos atributos com as tuplas em S também recebem um valor null", ω.
O full outer join pode ser simulado usando o left e o rigth outer joins (e, conseqüentemente, o natural join e união) como segue:
- R=X=S = (R=XS)
(RX=S)
[editar] Operações para o domínio computacional
[editar] Operação de Agregação
Existem cinco operações de agregação que são incluídas na maioria dos bancos de dados. Esses operadores são Soma, Contagem, Média, Máximo e Minimo. Na álgebra relacional, é escrito como Exp1,Exp2,Exp3…Gfunc1,func2,func3…(Relação). Enquanto um deve especificar a função a utilizar, as expressões, porém, são opcionais. Vamos assumir que temos uma tabela chamada Conta com três colunas, a saber Número_conta, Nome_ramo e Equilíbrio. Queremos encontrar o máximo de equilíbrio de cada ramo. Isto é realizado por Nome_ramo G Max (Equilíbrio) (Conta). Para encontrar o maior saldo de todas as contas, independentemente do ramo, poderíamos simplesmente escrever G Max (Equilíbrio) (Conta).
[editar] Limitação da álgebra relacional
Embora a álgebra relacional pareça suficientemente poderosa para a maioria dos efeitos práticos, existem alguns operadores simples e naturais nas relações que não podem ser expressos pela álgebra relacional. O fecho transitivo de uma relação binária é um deles. Dado um domínioD, a relação binária R é um subconjunto deDxD. O encerramento transitivo R+de R é o menor subconjunto deDxD contendo'R que satisfaz a seguinte condição:
x
y
z ((x,y)
R+
(y,z)
R+
(x,z)
R+)
Isto pode provar que não existe uma expressão de álgebra relacional E(R), tendo R como argumento variável que produz R+. A prova é baseada no fato de que, dada uma expressão relacional E cujo se alegou que E(R) = R+, onde R é uma variável, podemos sempre encontrar uma instância r de R(e um domínio correspondente d), de modo que E( r) ≠' r+.
[editar] Uso das propriedades algébricas para optmização de consultas
Banco de dados relacional pode ser representado como uma árvore, onde
- Os nodos internos são operadores,
- Folhas são as relações,
- Subárvores são sub-expressões;
Nosso principal objetivo é transformar a expressão de árvores expressões equivalentes de árvores, onde a dimensão média das relações geradas por sub-expressões na árvore são menores do que eram antes da otimização. Nosso segundo objetivo é tentar formar sub-expressões comuns dentro de uma única consulta, ou se houver mais de uma consulta a ser avaliada, ao mesmo tempo, em todas essas consultas. A lógica subjacente é a de que o segundo objetivo é o suficiente para computar sub-expressões comuns uma vez, e os resultados podem ser utilizados em todas as consultas que contenham essa sub-expressão.
Aqui, apresentamos um conjunto de regras, que podem ser utilizados em tais transformações.
[editar] Seleção
Regras sobre operadores de seleção desempenham papel mais importante na otimização da busca. Seleção é um operador que de forma muito eficaz diminui o número de linhas no seu operando, por isso, se nós conseguirmos passar as seleções em uma árvore de expressão para as folhas, as relações internas (geradas por sub-expressões) provavelmente irão encolher.
[editar] Propriedades básicas de seleção
Seleção é uma operação idempotente (múltiplas aplicações da mesma seleção têm o mesmo efeito de uma única aplicação), e comutativa (a ordem em que as seleções são aplicadas não influencia o resultado).
[editar] Quebrando seleções com condições complexas
Uma seleção cuja condição é uma conjunção de condições mais simples é equivalente a uma seqüência de seleções com as mesmas condições individuais, e a seleção cuja a condição é uma disjunção é equivalente a uma união de seleções. Essas identidades podem ser usadas para mesclar seleções de modo que menos seleções precisem de ser avaliadas, ou para dividir-las de modo a que a componente seleções possa ser movida ou otimizada separadamente.
[editar] Seleção e produto cartesiano
CProduto cartesiano é o operador mais caro de avaliar. Se as relações de entrada têm
e
linhas, o resultado irá conter
linhas. Por isso, é muito importante fazer o nosso melhor para diminuir o tamanho de ambos os operandos antes de aplicar o operador produto cartesiano
Isto pode ser feito eficazmente, se o produto cartesiano é seguido por um operador de seleção, por exemplo,
. Considerando a definição de join, isto é o caso mais provável. Se o produto cartesiano não é seguido por um operador de seleção, podemos tentar empurrar para baixo uma seleção a partir de níveis mais altos da árvore de expressão usando a outra regra de seleção.
[editar] Seleção e operadores de conjuntos
Seleção é distributiva ao longo do setminus, da intersecção e união de operadores. As três regras seguintes são utilizadas para definir as operações na árvore de expressão. Note, que no setminus e na intersecção operadores, é possível aplicar o operador seleção apenas em um dos operandos após a transformação. Isso pode fazer sentido nos casos em que um dos operandos é pequeno, e os custos gerais da avaliação do operador seleção superam os benefícios de se utilizar uma menor relação como um operando.
[editar] Seleção e projeção
Seleção é associativo com projeção se e somente se os campos referenciados na condição da seleção são um subconjunto dos campos na projeção. Fazer a seleção antes da projeção pode ser útil se o operando é um produto cartesiano ou join. Em outros casos, se a condição da seleção é relativamente cara para computar, mover a seleção para fora da projeção pode reduzir o número de tuplas que devem ser testadas (desde que a projeção possa produzir menos tuplas devido à eliminação de duplicatas).
[editar] Projeção
[editar] Propriedades básicas da projeção
Projeção é idempotente, de forma que uma série de (válido) projeções é equivalente a projeção extern
[editar] Projeção e operadores de conjuntos
Projeção é distributiva ao longo da diferença, união e intersecção.
[editar] Renomear
[editar] Propriedades básicas de renomear
Renomear sucessivamente uma variável pode se desmanchar em um único renome. Renomear operações que não possuem variáveis em comum pode ser arbitrariamente reordenada, uma com relação a outra, e podem ser aproveitadas para fazer sucessivas renomeações adjacentes.
[editar] Renomear e operações de conjuntos
Renomear é distributivo sobre a diferença, união e intersecção.
[editar] Implementações
A primeira linguagem de consulta que foi baseada na da álgebra Codd foi ISBL, e este trabalho pioneiro tem sido aclamado por várias autoridades como tendo mostrado o caminho para tornar a idéia de Codd em uma linguagem útil. Business System 12 foi uma indústria de vida curta que usava a força do SGBD relacional que o exemplo seguiu do ISBL.
Em 1998, Chris Data e Hugh Darwen propôs uma linguagem chamada Tutorial D destinado a ser utilizada no ensino de teoria de banco de dados relacional, e sua línguagem de consulta também usa as ideias do ISBL. Rel é uma implementação do Tutorial D.
Mesmo a linguagem de consulta SQL é vagamente baseada em uma álgebra relacional, embora os operandos em SQL (tabelas) não são exatamente as relações e diversos teoremas úteis sobre a álgebra relacional não detêm homólogo no SQL (provavelmente em detrimento de optimisers e / ou utilizadores).
[editar] Referências
[editar] Ligações externas
http://www.devmedia.com.br/articles/viewcomp.asp?comp=2663 http://www.inf.puc-rio.br/~melissa/informatica/materias/bd1/material/bd1-modulo2a_Algebra.pdf ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de Banco de Dados. São Paulo: Addison Wesley, 2005.
)
)
)



R
s
s) }
S

x
(x,z) 















