Curso de Desenvolvimento de Servidores - CDS Disciplina Introdução a Banco de Dados Antônio Luiz Santana Material Produzido por Realização: PROFa Claudinete Vicente Borges Acesse: http://pse.ifes.edu.br/cds/site Sumário 1. CONCEITOS DE BANCOS DE DADOS................................................................................................................... 9 1.1. DEFINIÇÃO ........................................................................................................................................................... 9 1.2. OBJETIVOS ........................................................................................................................................................... 9 1.3. SISTEMAS DE ARQUIVOS CONVENCIONAIS................................................................................................. 9 1.4. USUÁRIOS DE BANCO DE DADOS ................................................................................................................. 11 1.5. ABSTRAÇÃO DE DADOS.................................................................................................................................. 11 1.6. INDEPENDÊNCIA DE DADOS .......................................................................................................................... 12 1.7. ARQUITETURA DE SISTEMAS DE BANCO DE DADOS [SILBERSCHATZ, 2006]..................................... 12 1.7.1. Sistemas Centralizados ................................................................................................................................. 12 1.7.2. Sistemas Cliente-Servidor ............................................................................................................................. 13 1.7.3. Sistemas Paralelos ........................................................................................................................................ 13 1.7.4. Sistemas distribuídos..................................................................................................................................... 14 1.8. MODELOS DE BANCOS DE DADOS................................................................................................................ 14 1.8.1. Modelo em Rede............................................................................................................................................ 14 1.8.2. Modelo Hierárquico...................................................................................................................................... 15 1.8.3. Modelo Relacional ........................................................................................................................................ 16 1.8.4. Modelo Objeto-Relacional ........................................................................................................................... 17 1.8.5. Modelo Orientados a Objetos ....................................................................................................................... 17 1.9. ESTRUTURA GERAL DO SISTEMA................................................................................................................. 18 1.9.1. Componentes de processamentos de consultas ............................................................................................. 18 1.9.2. Componentes para administração do armazenamento de dados .................................................................. 18 1.9.3. Outras estruturas de dados ........................................................................................................................... 18 1.10. LINGUAGEM DE DEFINIÇÃO DE DADOS (DDL) ........................................................................................ 19 1.11. LINGUAGEM DE MANIPULAÇÃO DE DADOS (DML)................................................................................ 20 1.12. PROJETANDO BANCOS DE DADOS............................................................................................................. 20 2. MODELAGEM DE DADOS ..................................................................................................................................... 24 2.1. DEFINIÇÃO ......................................................................................................................................................... 24 2.2. ENTIDADES ........................................................................................................................................................ 24 2.4. RELACIONAMENTO ......................................................................................................................................... 25 2.4.1. Cardinalidade de relacionamento................................................................................................................. 27 2.4.2. Tipos de Relacionamentos............................................................................................................................. 29 2.4.3. Atributos de Relacionamentos [FALBO, 2009] ............................................................................................ 30 2.4.4. Generalização / Especialização de conjuntos de entidades .......................................................................... 31 2.5. DICIONÁRIO DE DADOS .................................................................................................................................. 32 2.6. FERRAMENTAS CASE ...................................................................................................................................... 33 2.7. MODELO ER ESTENDIDO - EER ...................................................................................................................... 33 3. PROJETO LÓGICO DE BANCO DE DADOS....................................................................................................... 34 3.1. DEFINIÇÃO ......................................................................................................................................................... 34 3.2. ESTRUTURA DOS BANCOS DE DADOS RELACIONAIS.............................................................................. 34 3.3. CHAVES............................................................................................................................................................... 35 3.4. PROPRIEDADES DO MODELO RELACIONAL [FALBO,2009] ..................................................................... 36 3.5.1. Relacionamento 1:1....................................................................................................................................... 38 3.5.2. Relacionamento 1:N...................................................................................................................................... 39 3.5.3. Relacionamento 1:N - identificado................................................................................................................ 39 3.5.4. Relacionamento N:N ..................................................................................................................................... 40 3.5.5. Generalização e Especialização ................................................................................................................... 40 3.5.6. Auto Relacionamento 1:N ............................................................................................................................. 41 3.5.7. Auto Relacionamento N:N............................................................................................................................. 42 3.5.8. Atributos Multivalorados .............................................................................................................................. 43 3.6. NORMALIZAÇÃO .............................................................................................................................................. 43 3.6.1. Primeira Forma Normal (1FN)..................................................................................................................... 43 3.6.2. Segunda Forma Normal (2FN) ..................................................................................................................... 44 3.6.3. Terceira Forma Normal (3FN) ..................................................................................................................... 45 4. LINGUAGENS DE CONSULTA.............................................................................................................................. 48 4.1. DEFINIÇÃO ......................................................................................................................................................... 48 4.2. ÁLGEBRA RELACIONAL.................................................................................................................................. 48 4.2.1 Operações Fundamentais............................................................................................................................... 49 4.2.2. Operações Não-Fundamentais...................................................................................................................... 54 4.3. SQL ....................................................................................................................................................................... 58 4.3.1. Estrutura Básica............................................................................................................................................ 59 4.3.2. Linhas (tuplas) duplicadas ............................................................................................................................ 60 4.3.3. Predicados e ligações.................................................................................................................................... 60 4.3.4. Operações de conjunto.................................................................................................................................. 62 4.3.5 Ordenando a exibição de tuplas..................................................................................................................... 62 4.3.6. Membros de conjuntos .................................................................................................................................. 63 4.3.7. Variáveis tuplas (renomeação) ..................................................................................................................... 63 4.3.8. Comparação de conjuntos............................................................................................................................. 64 4.3.9. Testando relações vazias............................................................................................................................... 64 4.3.10. Funções agregadas ..................................................................................................................................... 66 4.3.11. Removendo linhas de uma tabela................................................................................................................ 68 4.3.12. Inserindo linhas em uma tabela .................................................................................................................. 68 4.3.13. Atualizando valores..................................................................................................................................... 69 4.3.14. Valores Nulos .............................................................................................................................................. 70 4.3.15. Definição de dados...................................................................................................................................... 71 4.3.16. Tipos de Domínios da Linguagem SQL....................................................................................................... 72 4.3.17. Integridade .................................................................................................................................................. 73 4.3.18. Implementando Integridade Referencial em SQL ....................................................................................... 74 REFERÊNCIAS.............................................................................................................................................................. 77 1. CONCEITOS DE BANCOS DE DADOS 1.1. DEFINIÇÃO Um banco de dados, também conhecido como base de dados, é um conjunto de arquivos estruturados de forma a facilitar o acesso a conjuntos de dados. Esses arquivos encontram-se, de alguma forma, relacionados. Por exemplo, em um banco de dados de funcionários de uma empresa podemos encontrar alguns arquivos: dados pessoais (nome, endereço, dados de documentos, lotação), dados funcionais (cargo, data de admissão, etc.) e dados para pagamento (salário base, faixas, etc.). Para obter informações sobre um dado funcionário, como nome, cargo e salário, será necessário consultar os três arquivos, que devem estar relacionados. Segundo Heuser, um banco de dados é um conjunto de dados integrados, cujo objetivo é atender uma comunidade de usuários [HEUSER, 2004]. Com o crescimento do volume e dos tipos de dados nas organizações, é preciso utilizar softwares especiais para gerenciar os dados, os chamados SGBDs (Sistemas Gerenciadores de Banco de Dados). Um SGBD é um software de caráter geral para a manipulação eficiente de grandes coleções de informações estruturadas e armazenadas de uma forma consistente e integrada. Tais sistemas incluem módulos para consulta, atualização e as interfaces entre o sistema e o usuário. Podemos afirmar, então, que um SGBD é constituído por um conjunto de dados associados a um conjunto de programas para acesso a eles [SILBERSCHATZ, 2006]. 1.2. OBJETIVOS Dentre os principais objetivos do uso de Sistemas Gerenciadores de Bancos de Dados, destacam-se: Disponibilizar dados integrados para uma grande variedade de usuários e aplicações por meio de interfaces amigáveis; Garantir a privacidade dos dados por meio de medidas de segurança dentro do sistema (como visões, permissões, senhas de acesso); Permitir compartilhamento dos dados de forma organizada, mediando a comunicação entre aplicações e banco de dados e administrando acessos concorrentes; Possibilitar independência dos dados, poupando ao usuário a necessidade de conhecer detalhes de implementação interna, organização de arquivos e estruturas de armazenamento. 1.3. SISTEMAS DE ARQUIVOS CONVENCIONAIS Os sistemas de processamento de arquivos caracterizam-se por uma série de registros guardados em diversos arquivos e uma série de programas aplicativos para extrair e adicionar registros nos arquivos apropriados. 9 Podemos citar como desvantagens desse sistema (arquivos), em relação aos SGBD’s [SILBERSCHATZ,2006]: Redundância e inconsistência de dados. Considerando que diferentes programadores têm a possibilidade de criar arquivos com estruturas diferentes e aplicações para acessá-los, a possibilidade de se redundar dados por esses arquivos é muito grande. Além disso, em função dessa redundância, poderão ocorrer as inconsistências, considerando que os dados poderão ser atualizados em alguns arquivos e em outros não; Dificuldade no acesso aos dados. Diferentemente dos SGBDs, os sistemas de arquivos não possuem um ambiente para recuperação dos dados armazenados. Com isso, para cada informação a ser gerada, é necessário construir uma aplicação; Isolamento de dados. Considerando a diversidade de formatos existen tes dos arquivos e, consequentemente, dos dados armazenados neles, torna-se uma tarefa difícil a construção de aplicações para a recuperação desses dados; Problemas de atomicidade. O conceito de atomicidade está altamente relacionado ao de “átomo”, que se caracteriza como algo indivisível. Quando se fala em atomicidade em banco de dados, fala-se de uma unidade de trabalho que se deve executar totalmente ou que não se deve executar. Um exemplo clássico de atomicidade seria uma transferência de dinheiro entre duas contas, A e B. Se desejarmos transferir, por exemplo, R$ 100,00 da conta A para a Conta B, ou o será transferido integralmente ou não ocorrerá a transferência. Não é cabível que o dinheiro saia da conta A e não entre na conta B, por exemplo! Anomalias de acesso concorrente. Considerando o acesso simultâneo aos arquivos, por diferentes aplicações ou por diferentes usuários de uma mesma aplicação, pode-se gerar inconsistências nesses arquivos, devido a esses acessos. Tomemos como exemplo que uma conta conjunta A - com saldo igual a R$ 1000,00 - foi acessada de forma simultânea pelos correntistas Gabriel e Luiza. Gabriel sacou R$100,00 e Luiza, R$200,00. Pergunta-se: qual o saldo da conta após os saques? Se ambos leram o valor do saldo igual a R$1000,00, podemos ter como possíveis valores : R$900,00, R$800,00, levando-se em conta qual valor foi escrito por último. Nesse caso, nenhum dos dois valores são os corretos. O correto seria ter um saldo igual a R$700,00. Problemas de segurança. Nem todos os usuários possuem perfil para acessar a todos os dados disponíveis em um arquivo. Tomemos como exemplo um arquivo de funcionários, que possui, entre outros dados, o valor do salário do funcionário. Embora tenhamos a curiosidade de saber o salário dos nossos colegas, principalmente do nosso chefe, não é politicamente correto que desrespeitemos seu direito à privacidade. No entanto, não é possivel definir, para um arquivo, que alguns campos poderão ser visíveis por um usuário e por outros não, o que gera vulnerabilidade nesses sistemas; Problemas de integridade. Para explicar melhor esse item, tomemos como exemplo dois arquivos, um de sócios e outro de dependentes, de uma locadora de vídeo. Um dependente está relacionado a um sócio e, por consequência, a existência daquele depende da existência deste, ao qual 10 estará subordinado. Desse modo, a exclusão de um sócio acarreta a exclusão de seus dependentes. Esse tipo de integridade, denomina-se de “integridade referencial”, porém, existem outras mais simples que os arquivos não comportam. 1.4. USUÁRIOS DE BANCO DE DADOS Basicamente são quatro os tipos de usuários de sistemas de bancos de dados: Usuários leigos: interagem com o banco de dados por meio das interfaces de aplicações escritas por programadores de aplicações; Usuários avançados: interagem com os bancos de dados por meio de interfaces disponíveis nesse ambiente. Escrevem consultas SQL e submetem à execução sem a necessidade de escrever uma aplicação para esse fim; Programadores aplicações: usuários com formação em computação e que se propõem a construir aplicações, por meio de ferramentas (compiladores) destinadas para esse fim. Utilizando essas ferramentas, constroem interfaces para as aplicações, incluindo formulários e relatórios, acessando bancos de dados; Administrador de Banco de Dados (DBA): usuários mais especializados para um banco de dados. Cabe a eles a administração dessas bases, definição da melhor estrutura de armazenamento desses dados, definição de aspectos de segurança, programação de cópias de segurança (backup’s), dentre outros. 1.5. ABSTRAÇÃO DE DADOS Considerando que o nível de conhecimento dos usuários de bancos de dados é muito variável, oscilando entre aqueles que conhecem muito e outros que são leigos, os Sistemas de Bancos de Dados devem prover de mecanismos que administrem essa complexidade, simplificando as interações dos usuários com o sistema. Para isso, três níveis de abstração são considerados: Nível de Visão. Diz respeito à forma como os dados são vistos pelos usuários (individualmente). Diferentes usuários poderão ter diferentes visões de um mesmo banco de dados. Um determinado usuário, tanto pode ser um programador de aplicações, quanto um usuário final. O DBA é um caso especialmente importante. Ao contrário dos usuários comuns, o DBA terá de se interessar pelos níveis conceitual e físico. Lógico. O nível lógico descreve quais dados estão armazenados no banco de dados e qual a relação existente entre eles. Podemos dizer que a visão lógica é a visão dos dados “como realmente são” e não como os usuários são forçados a vê-los devido às restrições de linguagem ou hardware. Físico. Diz respeito à forma como os dados estão armazenados fisicamente. Preocupa-se em descrever as estruturas de dados complexas de baixo nível. 11 A figura 1 representa graficamente os níveis listados acima. Visão 1 Visão 2 ... Visão n Nível Lógico Nível Físico Figura 1: Níveis de abstração de dados Fonte: Silberschatz, Korth e Sudarshan, 2006. Adaptação. 1.6. INDEPENDÊNCIA DE DADOS A independência de dados pode ser definida como a imunidade das aplicações às alterações feitas, seja no nível físico seja no nível lógico de um banco de dados. O objetivo é alcançar o máximo de independência possível. Pode ser classificada em: Independência Física de dados: habilidade de modificar o esquema físico, sem a necessidade de reescrever os programas aplicativos. As modificações no nível físico são ocasionalmente necessárias para melhorar o desempenho. Independência Lógica de dados: habilidade de modificar o esquema conceitual, sem a necessidade de reescrever os programas aplicativos. As modificações no nível conceitual são necessárias quando a estrutura lógica do banco de dados é alterada. 1.7. ARQUITETURA DE SISTEMAS DE BANCO DE DADOS [SILBERSCHATZ, 2006] A arquitetura de um sistema de banco de dados está altamente relacionada às características do sistema operacional sobre o qual o SGBD será executado. 1.7.1. Sistemas Centralizados Os sistemas centralizados são os executados sobre um único sistema operacional, não interagindo com outros sistemas. Eles podem ter a envergadura de um sistema de banco de dados de um só usuário, executado 12 em um computador pessoal ou em sistemas de alto desempenho, denominados de grande porte. 1.7.2. Sistemas Cliente-Servidor Como os computadores pessoais têm se tornado mais rápidos, mais potentes e baratos, há uma tendência de seu uso nos sistemas centralizados. Terminais conectados a sistemas centralizados estão sendo substituídos por computadores pessoais. Como resultado, os sistemas centralizados atualmente agem como sistemas servidores que atendem a solicitações de sistemas clientes. A computação cliente-servidor é um processamento cooperativo de informações de negócio por um conjunto de processadores, no qual múltiplos clientes iniciam requisições que são realizadas por um ou mais servidores centrais. O termo cliente-servidor é usado para descrever software que executa em mais de um hardware de modo a realizar uma tarefa do negócio. A separação de hardware é a norma em aplicações cliente-servidor, embora algumas pessoas utilizem o termo para descrever diferentes componentes de software se comunicando uns com os outros, ainda que rodando em uma mesma máquina. A distância entre processadores remotos varia desde computadores localizados na mesma sala ou prédio, até aqueles localizados em diferentes prédios, cidades ou mesmo espalhados pelo planeta. Nessa arquitetura, as funcionalidades de um banco de dados podem ser superficialmente divididas em duas categorias: front-end e back-end. O back-end gerencia as estruturas de acesso, o desenvolvimento e a otimização de consultas, o controle de concorrência e a recuperação. O front-end consiste em ferramentas como formulários, gerador de relatórios e recursos de interface gráfica. A interface entre o front-end e o back-end é feita por meio de SQL ou de um programa de aplicação. 1.7.3. Sistemas Paralelos Sistemas paralelos imprimem velocidade ao processamento e à CPU, por meio do uso em paralelo de CPU’s e discos. No processamento paralelo muitas operações são realizadas ao mesmo tempo, ao contrário do processamento serial, no qual os passos do processamento são sucessivos. Um equipamento paralelo de granulaçãogrossa consiste em poucos e poderosos processadores (a maioria dos servidores atuais), enquanto um paralelismo intensivo ou de granulação fina usa milhares de pequenos processadores, com capacidade menor de processamento. Computadores paralelos com centenas de processadores já estão disponíveis comercialmente. As duas principais formas de avaliar o desempenho de um sistema de banco de dados são pelo throughput e pelo tempo de resposta. O primeiro diz respeito ao número de tarefas que podem ser executadas em um dado 13 intervalo de tempo. Um sistema que processa um grande número de pequenas transações pode aumentar o throughput por meio do processamento de diversas transações em paralelo. Já o tempo de resposta diz respeito ao tempo total que o sistema pode levar para executar uma única tarefa. Um sistema que processa um grande volume de transações pode reduzir o tempo de resposta por meio de processamento em paralelo. 1.7.4. Sistemas distribuídos Em um sistema distribuído, o banco de dados é armazenado, geograficamente, em diversos computadores, denominados sites. Os computadores de um sistema de banco de dados distribuídos comunicam-se com outros, por intermédio de vários meios de comunicação, como redes de alta velocidade ou linhas telefônicas. As principais diferenças entre os bancos de dados paralelos e os bancos de dados distribuídos são que, nos bancos de dados distribuídos, há a distribuição física geográfica, a administração ocorre de forma separada e há uma intercomunicação menor. Outra grande diferença é que nos sistemas distribuídos distinguimos transações locais (acessa um único computador, em que a transação foi iniciada) e globais (envolve mais de um computador, sendo necessária a participação de um coordenador). Há diversas razões para a utilização de sistemas de bancos de dados distribuídos, dentre as quais: compartilhamento dos dados (usuários de um local podem ter acesso a dados residentes em outros – por exemplo: bancos), autonomia (cada local administra seus próprios dados) e disponibilidade (se porventura uma SGBD sai do ar, os demais podem continuar em operação). Há, no entanto, algumas desvantagens relacionadas ao seu uso, dentre as quais: custo de desenvolvimento de software, maior possibilidade de bugs e aumento do processamento e sobrecarga. 1.8. MODELOS DE BANCOS DE DADOS Os modelos de bancos de dados definem a forma como os dados encontramse organizados internamente. Em ordem cronológica, os modelos de banco de dados classificam-se em redes, hierárquicos, relacionais, objetorelacionais e orientados a objetos. A seguir, há uma breve descrição sobre cada um desses modelos. 1.8.1. Modelo em Rede Um banco de dados em rede consiste em uma coleção de registros que são concatenados uns aos outros por meio de ligações. Um registro é, em muitos aspectos, similar a uma entidade no modelo entidade-relacionamento. Uma ligação é uma associação entre dois registros. Assim, uma ligação pode ser vista como um relacionamento binário no modelo ER [SILBERSCHATZ, 2006]. 14 Tanto o Modelo Rede como o Modelo Hierárquico podem ser considerados como estruturas de dados em nível lógico mais próximo do nível físico. Devido a essa proximidade ao nível físico, as estruturas de dados rede e hierárquica exibem as rotas lógicas de acesso de dados de forma acentuada, possibilitando a localização lógica de um determinado registro no banco de dados. O Modelo Relacional, quando comparado à Estrutura Rede e Hierárquica, é mais orientado para modelagem do que como modelo com rotas de acesso, embora possamos considerar as diversas redundâncias existentes em diversas tabelas como sendo uma forma de rota de acesso. O Modelo Rede utiliza como elemento básico de dados a ocorrência de registro. Um conjunto de ocorrência de registro de um mesmo tipo determina um tipo de registro. Um conjunto de tipos de registros relacionados entre si, por meio de referências especiais, forma uma estrutura de dados em rede. As referências especiais são conhecidas como ligações, que, por sua vez, podem ser implementadas sob a forma de ponteiros. As referências estão normalmente inseridas junto com as ocorrências de registro; assim, todo o acesso a um próximo registro utiliza o ponteiro inserido no registro corrente disponível. Considere um banco de dados com registros de departamento e empregado, em que empregado possui as seguintes características: matrícula, nome e cidade; e departamento: código e nome. A figura 2 mostra um exemplo do banco de dados, considerando os dois tipos de registros informados. Figura 2: Exemplo de Banco de Dados – Modelo Redes. O modelo de banco de dados da Figura 2 mostra as ligações entre os registros de departamento e empregado. Luiza, por exemplo, está lotada no departamento de informática, enquanto o departamento de Geografia, por exemplo, possui dois funcionários lotados, Matheus e Gabriel. 1.8.2. Modelo Hierárquico Um banco de dados hierárquico consiste em uma coleção de registros relacionados, uns aos outros, por meio de ligações, como no modelo em redes. A diferença entre eles se dá pelo fato de o banco de dados hierárquico 15 organizar esses registros como coleções de árvores, em vez de gráficos arbitrários. Um banco de dados hierárquico compõe-se de um conjunto ordenado de árvores, mais precisamente, de um conjunto ordenado de ocorrências múltiplas de um tipo único de árvore. O tipo árvore compõe-se de um único tipo de registro “raiz”, juntamente com um conjunto ordenado de zero ou mais (nível inferior) tipos de subárvores dependentes. Um tipo de subárvore, por sua vez, também se compõe de um único tipo de registro. A associação entre tipos de registros segue uma hierarquia estabelecida por diversos níveis. No primeiro nível, o superior, situa-se o tipo de registro “Raiz” . Subordinado a ele, em nível 2, uma série de outros tipos de registros em nível 2. A cada tipo de registro em nível 2 subordina-se um outro conjunto de tipos de registros. A própria estrutura hierárquica define as suas rotas de acesso, facilitando, portanto, a manutenção do banco de dados. É importante notar que um determinado tipo de registro A, num determinado nível K, possui ligação com um e somente um tipo de registro B, de nível K1 (superior). Nessas condições, A é denominado registro PAI de B, que, por sua vez, é registro FILHO de A . No entanto, um tipo de registro A pode estar ligado a diversos filhos no nível de B. Todas as ocorrências de um dado tipo de filho que compartilham uma ocorrência de pai comum são chamadas de gêmeas. Uma vantagem dos bancos de dados hierárquicos é o tempo de resposta em consultas. No entanto, a atualização pode ser bastante custosa. Figura 3: Exemplo de Banco de Dados – Modelo Hierárquico. 1.8.3. Modelo Relacional O modelo relacional, diferentemente dos modelos redes e hierárquico, usa um conjunto de tabelas para representar tanto os dados quanto a relação entre eles. As ligações entre as tabelas é feita por meio dos valores dos atributos ou colunas, conforme descrito posteriormente. Cada tabela possui múltiplas colunas, conforme Tabela 1 e Tabela 2. Matricula 01 02 Nome Maria Matheus Cidade Vitória Vila Velha CodDepto 01 02 16 03 04 Gabriel Joana Serra Aracruz 02 03 Tabela 1: Tabela de Empregados. CodDepto 01 02 03 NomeDepto Informática Geografia Português Tabela 2: Tabela de Departamentos. 1.8.4. Modelo Objeto-Relacional O modelo objeto-relacional, também conhecido como relacional estendido, é um modelo intermediário entre o relacional e o orientado a objetos. Na verdade, os bancos de dados que se enquadram nesse modelo caracterizamse por usar a estrutura básica do modelo relacional, incorporando algumas características dos bancos de dados orientados a objetos. Características estas que incluem : herança de tipos e tabelas e definição de novos tipos complexos. A SQL-99 inclui recursos para dar suporte a esse modelo de banco de dados. 1.8.5. Modelo Orientados a Objetos O modelo relacional, hierárquico e redes foram muito bem sucedidos no desenvolvimento da tecnologia de banco de dados necessária para a maioria das aplicações convencionais de bancos de dados comerciais, possuindo, entretanto, algumas limitações quando aplicações mais complexas precisam ser projetadas e implementadas, tais como sistemas de informações geográficas e multimídias. Essas aplicações têm requisitos e características que as diferenciam das tradicionais aplicações comerciais, tais como estruturas complexas para objetos, armazenamento de imagens e textos longos, dentre outras, além da necessidade de definir operações não convencionais (NAVATE, 2005). A abordagem orientada a objetos oferece a flexibilidade para lidar com alguns desses requisitos, sem estar limitada pelos tipos de dados e linguagens de consulta disponíveis em sistemas de banco de dados tradicionais. Nesses bancos, o projetista especifica a estrutura de objetos complexos bem como as operações que incidem sobre esses objetos. Outra razão para o uso de banco de dados orientados a objetos é a predominância das linguagens orientadas a objetos. No caso de uma aplicação orientada a objetos utilizar um banco de dados relacional para persistir os dados, é necessário fazer um mapeamento entre esses dois mundos, o que dá trabalho, considerando as limitações impostas pelo modelo relacional. Embora existam muitos benefícios para a adoção do modelo orientado a objetos, esses bancos de dados não foram muito bem aceitos no mercado, em função da simplicidade do modelo relacional. Com isso, há uma proposta de 17 um modelo híbrido, denominado objeto-relacional ou relacional estendido, que se propõe a implementar alguns conceitos de orientação a objetos sobre a estrutura de um banco de dados relacional. Alguns SGBD´s proprietários e livres disponíveis no mercado enquadram-se nesse modelo, a exemplo do Oracle e do PostegreeSQL. 1.9. ESTRUTURA GERAL DO SISTEMA O sistema de banco de dados é dividido em módulos específicos, de modo a atender a todas as suas funções, algumas delas fornecidas pelo sistema operacional. Esses módulos podem ser organizados em dois grandes grupos: o de processamentos de consultas e o de administração do armazenamento de dados. A Figura 4 mostra como esses componentes se relacionam. 1.9.1. Componentes de processamentos de consultas Compilador DML.: traduz comandos DML da linguagem de consulta em instruções de baixo nível, inteligíveis ao componente de execução de consultas. Interpretador DDL: interpreta os comandos DDL e registra-os em um conjunto de tabelas que contêm metadados, “dados sobre dados”. Componentes para o tratamento de consultas: executam instruções de baixo nível geradas pelo compilador DML. 1.9.2. Componentes para armazenamento de dados administração do Gerenciamento de autorizações e integridade: testa o cumprimento das regras de integridade e a permissão ao usuário no acesso aos dados. Gerenciamento de transações: garante que o banco de dados permanecerá em estado consistente, a despeito de falhas no sistema, e que as transações concorrentes serão executadas sem conflitos em seus procedimentos. Gerenciador de arquivos: gerencia a alocação de espaço no armazenamento em disco e as estruturas de dados usadas para representar essas informações armazenadas em disco. Gerenciador de buffer: intermedia os dados entre o disco e a memória principal e decide quais dados colocar em cachê. 1.9.3. Outras estruturas de dados Diversas outras estruturas de dados são requeridas como parte da implementação do sistema físico, incluindo: 18 Arquivo de Dados: armazena o banco de dados. Dicionário de Dados: armazena informações sobre os dados do banco de dados. Índices: permite o acesso mais rápido aos dados. Estatísticas: armazenam informações sobre o banco de dados e são usadas pelo seletor de estratégias. Figura 4: Estrutura Geral do Sistema Fonte: Silberschatz, Korth e Sudarshan, 2006. Adaptação. 1.10. LINGUAGEM DE DEFINIÇÃO DE DADOS (DDL) Contém a especificação dos esquemas dos bancos de dados. O resultado da compilação de uma consulta de definição de dados (DDL) é armazenado em um conjunto de tabelas que constituem um arquivo especial chamado dicionário de dados. Um dicionário de dados é um arquivo de metadados. 19 1.11. LINGUAGEM DE MANIPULAÇÃO DE DADOS (DML) A linguagem de manipulação de dados (DML) é a linguagem que viabiliza o acesso aos dados ou a sua manipulação de forma compatível com o modelo de dados apropriado. São responsáveis pela: Recuperação da informação armazenada no banco de dados (SELECT); Inserção de novos dados nos bancos de dados (INSERT); Eliminação de dados nos bancos de dados (DELETE); Modificação de dados armazenados no banco de dados (UPDATE); 1.12. PROJETANDO BANCOS DE DADOS Antes de criarmos o banco de dados propriamente dito devemos identificar uma forma de planejá-la. Esse planejamento é extremamente importante para a estabilidade de todo o sistema. Estudos indicam que quanto maior o tempo gasto no projeto do banco de dados, menor será o tempo despendido na manutenção do modelo. Podemos comparar a criação de um sistema de banco de dados com a construção de uma casa. Imagine que seja construída uma casa sem que antes tenha sido feito um projeto de arquitetura, incluindo plantas baixas, cortes e fachadas. Provavelmente, no futuro, ao submeter essa casa à manutenção, o proprietário teria o inconveniente de construir quartos do lado da cozinha ou mesmo ter que fazer “puxadinhas” para realizar a ampliação da mesma. O mesmo acontece com sistemas mal-projetados ou nãoprojetados. Eles tornam-se pouco flexíveis a manutenções futuras, quando for necessário agregar novas informações ou mesmo, quando submetidos a correções. O processo de projetar um banco de dados inclui três fases distintas e integradas. A primeira delas consiste na construção de um modelo conceitual. O Modelo Conceitual inclui características a serem incluídas no sistema, mas que independem da tecnologia a ser utilizada, tanto de banco de dados quanto de linguagem de programação. A segunda fase pressupõe a construção de um modelo lógico, tendo como base o Modelo Conceitual criado e inclui a definição de tabelas, campos, restrições de integridade, etc. Nesse modelo, considera-se a tecnologia do banco de dados a ser usado, como: relacional, orientado a objetos, etc. A terceira fase, que extrapola a fase de projeto, consiste na criação física do banco de dados, tendo a preocupação com estruturas de armazenamento e recuperação dos dados a serem armazenados. Nos capítulos que se seguem serão explorados a modelagem conceitual e o projeto lógico de banco de dados, considerando o modelo relacional. 20 Atividade 01 Faça os exercícios de fixação abaixo, referente ao capitulo 1. 1) Defina SGBD´s. 2) Cite duas desvantagens do uso de sistemas de arquivos em relação a SGBD´s. 3) Defina uma vantagem de se usar sistemas de arquivos em relação a SGBD. 4) Cite as quatro arquiteturas de banco de dados existentes no mercado. Descreva, em poucas linhas, as características de cada uma delas. 5) Quais são os níveis de abstração proporcionados por um SGBD? Enquadre, para cada grupo de usuário, abaixo listados, o nível em que o mesmo se encontra. a. Administrador de Banco de Dados b. Usuário de aplicações c. Programador e Analista de Aplicações 6) Liste, em ordem cronológica, os modelos de bancos de dados existentes no mercado. Qual modelo de banco de dados será utilizado em nossa disciplina? 21 Atividade 02 1) Dadas as relações abaixo, responda ao que se pede. Funcionário Matricula 01 02 03 04 05 06 Cargos Código 01 02 03 04 05 Nom e Ana Maria José Pedro Joana João CPF Cargo 123 234 245 125 435 467 2 1 3 1 2 1 Nome Cargo Programador Topógrafo Engenheiro Pedreiro Motorista Liste os nomes dos funcionários para os seguintes cargos: Topógrafo; Engenheiro; Programador: Para quais cargos não há funcionários lotados? 2) Informe se cada uma das consultas abaixo será executada pelo Compilador DML ou pelo Interpretador DDL. a) create table... b) create view... c) insert into tabela... d) alter table... e) delete from tabela... f) update tabela set campo 1 = valor 1, campo2 = valor2... 22 Atividade 03 1) Numere a segunda coluna de acordo com a primeira. 1. Possibilidade de erros de acesso concorrente ( ) Refere-se à precisão ou validade dos dados. 2. Abstração dados ( ) Tarefa de um SGBD. de 3. Integridade ( ) Se alterar o esquema conceitual, não é necessário reescrever aplicações. 4. Instância ( ) Responsável pela modificação de dados armazenados no banco de dados. 5. Independência lógica de dados ( ) Se alterar o esquema físico, não é necessário reescrever aplicações. 6. Independência física de dados ( ) Contém a especificação dos esquemas de banco. 7. Controle concorrência de ( ) Conjunto de informações contidas em determinado banco de dados, em um determinado momento. 8. Linguagem de Definição de Dados (DDL) ( ) Trata-se de um modelo de banco de dados. 9. Linguagem de Manipulação de Dados (DML) ( ) Os usuários não precisam saber como os dados são armazenados e mantidos. 10. ObjetoRelacional ( ) Desvantagem de sistemas de arquivos. 23 2. MODELAGEM DE DADOS 2.1. DEFINIÇÃO O principal objetivo da modelagem conceitual de dados é construir modelos que representem os requerimentos das informações do negócio, segundo a perspectiva do usuário. Partindo desse princípio, ao construir modelos conceituais não há uma preocupação com a tecnologia a ser adotada para a sua implementação. Um modelo de dados consiste em uma coleção de ferramentas conceituais para descrição de dados, relacionamento entre os dados, semântica e restrições [SILBERSCHATZ,2006]. Neste capítulo exploraremos o modelo de entidades e relacionamentos (ER) para construção de modelos de dados, considerando que se trata da técnica de modelagem mais difundida para representação de modelos conceituais. O modelo ER é uma técnica de modelagem conceitual utilizada para representar os dados a serem armazenados em um sistema de informação, tendo sido desenvolvida originalmente para dar suporte ao projeto de bancos de dados [CHEN,1990]. Esse modelo foi criado em 1976 por Peter Chen e pode ser considerado como padrão para a modelagem conceitual. Basicamente, o modelo ER representa as entidades (coisas) e os relacionamentos (fatos) do mundo real, em que há o interesse de monitorar o comportamento no sistema de informação em tese. 2.2. ENTIDADES Entidades são representações abstratas de “coisas”, “objetos” do mundo real modelado, para os quais temos interesse em manter informações no banco de dados. Podem representar tanto objetos concretos quanto abstratos. Quando se trata de conjuntos de objetos com características semelhantes, usualmente se denomina conjunto de entidades. Por exemplo, quando nos referimos ao conjunto de entidade “Departamentos” estamos falando de um conjunto de departamentos. Quando nos referimos ao departamento de informática, estamos falando da entidade, de uma instância do conjunto. Um conjunto de entidades será representado por meio de um retângulo contendo o nome do conjunto de entidades, em letra maiúscula e no plural, conforme mostra exemplo da Figura 5. Ex: FUNCIONÁRIOS, CARGOS, PESSOAS ... Figura 5: Exemplo de representação de conjunto de entidades Características dos conjuntos de entidades [FALBO, 2009]: São substantivos e perduram no tempo. Cada elemento de um conjunto de entidades só ocorre uma única vez e a ordenação do conjunto é irrelevante. 24 A princípio são representados em um conjunto de entidades todos os elementos do mundo real referidos pelo conjunto. Ex: FUNCIONÁRIOS = todos os funcionários de uma empresa. Para estabelecermos uma padronização, usaremos nomes de conjuntos de entidades sempre no plural e escritos em letras maiúsculas. No entanto, isso não representa uma regra. 2.3. ATRIBUTOS Descrevem propriedades relevantes de um conjunto de entidades. Podem ser representados no diagrama ou em um dicionário de dados. Adotaremos esta última abordagem com o intuito de mantermos um modelo mais legível. Seguem algumas características de atributos, segundo Falbo (2009): Um atributo deve ser Completo e Fatorado, ou seja, deve abranger todas as informações pertinentes e cada atributo deve capturar um aspecto em separado. Existem atributos que podem assumir um único valor ou múltiplos valores, sendo classificados como monovalorados ou multivalorados, respectivamente. Como exemplo de atributos monovalorados, podemos citar o nome de um funcionário. O telefone de um funcionário é um atributo multivalorado, pois pode assumir múltiplos valores ao mesmo tempo ou até mesmo nenhum valor. Ao definir um atributo de um conjunto de entidades, é importante também definir a obrigatoriedade de preenchimento do mesmo. Um atributo para o qual não haja um valor associado ou este valor não seja conhecido no momento da criação da entidade, então este atributo deve ser modelado para aceitar valores vazios – ou nulos. Na criação de um conjunto de entidade deve-se definir um identificador. Um identificador é um conjunto de um ou mais atributos que podem ser utilizados para identificar uma entidade dentro do conjunto. Por exemplo, a matrícula de um funcionário pode ser um atributo identificador, considerando que cada funcionário terá uma matrícula única. O atributo nome, no entanto, não pode ser usado para identificar um funcionário, considerando que existem homônimos. 2.4. RELACIONAMENTO Na seção anterior descrevemos atributos de conjuntos de entidades, que são propriedades dos objetos a serem armazenados em um banco de dados. Além dos atributos, os conjuntos de entidades caracterizam-se por relacionar-se com outros conjuntos de entidades, inclusive com ela mesma. A essas associações denominamos relacionamentos, conjunto de associações entre entidades (HEUSER, 2004). Neste texto adotaremos a seguinte notação: um relacionamento será representado por um losango com um verbo para indicar a ação e uma seta para informar o sentido de leitura, conforme mostra a Figura 6 abaixo. 25 Figura 6: Exemplo de representação de relacionamento A leitura feita para o relacionamento da Figura 6 é “funcionários são enquadrados em cargos”. Todo relacionamento possui uma leitura inversa; assim, uma outra leitura do relacionamento seria “cargos enquadram funcionários”. O relacionamento existente entre os conjuntos de entidades funcionários e cargos é um relacionamento binário, pois se trata de uma associação entre dois conjuntos de entidades. Quando o relacionamento envolve três conjuntos de entidades é conhecido como ternário. Outros exemplos de relacionamentos: Alunos cursam disciplinas / Disciplinas são cursadas por alunos; Editoras publicam livros / Livros são publicados por editoras; Autores escrevem livros / Livros são escritos por autores; Para facilitar a visualização foi construído um diagrama de ocorrência, referente ao modelo ER da Figura 6. Esse diagrama se propõe a mostrar as ocorrências de entidades do conjunto funcionários, representadas por : f1, f2, ..., fn; as ocorrências do conjunto cargos, representadas por : c1, c2, .., cn e dos relacionamentos existentes entre as entidades do conjunto de funcionários e de cargos. O funcionário f1 está enquadrado no cargo c1 através do relacionamento r1. O cargo c1, por outro lado, possui os funcionários f1 e f3, nele enquadrados, através dos relacionamentos r1 e r3. FUNCIONÁRIOS ENQUADRAMENTOS r CARGOS 1 f f1 f 2 f3 f4 f5 f6 . 7 . . r 2 c 3 1c r r 4 r 5 r 2 c . . . 3 6 r 7 Figura 7: Diagrama de ocorrências Fonte: Heuser, 2004. Adaptação. Entre duas entidades, podem existir vários tipos de relacionamentos. A Figura 8 mostra os relacionamentos de alocação e de gerência entre os mesmos conjuntos de entidades : FUNCIONÁRIOS e PROJETOS. 26 Figura 8: Entidades com dois tipos de relacionamento Além disso, uma entidade pode participar de relacionamentos com quaisquer outras entidades do modelo, inclusive com ela mesma, como mostra o relacionamento “chefiam” na Figura 9. Nesse caso, denomina-se que há um auto-relacionamento do conjunto de entidades FUNCIONÁRIOS. Figura 9: Exemplo de auto-relacionamento 2.4.1. Cardinalidade de relacionamento Indica os números mínimo (cardinalidade mínima) e máximo (cardinalidade máxima) de ocorrências possíveis, entre dois conjuntos de entidades, em um relacionamento. No diagrama de ocorrência da Figura 7, observamos que : um cargo pode enquadrar vários funcionários, enquanto que um funcionário deve ser enquadrado em apenas um cargo. A Figura 10 mostra a representação de cardinalidade no modelo ER. A leitura é feita da seguinte forma: um funcionário é enquadrado em, no mínimo 1 e no máximo 1 cargo, enquanto um cargo pode enquadrarno mínimo zero e no máximo n funcionários. N é um número arbitrário. Quando conhecemos esse número podemos representá-lo, em vez de o determinarmos pela letra N. Para efeito de projeto de banco de dados, o tratamento dado para esse número arbitrário é o mesmo, para qualquer valor maior que 1. 27 Figura 10: Entidades com dois tipos de relacionamento 28 2.4.2. Tipos de Relacionamentos O tipo de relacionamento é uma classificação baseada na cardinalidade máxima, podendo ser : 1:1, 1:N, N:1 e N:N. A seguir, serão explorados todos os tipos de relacionamentos sobre um relacionamento existente entre os conjuntos de entidades : FUNCIONÁRIOS E PROJETOS. Relacionamento 1:1 A Figura 11 mostra um exemplo de relacionamento do tipo 1:1. Cada Funcionário ou Projeto podem aparecer no máximo em um único par do relacionamento Gerenciam (Funcionário, Departamento). Nesse caso, podemos dizer que um funcionário pode gerenciar no máximo um projeto, ou mesmo nenhum, enquanto um projeto só deve ter um gerente. Figura 11: Exemplo de relacionamento 1:1 Relacionamento 1:N A Figura 12 mostra um exemplo de relacionamento do tipo 1:N. Cada Projeto pode aparecer no máximo em um único par do relacionamento Gerenciam, enquanto um Funcionário pode aparecer em um número arbitrário de vezes. Nesse caso, podemos dizer que um funcionário pode gerenciar vários projetos, enquanto um projeto só pode ter um gerente (tem que haver pelo menos 1!). Figura 12: Exemplo de relacionamento 1:N 29 Relacionamento N:N A Figura 13 mostra um exemplo de relacionamento do tipo N:N. Cada Funcionário ou Projeto podem aparecer em um número arbitrário de vezes do relacionamento Gerenciam. Nesse caso, podemos dizer que um funcionário pode gerenciar vários projetos, enquanto um projeto pode ter vários gerentes. Figura 13: Exemplo de relacionamento N:N Um outro conceito relacionado aos relacionamentos N:N é o de “Entidade Associativa”, também referenciada por alguns autores, como “Agregação”. Uma Entidade Associativa é uma abstração por meio da qual relacionamentos entre duas entidades são tratados como entidades em um nível mais alto de abstração. Essa “nova entidade”, a associativa, pode, então, relacionar-se com outras entidades do modelo, como mostra a Figura 14. Um correntista é uma agregação envolvendo os conjuntos de entidades Clientes e Contas Correntes. Figura 14: Exemplo de agregação N:N [Falbo, 2009] 2.4.3. Atributos de Relacionamentos [FALBO, 2009] Assim como as entidades, os relacionamentos também podem ter atributos, porém apenas os atributos de relacionamentos N:N são caracterizados como atributos de relacionamentos, os demais podem ser enquadrados em um dos conjuntos de entidades envolvidos no relacionamento. 30 Para os relacionamentos N:N há um teste que pode ser aplicado para se deduzir se um atributo é de um dos dois conjuntos de entidades ou se é do relacionamento. Figura 15: Exemplo de relacionamento N:N [Falbo, 2009] Fixa-se um material, como uma impressora, e variam-se os fornecedores desse material. Se o valor do atributo mudar ao variarmos o elemento do outro conjunto de entidades, é porque este não é atributo do primeiro conjunto de entidades, no caso MATERIAIS. O Procedimento análogo deve ser feito, agora, para a outra entidade. Fixando-se um fornecedor e variando-se os materiais temos: A Eletrocity vende uma impressora por R$ 350,00 e um microcomputador por R$ 2.000,00. O fato de o valor do atributo ter variado para a mesma entidade indica que ele não é atributo de FORNECEDORES. Se não é atributo nem de MATERIAIS, nem de FORNECEDORES, então é um atributo do relacionamento entre os dois conjuntos de entidades. 2.4.4. Generalização / Especialização de conjuntos de entidades Por muitas vezes, incluímos nos modelos ER’s conjuntos de entidades com diversas características em comum, diferenciando apenas em algumas delas. Nesse caso, usando o conceito de generalização, pode-se criar um conjunto de entidades genérico, contendo as características em comum, e especializam-se as demais com características parcialmente distintas. Um exemplo clássico é o de pessoa física em jurídica. Observe que existem várias características em comum entre ambas as pessoas, a exemplo de : nome, endereço e telefone. Uma pessoa física, no entanto, além dessas características comuns, possui : sexo e CPF. Uma pessoa jurídica, além dessas características comuns, possui CNPJ e atividade principal. A Figura 16 mostra a representação desse conceito no modelo ER. 31 Figura 16: Exemplo de generalização / especialização As entidades: PESSOAS FÍSICAS e JURÍDICAS herdam as características de clientes e incorporam outras adicionais, que são peculiares de cada um. Um cliente pode ser pessoa física, jurídica ou nenhum dos dois, mas toda pessoa física ou jurídica é cliente. Entidade Fraca Um outro conceito referenciado nos modelos ER’s é o de Entidade Fraca. Uma entidade fraca é uma entidade que não tem existência própria. Ela só aparece no modelo quando relacionada a outra entidade – intitulada como forte, sendo seus atributos identificadores compostos por pelo menos dois campos, sendo um deles um atributo da entidade forte. A Figura 17 mostra um exemplo em que o conjunto de entidades DEPENDENTES é denominada “entidade fraca”. Para a identificação de um dependente é necessário que se tenha informação do sócio. Os relacionamentos com essa característica são denominados identificados. Figura 17: Exemplo de entidade fraca 2.5. DICIONÁRIO DE DADOS O Dicionário de Dados é uma listagem organizada de todos os elementos de dados pertinentes ao sistema, com definições precisas para que os usuários e desenvolvedores possam conhecer o significado de todos os itens de dados manipulados pelo sistema. Em se tratando de Modelos de Dados, essa listagem contém, em ordem alfabética, as entidades e os relacionamentos com atributos de um DER. 32 Considerando que não há uma padronização sobre a definição de dicionário de dados, não será rotulado neste material, uma notação para estes, mesmo por que, as ferramentas CASE normalmente incluem relatórios para geração desses dicionários. 2.6. FERRAMENTAS CASE Você deve estar se perguntando como desenhar um diagrama ER. Será no Paint ou à mão? A resposta é simples. Existem várias ferramentas computadorizadas destinadas a auxiliar na construção de modelos e projetos de bancos de dados. São denominadas ferramentas CASE. Dentre outras, podemos citar Doctor CASE, ERWin e brModelo. Esta última é uma ferramenta desenvolvida sob a orientação do professor Carlos Heuser, professor de Banco de Dados da UFRGS, e encontra-se disponível para download na Internet. Embora seja uma ferramenta simples, permite trabalharmos com a construção de modelos conceituais e lógicos (tratados no próximo capítulo). 2.7. MODELO ER ESTENDIDO - EER O modelo ER possui um poder de expressão muito grande, principalmente quando se trata de modelagem de aplicações convencionais, porém alguns recursos são melhores representados por extensões feitas ao modelo básico. Recursos estes necessários para modelagem de aplicações mais complexas, como Sistemas de Informações Geográficas e CAD. Vários modelos semânticos de dados têm sido propostos na literatura, sendo denominados de modelo ER estendidos ou EER. Não há uma notação padrão para representação desses modelos, como ocorre com a UML. Segundo Navathe (2005), o modelo EER engloba todos os conceitos do modelo ER básico, acrescidos dos conceitos de subclasse e superclasse, especialização e generalização, tipo união e herança de atributo/relacionamento. 33 3. PROJETO LÓGICO DE BANCO DE DADOS 3.1. DEFINIÇÃO Quando construímos um modelo conceitual, focamos apenas no que o usuário deseja, abstraindo da plataforma em que este será implementado. No que se refere aos projetos de Banco de Dados, a preocupação é centrada em estabelecer de que forma os dados serão armazenados no sistema. Em função do modelo de banco de dados a ser usado, diferentes soluções de projeto devem ser adotadas, ou seja, se o software tiver de ser implementado em um banco de dados hierárquico, por exemplo, um modelo hierárquico deve ser produzido, adequando-se a modelagem conceitual de dados (ER ou diagrama de classes) a essa plataforma de implementação. Considerando que o modelo de banco de dados que predomina no mercado, atualmente, é o relacional, este capítulo se propõe a discutir conceitos de projetos relacionados a esse modelo de bancos de dados. 3.2. ESTRUTURA RELACIONAIS DOS BANCOS DE DADOS O modelo relacional consolidou-se no mercado por ser flexível, de simples compreensão. Está fortemente baseado na teoria matemática sobre relações, daí o nome relacional. Um banco de dados relacional consiste em uma coleção de tabelas, cada uma das quais com um nome único. Uma linha em uma tabela representa um relacionamento entre um conjunto de valores. Uma vez que essa tabela é uma coleção de tais relacionamentos, há uma estreita correspondência entre o conceito de tabela e o conceito matemático de relação, daí a origem do nome desse modelo de dados. Considere a tabela EMPREGADOS – Tabela 3. Ela possui três colunas: Matricula, Nome e Cidade. Seguindo a terminologia do modelo relacional, tratamos os nomes dessas colunas como atributos. Para cada atributo há um conjunto de valores permitidos, chamado domínio da coluna em questão. Para o atributo Matricula, por exemplo, o domínio é o conjunto de todas as matrículas de funcionários. Suponha que D1 denote esse conjunto, D2 o conjunto de todos os nomes de pessoas e D3 o conjunto de todas as cidades. Qualquer linha da tabela EMPREGADOS consiste necessariamente de uma tupla (v1, v2, v3), em que v1 é a matricula, (isto é, v1 está no domínio D1), v2 é um nome do funcionário e assim por diante. Em geral, um empregado é um conjunto de D1 x D2 x D3. Matricula 01 02 03 04 Nome Maria Matheus Gabriel Joana Cidade Vitória Vila Velha Serra Aracruz 34 Tabela 3: Tabela EMPREGADOS. Matematicamente, define-se uma relação como um subconjunto de um produto cartesiano de uma lista de domínios. Essa definição corresponde quase exatamente à definição de uma tabela. A única diferença é que designamos nomes aos atributos, ao passo que matematicamente se usam apenas "nomes" numéricos. Como as tabelas em essência são relações, podemos usar os termos matemáticos relação e tupla no lugar de tabela e linhas, respectivamente. Um valor de domínio que pertence a qualquer domínio possível é o valor nulo, que indica que um valor é desconhecido ou não existe. Por exemplo, suponhamos que incluamos o atributo numero_telefone na tabela Empregado, pode ser que um Empregado não possua telefone ou que o seu número seja desconhecido. 3.3. CHAVES É importante especificar como as entidades dentro de um dado conjunto de entidades podem ser identificadas. Conceitualmente, entidades e relacionamentos individuais são distintos, entretanto, na perspectiva do banco de dados, a diferença entre ambos deve ser estabelecida em termos de seus atributos. O conceito de chaves nos permite fazer tais distinções. Uma superchave é um conjunto de um ou mais atributos que, tomados coletivamente, permitem identificar de maneira unívoca uma entidade em um conjunto de entidades. Considere a inclusão de uma nova coluna na tabela EMPREGADO, o CPF do empregado. Os atributos (matricula,nome) e (nome,CPF) são suficientes para distinguir cada elemento do conjunto, podendo ser considerados como superchaves. Da mesma forma, podemos considerar o atributo CPF como superchave de empregado. O atributo nome não pode ser considerado como superchave, porque algumas pessoas podem ter o mesmo nome. Nosso interesse maior é por superchaves para as quais nenhum subconjunto possa ser uma superchave. Essas chaves são chamadas de chaves candidatas. Das superchaves mencionadas anteriormente somente (nome,CPF) não poderia ser considerada uma chave candidata, visto que o CPF, sozinho, já o é. Podemos usar o termo chave primária para caracterizar a chave candidata, que é escolhida pelo projetista do banco de dados como de significado principal para a identificação de entidades dentro de um conjunto de entidades. Quaisquer duas entidades individuais em um conjunto de entidades não podem ter, simultaneamente, os mesmos valores em seus atributos-chave. Em SGBD’s, apenas os conceitos de chaves primárias e chaves candidatas são de fato implementados! Um outro conceito de chave, que muito será explorado neste material, é o conceito de chave estrangeira. Uma chave estrangeira é um atributo ( ou combinação de atributos) de uma tabela que constitui a chave primária de uma tabela, daí o nome de estrangeira. É a estratégia usada para implementar 35 os relacionamentos dos modelos conceituais. Essa tabela referenciada pode ser a própria tabela, para os casos de auto-relacionamento, ou outras quaisquer do modelo. Outras denominações também são usadas para essas chaves, a exemplo de chaves externas e chaves transpostas. A Tabela 4 mostra um exemplo de chave estrangeira, o CodDepto. Os valores possíveis para essa coluna devem constar na Tabela referenciada por esse atributo, no caso, a de Departamentos. Além desses valores, dependendo do modelo de dados, nulo pode ser um valor possível. Matricula 01 02 03 04 Nome Maria Matheus Gabriel Joana Cidade Vitória Vila Velha Serra Aracruz CodDepto 01 02 02 03 Tabela 4: Tabela de Empregados, destacando a chave estrangeira (CodDepto). CodDepto 01 02 03 NomeDepto Informática Geografia Português Tabela 5: Tabela de Departamentos. 3.4. PROPRIEDADES DO MODELO RELACIONAL [FALBO,2009] Nenhum campo componente de uma chave primária pode ser nulo. Cada célula de uma relação pode ser vazia (exceto de uma chave primária), ou ao contrário, conter no máximo um único valor. A ordem das linhas é irrelevante. Não há duas linhas iguais. Cada coluna tem um nome e colunas distintas devem ter nomes distintos. Usando-se os nomes para se fazer referência às colunas, a ordem delas torna-se irrelevante. Cada relação recebe um nome próprio distinto do nome de qualquer outra relação da base de dados. Os valores de uma coluna são retirados todos de um mesmo conjunto, denominado domínio da coluna. Duas ou mais colunas distintas podem ser definidas sobre um mesmo domínio. Um campo que seja uma chave estrangeira ou um item transposto só pode assumir valor nulo ou um valor para o qual exista um registro na tabela em que ela é chave primária. 36 3.5. TRADUÇÃO RELACIONAL DO MODELO ER PARA O O objetivo desta seção é apresentar como se procede na elaboração do projeto lógico de bancos de dados relacionais a partir de modelos conceituais – no caso o ER. O modelo lógico é um modelo menos abstrato que o conceitual e provê um nível maior de detalhes. Para os diferentes modelos de bancos de dados (redes, hierárquicos, relacionais...) diferentes soluções de projeto devem ser adotadas. Assim, este material terá como foco apenas o projeto de banco de dados relacional. A tradução do modelo ER para o relacional seguirá os seguintes passos: Mapeamento das entidades e atributos; Mapeamento dos relacionamentos, considerando cada tipo {1:1, 1:N, N:N}; Mapeamento de generalizações e especializações; Mapeamento de atributos multivalorados. Diferentes autores usam diferentes representações para a especificação dos modelos lógicos de bancos de dados relacionais, sendo alguns representados de forma gráfica e outros textuais. A abordagem usada neste material será a de Carlos Heuser (HEUSER,2004), que usa uma notação resumida para definição do esquema, denominado Esquema Relacional, contendo as seguintes informações : Tabelas que formam o banco de dados; Colunas que compõem cada tabela; Restrições de integridade (no caso, apenas as restrições referentes às chaves primárias e estrangeiras são representadas). Para o exemplo das Tabelas 4 e 5 (Empregados e Departamentos), teremos a seguinte representação: Empregados (Matricula, Nome, Cidade, CodDepto) CodDepto referencia Departamentos Departamentos (CodDepto , NomeDepto) Os atributos sublinhados representam as chaves primárias das tabelas Empregados e Departamentos, respectivamente. CodDepto é uma chave estrangeira e que referencia a chave primária da tabela Departamentos. Para os casos das chaves estrangeiras compostas, a representação fica da seguinte forma: (coluna1, coluna2, ... colunaN) referencia <NomeTabela>. A fim de facilitar o entendimento, serão usados os mesmos exemplos de modelos descritos no capítulo 2 para exemplificar os diferentes tipos de relacionamentos. Consideremos também os atributos abaixo listados para os conjuntos de entidades Funcionários e Projetos, pois a opção foi de não representá-los no modelo ER. Funcionários = Matricula, Nome, Cidade e Data de Admissão Projetos = Código, Nome e Data de Inicio Seguindo os passos para elaboração do modelo conceitual temos, como passo 1, a definição das Tabelas que formam o banco de dados. Via de regra, 37 todo conjunto de entidades gerará uma tabela no banco de dados relacional. As exceções serão tratadas, quando ocorrerem. Com relação à nomenclatura usada na tabela, ela não deve, necessariamente, ser a mesma do conjunto de entidades, considerando que não pode haver espaços em branco e que devemos evitar nomes extensos para facilitar o trabalho dos programadores. No que se refere aos atributos dos conjuntos de entidades, eles devem ser mapeados em colunas das respectivas tabelas, porém, há algumas diretrizes para definição dessas colunas, conforme especificações a seguir: Evite usar nomes extensos. Ao fazer referência ao nome de uma coluna, normalmente escreve-se NomedaTabela.NomedaColuna o que estende ainda mais o nome do atributo. Considerando que a referência às colunas ocorre do modo acima descrito, evite incluir o nome da tabela nos nomes das colunas dessas tabelas. A exemplo da coluna Nome, da tabela Projetos. Algumas pessoas escrevem Nome_Projeto. Crie padrões de projeto para dar nomes às colunas, a exemplo de Data_Admissão e Data_Inicio. Evite usar prefixos diferentes para colunas com mesmo tipo de informação, como: Data_Admissão e Dt_Inicio. Ao definir a chave primária, escolha a coluna ou combinação destas colunas com o menor tipo de dados possível. Sobre os campos chaves, seja chave primária, candidata, seja estrangeira, são criados índices, e esses índices ocupam muito espaço em disco. Embora devamos evitar redundâncias nos modelos conceituais, a redundância, muitas vezes, é útil em um banco de dados, por questões de performance. Por exemplo, o valor de um pedido pode ser obtido por meio dos valores dos seus itens, porém, se guardarmos o valor total do pedido como uma coluna na tabela de pedidos, evitamos alguns acessos a disco, melhorando, assim, a performance das aplicações. 3.5.1. Relacionamento 1:1 Considerando o relacionamento Gerenciam, da Figura 17, a melhor solução de projeto a se considerar é: incluir a chave estrangeira na relação PROJETOS, em vez de colocá-la em empregados, derivando o seguinte esquema : Funcionarios (Matricula, Nome, Cidade, Dt_Admissao) Projetos (Codigo, Nome, Dt_Inicio, Matricula_Gerente) Matricula_Gerente referencia Funcionarios 38 Figura 17: Exemplo de relacionamento 1:1 Essa solução foi adotada, considerando-se que todo projeto tem um gerente, porém, nem todo funcionário gerencia um projeto. Ainda assim, se a chave estrangeira fosse criada em Funcionários, não teríamos problemas na implementação dessa solução, embora essa não seja a melhor abordagem. Se o relacionamento Gerenciam fosse total em relação a Funcionários e a Projetos, ou seja, se a cardinalidade mínima fosse 1 (um) para ambos, poderíamos optar por criar uma única tabela contendo todos os atributos. 3.5.2. Relacionamento 1:N Para os relacionamentos 1:N deve-se criar a chave estrangeira na tabela que representa o conjunto de entidades cuja cardinalidade máxima é 1. No caso da Figura 18, a chave estrangeira deve ser colocada em Projetos, pois cada projeto participa do relacionamento Gerenciam no máximo 1 (uma) vez. O esquema gerado ficaria da seguinte forma: Funcionarios (Matricula, Nome, Cidade, Dt_Admissao) Projetos (Codigo, Nome, Dt_Inicio, Matricula_Gerente) Matricula_Gerente referencia Funcionarios Figura 18: Exemplo de relacionamento 1:N 3.5.3. Relacionamento 1:N - identificado Para os relacionamentos 1:N, denominados identificados, como mostra o exemplo da Figura 19, a identificação de um elemento da entidade, dita fraca, requer a identificação da entidade, dita forte. Resumindo, temos nesses casos a chave estrangeira fazendo parte da chave primária da tabela mapeada pela entidade fraca. O esquema gerado ficaria da seguinte forma: Sócios (Matricula, Nome, Sexo, Dt_Matricula) Dependentes (Matricula, Num_Dependente, Sexo, Dt_Nascimento) Matricula referencia Sócios Figura 19: Exemplo de entidade fraca – relacionamento identificado Nesse caso, apenas o número do dependente não é suficiente para identificálo, considerando que diferentes sócios possuem dependentes 01, 02, 03,... 39 3.5.4. Relacionamento N:N Os bancos de dados relacionais não implementam ligações diretas para os relacionamentos N:N, como para os demais tipos de relacionamentos : 1:1 e 1:N. Nesse caso, o relacionamento também deve ser mapeado em uma tabela do banco de dados. A chave primária dessa nova tabela deve ser composta, no mínimo, pela chave primária das tabelas relacionadas, ou seja, tem-se pelo menos 02 chaves estrangeiras, e elas fazem parte da chave primária da tabela criada. Às vezes é necessário incluir mais um atributo para compor a chave primária da tabela, pois apenas as chaves estrangeiras não são suficientes para identificá-los. Considere o exemplo da Figura 20, agora com relacionamento N:N. Considere também que o relacionamento Gerenciam possui os seguintes atributos : Data de Inicio de Atividade e Percentual de dedicação. Figura 20: Exemplo de relacionamento N:N O esquema gerado ficaria da seguinte forma: Funcionarios (Matricula, Nome, Cidade, Dt_Admissao) Projetos (Codigo, Nome, Dt_Inicio) Gerenciam (Matricula ,Codigo, Dt_Inic_Atividade, Perc_Dedicacao) Matricula referencia Funcionarios Codigo referencia Projetos 3.5.5. Generalização e Especialização Considere a Figura 21 para as discussões que se seguem. Considere também que um cliente possui as seguintes características (atributos ) : Código, Nome e Endereço. Um cliente pessoa física, possui, adicionalmente, um CPF e Carteira de Identidade e, um cliente pessoa jurídica, possui, adicionalmente, um CNPJ e uma atividade principal. 40 Figura 21: Exemplo de generalização / especialização Para os casos em que há generalização / especialização, há três opções de projeto que podem ser adotadas: Opção 1: Criar uma tabela única, fundindo os três conjuntos de entidades. Nesse caso, os campos oriundos das tabelas especializadas devem ter a possibilidade de assumirem valores nulos. O esquema gerado ficaria da seguinte forma: Clientes (Codigo, Nome, Endereco, CPF, Carteira_Identidade, CNPJ, Ativ_Principal) Opção 2: Criar uma tabela para cada entidade da especialização, como Pessoas Físicas e Pessoas Jurídicas. Nesse caso, os atributos do conjunto de entidades genérico – Clientes – devem ser incluídos em cada uma das tabelas criadas. O esquema gerado ficaria da seguinte forma: Clientes_PFisica (Codigo, Nome, Endereco, CPF, Carteira_Identidade) Clientes_PJuridica (Codigo, Nome, Endereco, CNPJ, Ativ_Principal) Opção 3: Criar uma tabela para cada conjunto de entidade da hierarquia. Nesse caso, a chave primária das tabelas filhas (pessoas físicas e jurídicas) devem ser chaves estrangeiras e as mesmas do conjunto mais genérico, no caso, de Clientes. O esquema gerado ficaria da seguinte forma: Clientes (Codigo, Nome, Endereco) Clientes_PFisica (Codigo, CPF, Carteira_Identidade) Codigo referencia Clientes Clientes_PJuridica (Codigo, CNPJ, Ativ_Principal) Codigo referencia Clientes 3.5.6. Auto Relacionamento 1:N Para os auto-relacionamentos 1:N, como existe um relacionamento entre o mesmo conjunto de entidades, deve-se criar a chave estrangeira na única tabela que representa o conjunto de entidades. Nesse caso, deve-se ficar atento em alterar o nome do campo – chave estrangeira –, pois não é possível 41 ter colunas diferentes e com o mesmo nome em uma tabela. A Figura 22 representa um modelo ER com esse tipo de relacionamento. O esquema gerado ficaria da seguinte forma: Funcionarios (Matricula, Nome, Cidade, Dt_Admissao, Matricula_Chefe) Matricula_Chefe referencia Funcionarios Figura 22: Exemplo de relacionamento 1:N 3.5.7. Auto Relacionamento N:N Para os auto-relacionamentos N:N, assim como para os relacionamentos N:N tradicionais, cria-se uma nova tabela para mapear o relacionamento. Essa tabela terá duas chaves estrangeiras, agora, porém, vindas da mesma tabela. Essas chaves estrangeiras compõem a chave primária da tabela criada. O nome de pelo menos um campo deve ser alterado para evitar que haja dois atributos com o mesmo nome em uma mesma tabela. A Figura 23 representa um modelo ER com esse tipo de relacionamento. O esquema gerado ficaria da seguinte forma: Disciplinas (Codigo, Nome, Ementa) Pre_Requisitos (CodigoDisciplinaPos, CodigoDisciplinaPre) CodigoDisciplinaPre referencia Disciplinas CódigoDisciplinaPos referencia Disciplinas 42 Figura 23: Exemplo de relacionamento N:N 3.5.8. Atributos Multivalorados Os atributos multivalorados de conjunto de entidades também devem ser tratados, considerando-se que o modelo relacional não comporta múltiplos valores em uma célula de uma tabela. Para ilustrar, consideremos que telefone (0,n) seja um atributo multivalorado de Funcionários. Para esses atributos, uma solução de projeto adotada é a criação de uma tabela para cada um deles. Para a tabela criada, deve ser aplicada a mesma solução dos relacionamentos 1:N – identificados. Para o exemplo em tese, o esquema gerado ficaria da seguinte forma: Funcionarios (Matricula, Nome, Cidade, Dt_Admissao) Telefones (Matricula, Num_Telefone) Matricula referencia Funcionarios Nesse caso, não há limites de telefones para um funcionário, tanto pode não haver nenhum, como um ou vários. 3.6. NORMALIZAÇÃO Uma vez concluído o projeto lógico de banco de dados relacional, com geração do esquema correspondente, deve-se avaliar, para cada tabela, se a projeção foi bem feita. Esse processo de verificação, composto por um conjunto de regras, denomina-se “forma normal”. Há diversas formas normais usadas no processo de verificação, porém na nossa disciplina serão exploradas apenas as três primeiras formas normais, denominadas 1FN, 2FN e 3FN. Normalmente as formas normais visam eliminar informações redundantes nas tabelas, cujo processo é denominado normalização. 3.6.1. Primeira Forma Normal (1FN) Um banco de dados está na Primeira Forma Normal, quando não existem dados repetidos em nenhuma das linhas da tabela. 43 Segundo DATE (2004), uma relação R existe na primeira forma normal (1FN) se, e somente se, todos os domínios subjacentes contiverem apenas valores atômicos. Para ilustrar esse conceito, tomemos como exemplo a relação Funcionários, com a seguinte definição de esquema: Funcionarios (Matricula, Nome, Cidade, Dt_Admissao, Telefones) No caso dessa relação, nem todos os domínios contêm valores atômicos, como é o caso de telefones. Nesse caso, os valores não atômicos devem estar contidos em uma outra tabela, relacionada à original. Passando pelo processo de normalização (1FN), temos o seguinte esquema: Funcionarios (Matricula, Nome, Cidade, Dt_Admissao) Telefones (Matricula, Num_Telefone) Matricula referencia Funcionarios Com isso, as duas tabelas geradas encontram-se normalizadas na primeira forma normal. 3.6.2. Segunda Forma Normal (2FN) Quando uma tabela possui uma chave composta, suas colunas devem ser dependentes de toda a chave e não de apenas uma parte dela. Caso ocorra essa dependência parcial, dizemos que a tabela viola a segunda forma normal. Segundo DATE (2004), uma relação R existe na segunda forma normal (2FN) se, e somente se, estiver na (1FN) e todos os atributos não chaves forem dependentes da chave principal. Exemplo: Considere o esquema de uma relação filmes, de um banco de dados de uma locadora de vídeo, com o seguinte esquema: Filmes (CodigodoFilme, CodigodoAtor, Titulo, NomedoAtor) A coluna Título depende somente do Número da Fita, e Nome do Ator, depende somente do Número do Ator. Quase sempre a solução é dividir as colunas em duas tabelas e criar uma terceira tabela que correlacione as linhas das duas tabelas. Nesse caso geraríamos os seguintes esquemas: Filmes (CodigodoFilme, Titulo) Atores (CodigodoAtor, NomedoAtor) AtoresFilmes (CodigodoFilme, CodigodoAtor) CodigodoFilme referencia Filmes CodigodoAtor referencia Atores 44 3.6.3. Terceira Forma Normal (3FN) Uma tabela encontra-se na Terceira Forma Normal se todas as suas colunas dependerem de toda a chave principal e não houver interdependência entre as colunas que não são chaves da tabela. Segundo DATE (2004), uma relação R existe na terceira forma normal (3FN) se, e somente se, estiver na (2FN) e todos os atributos não chave forem intransitivamente dependentes da chave principal. Exemplo: Considere o esquema modificado da relação filmes de um banco de dados de uma locadora de vídeo com o seguinte esquema: Filmes (CodigodoFilme, Titulo, Categoria, Preco) Suponha que a loja determine o preço dos filmes por categoria: filmes de Terror, Drama e Comédia custam R$2,00; Musicais R$2,50 e Lançamentos R$3,00. Nesse caso, a coluna Preço dependeria não só da coluna Código do filme, como também da coluna Categoria. Essa tabela não está na Terceira Forma Normal. A solução seria criar uma tabela adicional para armazenar os valores por categoria do filme. Após normalização, os seguintes esquemas são gerados: Filmes (CodigodoFilme, Titulo,CodigoCategoria) CodigoCategoria referencia Categorias Categorias (CodigoCategoria, Preco) Atividade 01 Muitas vezes, o DBA se depara com situações em que possui o esquema do banco de dados, porém não tem o modelo conceitual equivalente. Baseado nisso, dada a definição do esquema abaixo, gere o modelo conceitual equivalente (esse processo denomina-se Engenharia Reversa). Fabricante (codf, nomef) Automovel (coda, nomea, preço, codf) Codf referencia Fabricante Pessoa (codp, nomep) Venda (codp, coda, data, valor, cor) Codp referencia Pessoa Coda referencia Automovel Atividade 02 Dado o modelo ER e dicionário de dados abaixo, gere o esquema relacional equivalente: 45 Dicionário de Dados: EQUIPES = CodEquipe + NomeEquipe PILOTOS = Altura +Peso CodPiloto +NomePiloto + DataNascimento + PAISES = CodPais + Sigla + Nome CORRIDAS = CodCorrida + DataCorrida + DuracaoProva + NomeCircuito PARTICIPACOES = PosicaoPilotoProva 46 Atividade 03 a) Dado a relação Perifericos, coloquem a mesma na terceira forma normal, passo a passo. Perifericos (Cod_Periferico, CodModelo, NoConfig, Quantidade, NomeModelo, CodCPU, NomeCPU) As dependências funcionais que existem nesta tabela são as seguintes: (Cod_Periferico, CodModelo, NoConfig) Quantidade CodCPU NomeCPU CodModelo NomeModelo CodModelo CodCPU CodModelo NomeCPU X Y, significa dizer que : Y depende de X b) Dado a relação Pedidos, coloquem a mesma na terceira forma normal, passo a passo. Pedidos (Numero_Pedido, Data, CodCliente, NomeCliente, EnderecoCliente, CodigoProduto*, NomeProduto*, ValorProduto*, QuantidadeProduto*, MatriculaEntregador, NomeEntregador, PlacaVeiculoEntregador) 47 4. LINGUAGENS DE CONSULTA 4.1. DEFINIÇÃO Uma linguagem de consulta é uma linguagem na qual um usuário requisita informações do banco de dados. São classificadas como procedurais e não procedurais. Numa linguagem procedural um usuário instrui o sistema para executar uma sequência de operações no banco de dados, a fim de computar o resultado desejado. Numa linguagem não-procedural o usuário descreve a informação desejada, sem fornecer um procedimento específico para obter tal informação. A Álgebra relacional é uma linguagem procedural, enquanto o cálculo relacional é uma linguagem não procedural. Navathe (2005) afirma que qualquer expressão escrita em álgebra relacional pode ser representada também no cálculo, dando o mesmo poder de expressão para ambas as linguagens. Como o nosso propósito de usar uma linguagem de consulta formal é o de entendermos o que ocorre nos “bastidores” da execução de uma consulta, focaremos apenas na álgebra relacional. A Linguagem SQL é uma linguagem de consulta comercial, intitulada padrão pelo comitê ANSI, desde 1986. É uma linguagem declarativa, com comandos muito mais amigáveis do que as linguagens formais, embora seja fundamentada nessas linguagens formais (na álgebra e no cálculo). Nas seções seguintes exploraremos a Álgebra Relacional e a linguagem SQL. 4.2. ÁLGEBRA RELACIONAL A álgebra relacional é uma linguagem de consulta procedural. Ela consiste em um conjunto de operações que tomam uma ou duas relações (tabelas) como entrada e produzem uma nova relação como resultado. Inclui um conjunto de operações, classificadas como fundamentais e não fundamentais. As operações fundamentais da álgebra relacional são: selecionar, projetar, renomear, (unárias) - produto cartesiano, união e diferença de conjuntos (binárias). Além das operações fundamentais, existem outras operações, a saber, interseção de conjuntos, ligação natural, entre outras, que são definidas em termos das operações fundamentais. As operações não fundamentais são usadas para simplificar consultas, considerando que uma operação não fundamental engloba consultas fundamentais. A Figura 23 mostra, de forma gráfica, cada uma das operações da álgebra. As operações da álgebra relacional atuam sobre uma ou duas relações, sendo classificadas como unárias ou binárias. As relações unárias trabalham sobre uma relação e as binárias sobre duas relações. Caso seja necessário usar mais de duas tabelas em uma consulta, operações podem ser usadas de forma 48 encadeada. Como o resultado de uma consulta da álgebra é uma nova relação, esta pode ser usada como entrada para a próxima operação. P roduto S elecionar P rojetar U nião a a b b c c x y a b c x y x y x y Intersecção D iferença Ligação (natural) a1 a2 a3 b1 b1 b2 b1 b2 b3 c1 c2 c3 a1 a2 a3 b1 b1 b2 D ividir c1 c1 c2 a a a b c x y z x y x z a Figura 23: Visão geral das operações da Álgebra Relacional Fonte: Heuser, 2004. Adaptação. 4.2.1 Operações Fundamentais Considere o seguinte esquema de banco de dados para exemplos posteriores, ao longo deste capítulo. Trata-se de um esquema bancário, composto de quatro tabelas: Agencias, Clientes, Depósitos e Empréstimos. Ele foi adaptado de Silberschatz (2006). Lembre sempre da definição deste esquema para quando a ele nos referirmos ao longo deste capítulo. Agencias (CodigoAg, NomeAg, CidadeAg) Clientes (CodigoCli, Nome, rua, cidade) Depositos (CodigoAg, NumeroCont, CodigoCli, saldo) CodigoAg referencia Agencias CodigoCli referencia Clientes Emprestimos (CodigoAg, CodigoCli, NumeroEmp, 49 quantia) CodigoAg referencia Agencias CodigoCli referencia Clientes Operação selecionar A operação selecionar seleciona tuplas (linhas) que satisfazem a um dado predicado. Usamos a letra minúscula grega sigma () para representar a seleção. O predicado aparece subscrito em . A relação argumento (entrada) aparece entre parênteses, seguindo o . A Figura 24 representa graficamente essa operação. Sintaxe: σ<predicado>(Relação) Figura 24: Operação seleção Usando o nosso esquema exemplo para selecionar as tuplas da relação empréstimo em que o código da agência é 0662, escreve-se: CodigoAg=0662(Emprestimos) Podemos encontrar todas as tuplas em que a quantia emprestada seja maior que 1200. quantia >1200(Emprestimos) As comparações são permitidas, usando =, ,, , e e os conectivos e (^) e ou (). Operação Projetar A operação projetar é uma operação unária que retorna sua relação argumento, com certas colunas deixadas de fora. A projeção é representada pela letra grega pi (). A Figura 25 representa graficamente essa operação. Sintaxe: <lista de atributos>(Relação) 50 Figura 25: Operação projeção Suponha que desejemos uma relação mostrando os clientes e as agências nas quais eles tomaram empréstimos, mas não nos importamos com a quantia e o número do empréstimo. Escrevemos: CodigoAg,CodigoCli(Emprestimos) Encontre todos os clientes (Nome) que moram em “Aracruz”. Devemos fazer uma seleção de todos os clientes que moram em Aracruz e, em seguida, projetar o nome desses clientes. Nome(clientes-cidade=”Aracruz” (Clientes)) Operação Produto Cartesiano A operação produto cartesiano, representada por (X) é capaz de combinar informações a partir de diversas relações. Trata-se de uma operação binária. Essa operação nos mostra todos os atributos das relações envolvidas. A Figura 26 representa graficamente essa operação. Sintaxe: (Relação1 Χ Relação2) Figura 26: Operação produto cartesiano Para selecionarmos todos os nomes dos clientes que possuam empréstimo na agência cujo código é 0662, escrevemos: Nome (CodigoAg=0662 Clientes)) ^ Emprestimo. CodigoCli = Clientes. CodigoCli (Emprestimos X Operação União (binária) A operação união de conjuntos, representada por (), permite-nos encontrar tuplas que estão em uma das relações envolvidas. A Figura 27 representa graficamente essa operação. 51 Sintaxe: (Relação1 Relação2) Figura 27: Operação união Vamos supor que quiséssemos conhecer todas as pessoas que possuam Depósitos, Empréstimos, ou ambos, numa determinada agência. Com os recursos que temos até agora, não seria possível conseguirmos tal informação. Nessa situação, deveríamos fazer a união de todos que possuam depósitos com todos que possuam empréstimos nessa agência. Como veremos no exemplo a seguir: Ex. Selecionar todos os clientes que possuam depósitos, empréstimos, ou ambos, na agência 051. Nome (CodigoAg=”051” ^depositos. CodigoCli = Clientes. CodigoCli(Depositos X Clientes)) Nome (CodigoAg=”051” ^emprestimos. CodigoCli = Clientes. CodigoCli(Emprestimos X Clientes)) Uma vez que as relações são conjuntos, as linhas duplicadas são eliminadas. Operação Diferença de conjuntos A operação diferença de conjuntos, representada por (-), é uma operação binária e nos permite encontrar tuplas que estão em uma relação e não em outra. A expressão r - s resulta em uma relação que contém todas as tuplas que estão em r e não em s. A Figura 28 representa graficamente essa operação. Sintaxe: (Relação1 - Relação2) Figura 28: Operação diferença de conjuntos 52 Ex. Encontrar todos os clientes que possuam um depósito, mas não possuem um empréstimo na agência 051. Nome (CodigoAg=”051” ^ depositos.CodigoCli = Clientes.CodigoCli(Depositos X Clientes)) Nome (CodigoAg=”051” ^Emprestimos.CodigoCli = Clientes.CodigoCli(Emprestimos X Clientes)) Operação Renomear A operação renomear, representada pela letra grega Rô (), é necessária sempre que uma relação aparece mais de uma vez em uma consulta. Ela faz uma cópia da relação original. Sintaxe: ρ NomeNovo (Relação) Ex. Encontre todos os clientes que moram na mesma rua e cidade que João. Podemos obter a rua e a cidade de João da seguinte forma: t rua, cidade (Nome=”João” (Clientes)) ou t Nome=”João” (Clientes) Entretanto, para encontrar outros clientes com essa rua e cidade, devemos referir-nos à relação Clientes pela segunda vez. Perceba que inserir novamente uma relação clientes na consulta, gerará ambigüidade. Por isso, deve-se renomeá-la. Clientes2 (Clientes) cliente2.cliente-.nome (Clientes)) (clientes.cidade = clientes2.cidade ^ clientes.rua = clientes2.rua (t X Clientes2 53 Atividade 01 Considere o esquema bancário abordado anteriormente e construa expressões em álgebra relacional para as questões que se seguem. 1. Selecionar todos os clientes (nomes) que possuam depósitos. 2. Selecionar todos os clientes que possuam depósito na mesma cidade onde moram. 3. Encontrar todas as agências que possuam clientes com nome “Maria” (depósitos ou empréstimos). 4. Usando as Operações Fundamentais, encontrar a conta com maior saldo. Atividade 02 Considere o esquema seguinte para construir expressões, usando operações fundamentais da álgebra relacional para as questões que se seguem. Pessoas (CodPessoa, Nome, Cidade, Chefe) Empresas (CodEmpresa, Nome, Cidade) Trabalha (CodPessoa, CodEmpresa, Salario) CodPessoa referencia Pessoas CodEmpresa referencia Empresas 5. Consulte todas as pessoas que trabalham. A consulta deverá retornar o nome das pessoas e a cidade onde moram. 6. Consulte o nome das empresas que possuem funcionários que ganham menos que um salário mínimo (considere o valor do salário de R$400,00). 7. Consulte todas as pessoas (nomes) que trabalham em Vitória. 8. Consulte todas as pessoas (nomes) que trabalham na mesma cidade onde moram. 9. Consulte todas as pessoas (nomes) que moram na mesma cidade do chefe. 10. Consulte todas as empresas (nomes) que funcionam em cidades em que não moram Maria. 11. Consulte todas as pessoas (nomes) que não trabalham em Vitória e que ganham acima de R$ 2000. 12. Selecione o nome do funcionário da empresa de código “01” que possui o menor salário. 4.2.2. Operações Não-Fundamentais Utilizando as operações fundamentais da álgebra relacional podemos expressar qualquer consulta da álgebra relacional. Entretanto, algumas consultas são longas ou complexas demais para serem expressas. Nesse caso, o uso das operações não fundamentais pode reduzir o tamanho e a complexidade dessas consultas. Operação Intersecção de conjuntos A operação Intersecção de conjuntos, representada por (), é uma operação binária e nos permite encontrar tuplas que estão nas duas relações envolvidas 54 na consulta. Pode ser expressa em função das operações fundamentais da seguinte forma: r s = r – (r – s). A Figura 29 representa graficamente essa operação. Sintaxe: (Relação1 Relação2) Figura 29 : Operação Intersecção de conjuntos Suponha que desejemos encontrar todos os clientes com um empréstimo e uma conta na agência “051”. Escrevemos da seguinte forma: Nome (CodigoAg=”051” ^ Depositos.CodigoCli = Clientes.CodigoCli(Depositos X Clientes)) Nome (CodigoAg=”051” Clientes)) ^ Emprestimos.CodigoCli = Clientes.CodigoCli(Emprestimos X Operação Ligação natural A ligação natural, representada pelo símbolo (|X|) é uma operação binária que permite combinar certas seleções e um produto cartesiano em uma operação. A operação ligação natural forma um produto cartesiano de seus dois argumentos e faz uma seleção, forçando uma equidade sobre os atributos que aparecem em ambos os esquemas relação. A Figura 30 representa graficamente essa operação. Sintaxe: (Relação1 |X| Relação2) Figura 30: Operação Ligação Natural Ex1: “Encontre todos os clientes que têm empréstimos e a cidade em que vivem”. Nome, cidade (Emprestimos |X| Clientes) 55 Ex2: “Encontre todos os cliente que têm empréstimos e que moram em “Vitória””. Nome, cidade (cidade=”Vitória” (Emprestimos |X| Clientes)) Operação Divisão A operação divisão, representada por (), é usada em consultas em que os atributos da relação final são os atributos da relação1 que não existem na relação2. As linhas da relação final contêm as linhas de R1 que incluem todos os valores das colunas comuns a R2. Normalmente aplica-se a consultas que incluem a frase “para todos”. A Figura 31 representa graficamente essa operação. Sintaxe: (Relação1 ÷ Relação2) ÷ ÷ Figura 31: Operação Divisão Suponha que desejemos encontrar todos os clientes que têm uma conta em todas as agências localizadas em “Vitória”. Podemos obter todas as agências de Vitória por meio da expressão: r1 CodigoAg (cidade=”Vitória” (Agências)) Podemos encontrar todos os pares Nome, CodigoAg, nos quais um cliente possui uma conta em uma agência, escrevendo: r2 Nome, CodigoAg (Depositos |X| Clientes) Agora precisamos encontrar clientes que apareçam em r2 com cada nome de agência em r1. Escrevemos essa consulta da seguinte forma: Nome, CodigoAg (Depositos |X| Clientes) CodigoAg (cidade=”Vitória” (Agências)) Operação de Remoção A operação remoção se faz necessária sempre que houver necessidade de excluir tuplas de uma relação. Sintaxe: R = R – E , onde E é uma consulta da álgebra relacional Exemplo1: Excluir todos os depósitos do cliente de código 01 Depositos = Depositos - (CodigoCli = “01” (Depositos)) Exemplo2: Excluir todas as contas de “joão” E CodigoAg, NumeroCont, CodigoCli, saldo (Nome=”joão” (Depositos |X| Clientes)) Depositos = Depositos - E Operação de Inserção 56 A operação inserção se faz necessária sempre que houver a necessidade de incluir tuplas em uma relação. Sintaxe: R = R E , onde E é uma consulta da álgebra relacional Exemplo1: Depositos = Depositos {(51, 980987, 1, 1200)} Exemplo2: Gerar um depósito para todas as pessoas que possuem empréstimos. A conta gerada terá o mesmo número do empréstimo e o valor do depósito será igual ao da quantia emprestada. Depositos = Depositos CodigoAg, numeroEmp, CodigoCli, quantia (Emprestimos) Operação de Atualização A operação atualização representada pela letra grega delta () se faz necessária sempre que houver a necessidade de alterar valores de tuplas em uma relação. Sintaxe: A E ( R), em que E é uma consulta da álgebra relacional. Exemplo1: Acrescer o saldo das contas de todas as pessoas em 5 %. saldo saldo * 1.05 ( Depositos ) Exemplo2: Suponhamos que contas com saldos superiores a R$10.000,00 recebam 6% de juros e as demais 5%. saldo saldo * 1.06 (saldo > 10000 ( Depositos )) saldo saldo * 1.05 (saldo <= 10000 ( Depositos )) 57 Atividade 03 Considere o esquema seguinte para construir expressões, usando operações da álgebra relacional para as questões que se seguem. Fabricante (codf, nomef) Automovel (coda, nomea, preco, codf) Codf referencia Fabricante Pessoa (codp, nomep) Venda (codp, coda, data, valor, cor) Codp referencia Pessoa Coda referencia Automovel 1. Relacione os nomes das pessoas que compraram algum carro. 2. Relacione os automóveis (nomes) da “Fiat”. 3. Quem comprou “Ford”? 4. Quem comprou carro com ágio (valor da venda maior que o valor do automóvel)? 5. Quem não comprou “Ford”? 6. Quem comprou “Ford” e não comprou “Volks”? 7. Qual é o carro mais caro (nome)? 8. Atualizar os valores dos automóveis da “GM” em 15%. 9. Exclua todas as vendas anteriores a ‘01/01/1990’. 10. Selecione todas as pessoas que compraram mais de um carro, de diferentes modelos, do mesmo fabricante. 4.3. SQL A linguagem SQL foi uma das grandes razões para a consolidação dos bancos de dados relacionais no mercado. Desde sua definição como padrão, em 1986, passou por diversas revisões, gerando publicações de novas versões. A versão original, denominada Sequel, foi desenvolvida no Laboratório de Pesquisa da IBM e implementada como parte do projeto System R no início dos anos 70. A linguagem evoluiu desde então, e nome foi mudado para SQL (Structured Query Language). A primeira versão ficou conhecida como SQL-86 ou SQL1, a segunda versão foi denominada SQL92 ou SQL2, e a última versão publicada, que incluiu recursos para dar suporte aos bancos de dados objetos-relacionais e orientados a objetos, ficou conhecida como SQL-99 ou SQL3. A maioria dos sistemas gerenciadores de bancos de dados comerciais implementa suporte ao padrão SQL. Além disso, incorporam uma série de funções adicionais, visando facilitar o trabalho dos desenvolvedores. Essas facilidades precisam ser usadas com cautela, pois, se apenas o padrão for 58 utilizado, garante-se a portabilidade, caso haja a necessidade de troca de SGBD. A linguagem SQL possui diversas partes: Linguagem de Definição de Dados (DDL) - Inclui comandos para definição de esquemas de relações, exclusão de relações, criação de índices e modificações do esquema de relações; Linguagem de manipulação de dados (DML) - Inclui comandos para inserção, exclusão e modificação de tuplas no banco de dados; Incorporação DML (SQL Embutida) - Uso de SQL em linguagens de programação de uso geral, como Pascal, C,...; Definição de Visões - A SQL DDL inclui comandos para definição de visões; Autorização - A SQL DDL inclui comandos para especificação de direitos de acesso a relações e visões; Integridade - A SQL DDL inclui comandos para especificação de regras de integridade que os dados que serão armazenados no banco de dados devem satisfazer; Controle de Transações - A SQL DDL inclui comandos para especificação de iniciação e finalização de transações. 4.3.1. Estrutura Básica A estrutura básica de uma expressão SQL consiste em três cláusulas: select, from e where. A cláusula select corresponde à operação projeção da álgebra relacional. É usada para listar os atributos desejados no resultado de uma consulta. A cláusula from corresponde à operação produto cartesiano da álgebra relacional. Ela lista as relações a serem examinadas na avaliação da expressão. A cláusula where corresponde ao predicado de seleção da álgebra relacional. Consiste em um predicado envolvendo atributos de relações que aparecem na cláusula from. Uma típica consulta SQL tem a seguinte forma: SELECT A1, A2, ..., An FROM r1, r2, ..., rn [WHERE P] 3 1 2 Cada Ai representa um atributo e cada ri é uma relação. P é um predicado. Essa consulta é equivalente à expressão da álgebra relacional: A1, A2, ..., An (P (r1 x r2 x ...x rn)) A lista de atributos A1, A2, ..., An pode ser substituída por um (*) para selecionar todos os atributos (colunas) presentes nas tabelas da cláusula from. 59 A SQL forma o produto cartesiano das relações chamadas na cláusula from, executa uma seleção da álgebra relacional usando o predicado da cláusula where e, então, projeta o resultado para os atributos da cláusula select. Na prática, a SQL pode converter essa expressão em uma forma equivalente que pode ser processada mais eficientemente, mas para efeito didático iremos manter essa ordem de execução. Uma consulta completa pode ter as cláusulas abaixo, sendo que apenas as cláusulas SELECT e FROM são obrigatórias. O número que segue cada linha sugere a ordem de execução. SELECT A1, A2, ..., An FROM r1, r2, ..., rn [WHERE P] [GROUP BY A1, A2, ..., An] [HAVING Condição] [ORDER BY A1, A2, ..., An] 6 1 2 3 4 5 Vamos considerar uma primeira consulta simples, usando nosso esquema de exemplo. “Encontre os nomes de todos os clientes na relação clientes”. A consulta SQL pode ser escrita da seguinte forma: SELECT Nome FROM Clientes 4.3.2. Linhas (tuplas) duplicadas Em algumas situações, uma consulta SQL pode retornar uma relação que contenha tuplas (linhas) duplicadas. Nessa situação, inserimos a palavrachave distinct depois da cláusula select para eliminá-las. Aproveitando o exemplo anterior, a relação resultante poderá ter clientes que possuam o mesmo nome. Nesse caso, podemos eliminar essas duplicações, usando a cláusula distinct: SELECT DISTINCT Nome FROM Clientes 4.3.3. Predicados e ligações A SQL não tem uma representação da operação ligação natural. No entanto, uma vez que a ligação natural é definida em termos de um produto cartesiano, uma seleção e uma projeção, é relativamente simples escrever uma expressão SQL para uma ligação natural. 60 Ex.: “Encontre os nomes e cidades de clientes que possuam empréstimos em alguma agência”. Na SQL, isso pode ser escrito da seguinte forma: SELECT distinct Nome, Cidade FROM Clientes, Emprestimos WHERE Clientes.CodigoCli=Emprestimos.CodigoCli A SQL inclui os conectores and, or e not ; caracteres especiais: (, ), ., :, _, %,<, >, <= , >= , = , <>, +, - ,* e /; operador para comparação: between, como mostra o exemplo a seguir. “Selecionar todas as contas que possuam saldo entre 10000 e 20000”. SELECT NumeroCont FROM Depositos WHERE saldo BETWEEN 10000 AND 20000 Que equivale a consulta SELECT NumeroCont FROM Depositos WHERE saldo >= 10000 AND saldo <= 20000 A SQL inclui também um operador para comparações de cadeias de caracteres, o like. Ele é usado em conjunto com dois caracteres especiais: Por cento (%). Substitui qualquer subcadeia de caracteres. Sublinhado (_). Substitui qualquer caractere. Ex.: “Encontre os nomes de todos os clientes cujas ruas incluem a subcadeia “na””. SELECT distinct Nome FROM Clientes WHERE rua LIKE “ %na%” Ou também Ex.: “Encontre os nomes de todos os clientes cujas ruas finalizem com a subcadeia “na”, seguido de um caractere”. SELECT distinct Nome FROM Clientes WHERE rua LIKE “ %na” Para que o padrão possa incluir os caracteres especiais ( isto é, % , _ , etc...), a SQL permite a especificação de um caractere de escape. O caractere de escape é usado imediatamente antes de um caractere especial para indicar que o caractere especial deverá ser tratado como um caractere normal. Definimos o caractere de escape para uma comparação like, usando a palavra-chave escape. Para ilustrar, considere os padrões seguintes, que utilizam uma barra invertida como caractere de escape. Like “ ab\%cd%” escape “\” substitui todas as cadeias começando com “ ab%cd”; 61 Like “ ab\_cd%” escape “\” substitui todas as cadeias começando com “ ab_cd”. A procura por não-substituições em vez de substituições se dá por meio do operador not like. 4.3.4. Operações de conjunto A SQL inclui a operação de conjunto union que opera em relações e corresponde à operação da álgebra relacional. Uma vez que as relações são conjuntos, na união deslas, as linhas duplicadas são eliminadas. Ex. “Se quisermos saber todos os clientes que possuem empréstimo na agência de código “ 051””, fazemos: SELECT DISTINCT Nome FROM Clientes, Emprestimos WHERE Clientes.CodigoCli=Emprestimos.CodigoCli AND CodigoAg = “051” Da mesma forma, se quisermos saber “todos os clientes que possuem depósitos na agência de código “051”, fazemos: SELECT DISTINCT Nome FROM Clientes, Depositos WHERE Clientes.CodigoCli= Depositos.CodigoAg = “051” Depositos.CodigoCli AND "Para achar todos os clientes que possuam um depósito, um empréstimo, ou ambos, na agência de código “051”, fazemos: SELECT DISTINCT Nome FROM Clientes, Depositos WHERE Clientes.CodigoCli=epositos.CodigoCli AND Depositos.CodigoAg = “051” UNION SELECT distinct Nome FROM Clientes, Emprestimos WHERE Clientes.CodigoCli=Emprestimos.CodigoCli AND CodigoAg = “051” 4.3.5 Ordenando a exibição de tuplas A cláusula order by organiza o resultado de uma consulta em uma ordem determinada. Para listar em ordem alfabética todos os clientes do banco, fazemos: SELECT distinct Nome FROM Clientes ORDER BY Nome 62 Como padrão, SQL lista tuplas na ordem ascendente. Para especificar a ordem de classificação, podemos especificar asc para ordem ascendente e desc para descendente. Podemos ordenar uma relação por mais de um elemento. Como se segue: SELECT * FROM Emprestimos ORDER BY quantia DESC, CodigoAg ASC 4.3.6. Membros de conjuntos O conectivo in/not in testa os membros de conjunto, em que o conjunto é uma coleção de valores produzidos por uma cláusula select. Para ilustrar, considere a consulta “Encontre todos os clientes que possuem uma conta e não possuem empréstimo na agência “Princesa Isabel””. A consulta SQL pode ser escrita da seguinte forma: SELECT distinct Nome FROM Clientes WHERE Clientes.CodigoCli IN (SELECT CodigoCli FROM Depositos, Agencias WHERE depositos.CodigoAg = agencias.CodigoAg AND NomeAg = “Princesa Isabel”) AND Clientes.CodigoCli NOT IN (SELECT CodigoCli FROM Emprestimos, Agencias WHERE emprestimos.CodigoAg = agencias.CodigoAg AND NomeAg = “Princesa Isabel”) 4.3.7. Variáveis tuplas (renomeação) A renomeação sempre é necessária quando temos necessidade de usar a mesma tabela mais de uma vez na mesma consulta, assim como na operação renomear da álgebra relacional. Muitas vezes usamos este recurso com o objetivo de reduzir o tamanho das expressões SQL. A renomeação é feita usando a palavra reservada “AS”, após o nome da tabela na cláusula FROM, como mostra o exemplo a seguir. Ex: “encontre o nome e a cidade de todos os clientes que possuem depósito em qualquer agência”. SELECT distinct C.Nome, C.cidade FROM Clientes AS C, Depositos AS D WHERE C.CodigoCli = D.CodigoCli Uma vez que as relações Clientes e Depositos foram renomeadas para C e D, quaisquer referências a essas tabelas, na consulta, devem ser feitas a C e D, e 63 não mais aos nomes originais. Lembre-se da ordem de execução de uma consulta SELECT! 4.3.8. Comparação de conjuntos Considere a consulta “encontre todas as agências que possuem ativos maiores que alguma agência de Vitória”. Podemos escrever a seguinte expressão SQL: SELECT distinct Agencias.NomeAg FROM Agencias , Agencias AS ag WHERE agencias.ativos > ag.ativos AND ag.cidade = “Vitória” Uma vez que é uma comparação “maior que”, não podemos escrever a expressão usando a construção in. Observe também que, como houve necessidade de usar a mesma tabela (Agências) duas vezes na consulta, ela teve que ser renomeada. A mesma consulta acima poderia ser escrita usando o operador any (pelo menos um). Comparações do tipo >any, <any, >=any, <=any, =any são aceitos pela linguagem. A consulta anterior pode ser escrita da seguinte forma: SELECT NomeAg FROM Agencias WHERE ativos > any (SELECT ativos FROM agencias WHERE agencias.cidade = “Vitória”) Vamos modificando a consulta anterior levemente para encontrar todas as agências que possuem ativos maiores do que todas as agências de Vitória. A construção > all corresponde à frase “maior que todos”. A consulta fica como se segue: SELECT NomeAg FROM Agencias WHERE ativos > all (SELECT ativos FROM Agencias WHERE agencias.cidade = “Vitória”) Como o operador Any, o operador all pode ser usado como: >all, <all, >=all, <=all, =all e <> all. 4.3.9. Testando relações vazias A SQL possui um recurso para testar se uma subconsulta retorna alguma tupla. A construção exists retorna true se a subconsulta retornar alguma tupla. Para ilustrar, vamos escrever a consulta “Encontre todos os clientes 64 que possuem depósito e não possuem empréstimo na agência “Princesa Isabel” ”. SELECT Nome FROM Clientes WHERE EXISTS (SELECT * FROM Depositos, Agencias WHERE depositos.CodigoCli= clientes.CodigoCli AND agencias.CodigoAg = depositos.CodigoAg AND NomeAg = “Princesa Isabel”) WHERE NOT EXISTS (SELECT * FROM emprestimos, agencias WHERE emprestimos.CodigoCli= clientes.CodigoCli AND agencias.CodigoAg = emprestimos.CodigoAg AND NomeAg = “Princesa Isabel”) Atividade 04 Considere o esquema abaixo para construir as expressões seguintes, usando a linguagem SQL. Pessoas (CodPessoa, Nome, Cidade, Chefe) Chefe referencia Pessoas Empresas (CodEmpresa, Nome, Cidade) Trabalha (CodPessoa, CodEmpresa, Salario) CodPessoa referencia Pessoas CodEmpresa referencia Empresas 1. Consulte todas as pessoas que moram em Vitória. 2. Consulte todas as pessoas que trabalham na mesma cidade onde moram. 3. Consulte todas as pessoas que moram na mesma cidade do chefe. 4. Consulte todas as empresas que funcionam em cidades em que não moram pessoas cujo primeiro nome seja Maria (usar operações de conjunto). 5. Consulte todas as pessoas que não trabalham em Vitória e que ganham acima de R$2000,00 em ordem decrescente. 6. Consulte todas as pessoas que não trabalham na empresa cujos nomes comecem com “inf_”. O resultado deverá ser apresentado em ordem alfabética. 65 Atividade 05 Considere o esquema abaixo para construir as expressões seguintes, usando a linguagem SQL. Fabricante (codf, nomef) Automovel (coda, nomea, preço, codf) Codf referencia Fabricante Pessoa (codp, nomep) Venda (codp, coda, data, valor, cor) Codp referencia Pessoa Coda referencia Automovel 1. Liste as pessoas que compraram algum carro. 2. Liste as pessoas que compraram automóveis “Ford” (fabricante). 3. Liste as pessoas que não compraram “Ford”. 4. Liste as pessoas que compraram carro com ágio. O resultado deverá ser apresentado em ordem alfabética. 5. Liste as pessoas que compraram “Ford” e não compraram “Volks”. 4.3.10. Funções agregadas A SQL oferece a habilidade para computar funções em grupos de tuplas, usando a cláusula group by. O(s) atributo(s) dado(s) na cláusula group by são usados para formar grupos. Tuplas com o mesmo valor em todos os atributos na cláusula group by são colocados em um grupo. Funções agregadas: Média: AVG Mínimo: MIN Máximo: MAX Soma: SUM Contar: COUNT Para ilustrar, considere as consultas “ Encontre o saldo médio das contas em cada agência” SELECT NomeAg, AVG(Depósitos.saldo) AS Saldo_Medio FROM Depositos, Agencias WHERE Depositos.CodigoAg = Agencias.CodigoAg GROUP BY NomeAg “Encontre a quantidade de depositantes de cada agência” SELECT NomeAg, COUNT(distinct Nome) AS Qtd_Clientes FROM Depositos, Agencias WHERE Depositos.CodigoAg = Agencias.CodigoAg GROUP BY NomeAg 66 Note que nesta última consulta é importante a existência da cláusula distinct, pois um cliente pode ter mais de uma conta em uma agência e deverá ser contado uma única vez. “Encontre o maior saldo de cada agência” SELECT NomeAg, MAX(Depositos.saldo) AS Maior_Saldo FROM Depositos, Agencias WHERE Depositos.CodigoAg= agencias.CodigoAg GROUP BY NomeAg Às vezes é útil definir uma condição que se aplique a grupos em vez de tuplas. Por exemplo, poderíamos estar interessados apenas em agências em que a média dos saldos seja maior que R$1200,00. Essa condição será aplicada a cada grupo e não a tuplas simples e é definida pela cláusula having. Podemos escrever essa expressão SQL assim: SELECT NomeAg, AVG(Depositos.saldo) AS Saldo_Medio FROM Depositos GROUP BY NomeAg HAVING AVG(saldo)>1200 Às vezes, desejamos tratar a relação inteira como um grupo simples. Nesses casos, não usamos a cláusula group by. Para encontrar a média de saldos de todas as contas, escrevemos: SELECT AVG (Depositos.saldo) FROM Depósitos Atividade 06 Considere o esquema bancário para construir as expressões seguintes, usando a linguagem SQL. 1) Selecione todos os clientes que possuem contas em agência(s) que possui(em) o maior ativo. 2) Selecione o total de agências por cidade, classificado por cidade. 3) Selecione, por agências, o(s) cliente(s) com o maior saldo. 4) Selecione o valor médio de empréstimos efetuados por cada agência, em ordem crescente das cidades onde essas agências se situam. 5) Selecione a(s) agência(s) que possui(em) a maior média de quantia emprestada. 6) Selecione todas as agências situadas fora de Vitória que possuem a média de depósitos maior do que alguma agência localizada em Vitória. 7) Selecione o menor saldo de clientes, por agências. 8) Selecione o saldo de cada cliente, caso ele possua mais de uma conta no banco. 67 4.3.11. Removendo linhas de uma tabela O comando Delete é usado para remover tuplas em uma dada relação. Lembre-se que só podemos remover tuplas inteiras, não podemos remover valores apenas em atributos particulares. Sintaxe: DELETE FROM r [WHERE P] Onde r representa uma relação e P um predicado. Note que o comando delete opera em apenas uma relação. O predicado da cláusula where pode ser tão complexo quanto o predicado where do comando select. Ex1.: Removendo todas as tuplas de empréstimo. DELETE FROM emprestimos Ex2.: Remover todos os depósitos de “joão” DELETE FROM Depositos WHERE depositos.CodigoCli in (SELECT CodigoCli FROM Clientes WHERE Nome=”joão”) Ex3.: Remover todos os empréstimos com números entre 1300 e 1500. DELETE FROM Emprestimos WHERE numero between 1300 AND 1500 Ex4.: Remover todos os depósitos de agências localizadas em “Vitória”. DELETE FROM Depositos WHERE depositos.CodigoAg in (SELECT CodigoAg FROM Agencias WHERE cidade=”Vitoria”) 4.3.12. Inserindo linhas em uma tabela Para inserir um dado em uma relação, ou especificamos uma tupla para ser inserida ou escrevemos uma consulta cujo resultado seja um conjunto de tuplas a serem inseridas. Obviamente, os valores dos atributos para tuplas inseridas precisam ser membros do mesmo domínio do atributo. Sintaxe: INSERT INTO r (A1, A2, ..., An) VALUES (V1, V2, ..., Vn) Onde r representa uma relação A atributos e V valores a serem inseridos. 68 Suponha que desejamos inserir um novo depósito de João (código = 1), cujo valor seja R$1200,00, na conta 9000 da agência de código=2. Para isso, fazemos o seguinte comando: INSERT INTO depositos (CodigoAg, NumeroCont, CodigoCli, saldo) VALUES (2,9000,1,1200) Podemos querer também inserir tuplas baseadas no resultado de uma consulta. Suponha que desejemos inserir todos os clientes que possuam empréstimos na agência “Princesa Isabel” na relação depósitos, com um saldo de R$200,00. INSERT INTO Depositos (CodigoAg, NumeroCont, CodigoCli, saldo) SELECT emprestimos.CodigoAg, NumeroEmp, CodigoCli, 200 FROM Emprestimos, Agencias WHERE emprestimos.CodigoAg=agencias.CodigoAg AND NomeAg=”Princesa Isabel” 4.3.13. Atualizando valores Em certas situações, podemos desejar mudar valores em tuplas. Nesse caso, o comando update deve ser aplicado. Sintaxe: UPDATE r SET a1 = v1, a2 = v2, ..., an = vn [WHERE p] Em que r representa uma relação, a atributos, p predicado e v os novos valores para os respectivos atributos. Suponha que esteja sendo feito o pagamento de juros e que sejam acrescentados 5% em todos os saldos. Escrevemos UPDATE Depositos SET saldo = saldo * 1.05 Suponha que todas as contas com saldo superior a R$10000,00 recebam aumento de 6% e as demais de 5%. UPDATE Depositos SET saldo = saldo * 1.06 WHERE saldo >10000 UPDATE Depositos SET saldo = saldo * 1.05 WHERE saldo<=10000 A cláusula where pode conter uma série de comandos select aninhados. Considere, por exemplo, que todas as contas de pessoas que possuem empréstimos no banco terão acréscimo de 1%. UPDATE Depositos SET saldo = saldo * 1.01 WHERE CodigoCli IN (SELECT CodigoCli FROM emprestimos) 69 4.3.14. Valores Nulos É possível para tuplas inseridas em uma dada relação atribuir valores a apenas alguns atributos do esquema. Os atributos restantes são designados como nulos. Considere a expressão cujo objetivo é o de incluir uma nova agência: INSERT into Agencias (CodigoAg, NomeAg, CidadeAg, ativos) VALUES (2,’Centro’,’Vitória’,null) Nesse caso, está sendo atribuído o valor nulo para o atributo “ativos”. A mesma consulta poderia ser reescrita omitindo esse atributo. Nesse caso, automaticamente ele assumiria o valor nulo. INSERT into Agencias (CodigoAg, NomeAg, CidadeAg) VALUES (2,’Centro’,’Vitória’) A palavra chave null pode ser usada em um predicado para testar se um valor é nulo. Assim, para achar todos os clientes que aparecem na relação empréstimos com valores nulos para quantia, escrevemos: SELECT distinct Nome FROM Clientes, Emprestimos WHERE Clientes.CodigoCli = Emprestimos.CodigoCli AND Quantia IS NULL O predicado is not null testa a ausência de um valor nulo. 70 Atividade 07 Considere o esquema abaixo para construir as expressões seguintes, usando a linguagem SQL. Pessoas (CodPessoa, Nome, Cidade, Chefe) Chefe referencia Pessoas Empresas (CodEmpresa, Nome, Cidade) Trabalha (CodPessoa, CodEmpresa, Salario) CodPessoa referencia Pessoas CodEmpresa referencia Empresas Observação: Estas atividades foram elaboradas para exercitar os comandos de atualização. Desconsidere a integridade referencial dos dados. 1. Exclua todas as pessoas que possuem salario = R$1000,00. 2. Exclua todas as pessoas que trabalham em empresas situadas em Vitória. 3. Inclua na empresa de código “01”, com um salário= R$100,00, todos os moradores de Vitória 4. Uma determinada empresa de código “x” vai contratar todos os funcionários da empresa de código “y” que ganham acima de R$1000,00, dando um aumento de salário de 10%. Faça comando(s) SQL para que tal transação seja efetuada. Obs: As pessoas serão remanejadas. 5. Uma determinada empresa de código “xyz” quer contratar todos que moram em Vitória e estão desempregados. Serão contratados com salário = R$200,00. Faça comando(s) SQL para efetuar tal transação. 6. Faça um comando SQL para ajustar o salário de todos os funcionários da empresa “Campana” em 5%. 7. Todas as pessoas que moram em Colatina e trabalham na empresa “Campana” deverão se mudar para Vitória, devido aos requisitos do diretor da empresa. Faça comando(s) SQL para efetivar a atualização da cidade. 4.3.15. Definição de dados O conjunto de relações de um Banco de Dados precisa ser especificado ao sistema por meio de uma linguagem de definição de dados (DDL). A SQL DDL permite a especificação não apenas de um conjunto de relações, mas também de informações sobre cada relação, incluindo: O esquema para cada relação; O domínio de valores associados a cada atributo; O conjunto de índices a ser mantido para cada relação; Restrições de integridade; A estrutura física de armazenamento de cada relação no disco. 71 4.3.16. Tipos de Domínios da Linguagem SQL A linguagem SQL inclui diversos tipos de domínios, conforme lista abaixo [SILBERSCHATZ, 2006]: Char(n): cadeia de caracteres de tamanho fixo, igual a n, definido pelo usuário; Varchar(n): cadeia de caracteres de tamanho variável, no máximo igual a n, definido pelo usuário; Int: inteiro (subconjunto finito dos inteiros que depende do equipamento). Smallint: inteiro pequeno (um subconjunto do domínio dos inteiros que depende do equipamento); Numeric(p,d): número de ponto fixo cuja precisão é definida pelo usuário. O número consiste de p dígitos , sendo que d dos p dígitos estão à direita do ponto decimal; Real: números de ponto flutuante cuja precisão depende do equipamento em questão; Float(n): número de ponto flutuante com a precisão definida pelo usuário em pelo menos n dígitos; Date: calendário contendo um ano (com quatro dígitos), mês e dia do mês; Time: representa horário, em horas, minutos e segundos. Uma relação SQL é definida usando a instrução CREATE TABLE. CREATE TABLE r (A1 D1, ..., An Dn) Em que r é uma relação, cada Ai é o nome de um atributo no esquema de relação r e Di é o tipo de dados de valores no domínio de atributo Ai. O comando create table inclui opções para especificar certas restrições de integridade, conforme veremos adiante. A relação criada acima está inicialmente vazia. O comando insert poderá ser usado para carregar os dados para uma relação. Para remover uma relação de banco de dados SQL, usamos o comando drop table, que remove todas as informações sobre a relação retirada do banco de dados. DROP TABLE r Ex. : para excluir a relação Depósitos, podemos escrever a seguinte expressão SQL. DROP TABLE Depositos 72 O comando alter table é usado para alterar a estrutura de uma relação existente. Ao alterar a estrutura de uma tabela, é possível incluir novos campos, excluir campos existentes ou incluir restrições, a exemplo de chaves primárias e estrangeiras. Sintaxe: alter table r <add,drop> A [dominio, integridade] Em que r é a relação a ser alterada; add, adiciona um atributo a r e drop, remove um atributo de r. Ex.: Incluindo uma coluna de CPF na tabela clientes. Não será possível incluir um cliente sem CPF, uma vez que foi definido como NOT NULL. ALTER TABLE Clientes ADD cpf NUMERIC(11,0) NOT NULL 4.3.17. Integridade Quando se fala em manter a integridade de dados, considera-se não só a Integridade Física dos arquivos portadores do banco de dados, como também manutenção da qualidade dos dados armazenados em termos de precisão e consistência. As restrições de integridade fornecem meios para assegurar que mudanças feitas no banco de dados por usuários autorizados não resultem na perda da consistência dos dados. São vários os tipos de integridade. Eles costumam ser classificados da seguinte forma: Integridade de Domínio Domínio é uma lista de valores que precisa estar associada a todo atributo. Constitui a forma mais elementar de restrição de integridade. É facilmente testado pelo sistema cada vez que um novo item de dado é inserido no banco de dados. Integridade de Vazio Especifica se um campo de uma coluna pode ou não assumir valor nulo. Não pode permitir que os campos com entrada obrigatória assumam valores nulos. Integridade de Chaves Especifica a unicidade dos valores para a chave primária e candidatas. Integridade Referencial Frequentemente desejamos assegurar que um valor que aparece em uma relação para um dado conjunto de atributos, apareça também para um certo conjunto de atributos em outra relação, o que se denomina Integridade Referencial. A existência de uma chave estrangeira impede que anomalias ocorram em função de alterações executadas no banco de dados, conforme elencadas abaixo: 73 Ao incluir uma linha na tabela que contém a chave estrangeira, o valor inserido tem que fazer parte da tabela em que ela é chave primária. O único valor diferente desse que é permitido é o valor nulo, quando for possível; Ao excluir uma linha da tabela que contém chave primária referenciada por outras tabelas, pode-se implementar os seguintes cenários: excluir em cascata as linhas nas tabelas relacionadas em que se encontram as chaves estrangeiras referentes a essa chave primária ou impedir que a exclusão seja feita; Ao alterar o valor da chave primária referenciada por outras tabelas, pode-se implementar os seguintes cenários: alterar em cascata os valores das chaves estrangeiras nas tabelas relacionadas ou impedir que a alteração seja feita; Ao se alterar o valor da chave estrangeira, deve-se ter garantia de que o novo valor esteja constante na tabela em que ela é chave primária. Se não for, haverá bloqueio na alteração. 4.3.18. Implementando Integridade Referencial em SQL A SQL original padrão não incluiu instruções para especificar chaves estrangeiras. Um subsequente “recurso de aperfeiçoamento de integridade” foi aprovado como uma adição ao padrão. Esse recurso permite a especificação de chaves primárias, candidatas e estrangeiras como parte da instrução create table. A cláusula primary key da instrução create table inclui uma lista de atributos que compreende a chave primária. A cláusula unique da instrução create table inclui uma lista de atributos que compreende a chave candidata. A cláusula foreign key da instrução create table inclui uma lista de atributos que compreende a chave estrangeira e o nome da relação referida pela chave estrangeira. Criando as relações clientes, agências e depósitos para o esquema do banco. CREATE TABLE Clientes (CodigoCli int not null, nome char(30) not null, rua char(30), cidade char(30), cpf numeric(11,0), PRIMARY KEY (CodigoCli) UNIQUE (CPF)) CREATE TABLE Agencias (codigoAg int not null, NomeAg char(30), CidadeAg char(30), PRIMARY KEY (CodigoAg)) CREATE TABLE Depositos (codigoAg int not null, 74 NumeroCont char(10) not null, CodigoCli int not null, saldo real, PRIMARY KEY (codigoAg,NumeroCont), FOREIGN KEY (CodigoCli) REFERENCES Clientes, FOREIGN KEY (codigoAg) REFERENCES Agencias, CHECK (Saldo >=0) ) A cláusula Check garante integridade aos valores dos atributos e pode fazer referência, inclusive, a valores de atributos em outras tabelas. 75 Atividade 08 Dados os esquemas abaixo, faça comandos SQL DDL padrão para criar as estruturas das tabelas, usando o tipo de dados que melhor se aplique a cada atributo e impondo integridade referencial. a) Alunos (CodigoAl, NomeAl, CodigoCurso, Telefone, CoeficienteRendimento) CodigoCurso referencia Cursos Cursos (CodigoC, NomeC) Disciplinas (CodigoDisc, CodigoCurso, NomeDisc) CodigoCurso referencia Cursos Historico (CodigoAl, CodigoDisc, Periodo, Nota) CodigoAl referencia Alunos CodigoDisc referencia Disciplinas Pre_Requisitos (CodigoDiscPos, CodigoDiscPre) CodigoDiscPos referencia Disciplinas CodigoDiscPre referencia Disciplinas b) Clientes (CodCliente, NomeCliente, Telefone, DtNascimento) Filmes (CodFilme, NomeFilme, Lancamento, DtAquisicao, CodClasse) CodClasse referencia Classes Fitas (CodFilme, NumeroFita, Dublada) CodFilme referencia Filmes Locacoes (CodFilme, NumeroFita, CodCliente, DtLocacao, DtDevolucao, VlrLocacao, Multa) (CodFilme, NumeroFita) referencia Fitas CodCliente referencia Clientes Reservas (Codfilme, CodCliente, DtReserva, Situacao) CodFilme referencia Filmes CodCliente referencia Clientes Classes (CodClasse, Nome, Valor) Obs.: Considere a entrada obrigatória de todos os campos, exceto os campos: telefones, data de devolução de fitas e valor de multa. Não permita valores diferentes de ‘S’ ou ‘N’ nos campos “Lançamento”, na tabela “Filmes”, e “Dublada”, na tabela “Fitas”. 76 REFERÊNCIAS NAVATHE, E. Sistemas de Bancos de dados. 4. ed. São Paulo: Pearson Addison Wesley, 2005. DATE, C. J. Bancos de dados: introdução aos sistemas de bancos de dados. 8. ed. Rio de Janeiro: Campus, 2004. SILBERSCHATZ, Abraham. Sistema de banco de dados. 5. ed. São Paulo: Campus, 2006. CHEN, Peter. Modelagem de Dados - A abordagem EntidadeRelacionamento para Projeto Lógico. São Paulo: Makron Books, 1990. HEUSER, Carlos Alberto. Projeto de Banco de Dados. Porto Alegre: Sagra Luzzato, 2004. FALBO, R. A. Projeto de Sistemas – Notas de Aula. Disponível em http://www.inf.ufes.br/%7Efalbo/disciplinas/projeto.html. Acesso em 23 de março de 2009. 77