Banco de Dados Relacional Estendido Igor Casa Nova dos Santos Mauricio Volkweis Astiazara Conceito • É uma extensão do modelo Relacional • Mantém as qualidades do modelo sem sacrificar o fundamento relacional • Alarga a aplicabilidade • O torna menos restrito Exemplos de BD Relacionais Estendidos • Modelo Baseado em Lógica • Relacional Encaixado Modelo Baseado em Lógica Características • Utiliza uma linguagem de consulta não procedural • É baseado na lógica de primeira ordem É baseado em dois tipos de Relação • Relações Base, às vezes chamadas de BD extensional • Relações Derivadas, às vezes chamadas de BD intencional Estrutura da Consulta [Programa Datalog] Consulta Instrução de Consulta Regra 1 Regra 2 Regra n Estrutura de uma Regra Cabeça Corpo NovaRelação : - Literal 1, ... , Literal n, predicado Literal • Relação (campo 1, campo 2, ... , campo n) • Ex.: Depósito (agência, número, cliente, saldo) Depósito(“Tramandaí”, X , Y , Z ) Ex. de Regra • Rel (Y,X): - Depósito (“Tramandaí”, X, Y, Z), Z>200 Instrução de Consulta • Comando ? Depósito (“Tramandaí”, X, Y, Z) ? • Comando query Query (Y): - Depósito (“Tramandaí”, X, Y, Z) Z>1000 Ex. de Programa Considerando o BD: • Cliente (cliente, cidade, fone, renda, número_revistas) • Interesse (cliente, interesse) • Assinatura (cliente, revista) Vamos elaborar um programa que ao final tenha uma relação que contenha o nome e o fone dos clientes que tem renda maior que R$ 1000 e interesse em informática. R1 (N,F): - Cliente (N, C, F, R), R>1000 R2 (N,F): - Interesse (N, “informática”), R1 (N,F) Ex. de Consulta Consultar nome e fone dos clientes da cidade de Torres que tem renda maior que 1500 e assinam menos de 3 revistas. X (Vcliente, Vfone, Vnúmero): - Cliente (Vcliente, “Torres”, Vfone, Vrenda, Vnúmero), Vrenda>1500 Y (Vcliente, Vfone): - X (Vcliente, Vfone, Vnúmero), Vnúmero<3 Y (Vcliente, Vfone) ? Uma expressão equivalente usando a instrução de consulta query ao invés de ? poderia ser: X (Vcliente, Vfone, Vnúmero): - Cliente (Vcliente, “Torres”, Vfone, Vrenda, Vnúmero), Vrenda>1500 Query (Vcliente, Vfone): - X (Vcliente, Vfone, Vnúmero), Vnúmero<3 Produto Cartesiano • RelProduto (X1, ... , Xn, Y1, ... , Yn): - rel1 (X1, ... , Xn), rel2 (Y1, ... ,Yn) União RelUnião (X1, ... , Xn): - rel1 (X1, ... , Xn), predicado RelUnião (X1, ... , Xn): - rel2 (X1, ... , Xn), predicado Ex.: Consultar nome e renda de todos os clientes de Torres e Tramandaí. Rel (A,D): - Cliente (A, “Torres”, C, D, E) Rel (A,D): - Cliente (A, “Tramandaí”, C, D, E) Outra forma equivalente seria usar a instrução query: Query (A,D) : - Cliente (A, “Torres”, C, D, E) Query (A,D) : - Cliente (A, “Tramandaí”, C, D, E) Diferença e Negação RelDif (X1, ... , Xn): - R1 (X1, ... , Xn), ¬ R2 (X1, ... , Xn) Ex.:Consultar o nome dos clientes que tem interesse em “informática” mas não assinam a revista “Guia Digital” A(X): - Interesse (X, “informática”) B(X): - Assinatura (X, “Guia Digital”) C(X): - A(X), ¬ B(X) Recursividade Vejamos um exemplo de sua utilização: Uma tabela de funcionários contendo o seu nome e o nome de seu gerente direto (primeiro acima dele). Este gerente também é um funcionário e está armazenado nesta mesma tabela, podendo ele também ter um superior, formando assim uma hierarquia gerencial. Funcionário (nome, gerente) Com o Datalog esta consulta é possível utilizando recursividade. Ela poderia apresentar a seguinte formulação: Rel (X): - Funcionário (X, “Bia”) Rel (X): - Funcionário (X, Y), Rel (Y) Query (X): - Rel(X) ou Rel (X)? Funcionários sob Rel são procurados e quando encontrados são adicionados a Rel. Vantagens • A possibilidade de realizar consultas recursivas aumenta as possibilidades de modelagem e consulta. • Devido à proximidade com a álgebra relacional possibilita uma “pré-otimização” da consulta aplicando-se as regras de otimização algébrica. Modelo Relacional Encaixado Características O modelo relacional encaixado é uma extensão do módulo relacional no qual os domínios podem ser valores atômicos ou assumirem valores que são relações. Assim o valor de um atributo pode ser uma relação, e o valor de um atributo dessa relação pode ser outra relação. Isto permite a construção de um objeto complexo que pode ser representado em uma única tupla de uma relação encaixada. Para demonstrar esse modelo usaremos o seguinte ex. de BD que armazena informações sobre Documentos: Título do documento Lista de autores Data Lista de palavras-chave, palavras relativas ao assunto que o documento trata. Doc não normalizada Título Plano venda Relatório geral Lista_Autor de {Samuel, João} {João, Fábio} Data 1/Abril/95 Lista_Palav ra-chave {Lucro, Estratégia} 17/Junho/97 {Lucro, Pessoal} A definição do esquema de Doc • Doc=(Título, Lista_Autor, Data, Lista_Palavra-chave) • Lista_Autor=(Autor) • Data=(Dia, Mês, Ano) • Lista_Palavra-chave=(Palavra-chave) consulta “Dê o título de todos os documentos escritos por João que dizem respeito a lucro” • select Título • from Doc • where “João” in Lista_Autor • and “Lucro” in Lista_Palavrachave “Dê o ano de publicação dos documentos escritos por João que dizem respeito a lucro” • select Título, (select ano from data) • from Doc • where “João” in Lista_Autor • and “Lucro” in Lista_Palavrachave “Dê o título e número de autores de cada documento” • select Título, count (Lista_Autor) • from Doc Considerando o BD: • Jogador (nome, pontuação) • pontuação (rodada, pontos) Consultar o nome e total de pontos dos jogadores com mais de 100 pontos Consultar o nome e total de pontos dos jogadores com mais de 100 pontos • select nome, sum (select pontos from pontuação) • from Jogador • where sum (select pontos from pontuação)>100 O operador desencaixar pode transformar uma tabela que está modelada de forma encaixada (não normalizada) em uma na 1FN. Sintaxe: unnest <tabela> on <campo> as <novo campo> Por exemplo desencaixar a lista de autores em único campo para a relação Doc: unnest Autor Doc on Lista_Autor as O operador encaixar transforma uma tabela normalizada em uma encaixada nest <tabela> on <campo> as <novo campo> As operações encaixar e desencaixar podem ser usadas nas consultas. Considerando o banco de dados abaixo: Cliente (codcliente, nome, fone) NF (codcliente, data, valor) “Dê o nome e a média de compras de cada cliente”: Select nome, avg (valor_total) From (nest (select nome, valor, codcliente from Cliente, NotaFiscal where Cliente.codcliente=NotaFiscal.cod cliente) on valor as valor total) Vantagens • modelo de mais fácil entendimento e mais intuitivo • usuário típico de um sistema pensa na organização das informações no modo não normalizado. • A representação em 4FN exigiria que os usuários incluíssem junções