BANCO DE DADOS

O crescimento do uso de computadores em aplicações industriais, administrativas e científicas conduziu a mecanização de grandes volumes de dados. No final dos anos 50 e início dos anos 60, iniciou-se a coleta e armazenamento de dados em arquivos de computadores. A cada nova necessidade surgida, um novo arquivo era gerado. Diferentes grupos dentro de uma mesma organização desenvolviam suas próprias aplicações, coletando e mantendo arquivos particulares. Arquivos e programas eram projetados um para o outro.

Verificou-se então, o início da conscientização sobre a necessidade de uma gerência de dados e aplicações centralizada a partir de dificuldades da alta gerência em obter informações necessárias para suporte às decisões, isto porque: para atender a um pedido, era necessário criar um programa de modo a acessar vários arquivos em formatos diferentes. Normalmente o pedido era suspenso porque ou não valia o custo envolvido nesta operação, ou porque a informação era obtida tardiamente. Outro problema grave era a falta de integridade das informações, isto devido a duplicidade de informação armazenada ocasionando emissão de relatórios conflitantes.

Finalmente as organizações perceberam que os dados eram um recurso muito valioso e que deveria ser gerenciado adequadamente. Para ilustrar melhor o problema acima citado, consideremos o exemplo a seguir.

A empresa POUPE é uma empresa bancária de poupança que mantém informações sobre todos os clientes e contas de poupança (além de outras informações específicas da empresa). Estas contas são mantidas em arquivos permanentes do sistema. Além disso, o sistema possui um determinado número de programas de aplicação que permitem a manipulação dos arquivos incluindo : um programa para crédito/débito em conta, um programa para incluir novas contas, um programa para recuperar o saldo de uma conta e um programa para gerar extratos mensais.

Supondo-se que, em função de novas leis governamentais a POUPE resolva atuar também na área de contas correntes. Como resultado novos arquivos e programas são criados para manter informações sobre as novas contas correntes. Desse modo, a medida que o tempo passa, novos arquivos e programas de aplicação são adicionados ao sistema.

Agora, suponha que um funcionário necessite saber o nome dos clientes que residem na área da cidade onde o CEP é 80234. O funcionário então solicita ao CPD a relação. Como esta não é uma requisição usual, e que não foi prevista quando o sistema foi projetado, não há nenhum programa de aplicação para gerar esta lista. Há no entanto um programa que gera a lista de todos os clientes. Há duas alternativas para resolver o problema: ou pega a lista completa e solicita a uma de suas secretárias para obter manualmente a informação necessária ou, aloca um programador para escrever tal programa. Naturalmente, ambas são soluções insatisfatórias do ponto de vista de tempo de resposta.

Dias mais tarde, o funcionário solicita ao CPD uma nova lista, agora contendo somente os clientes que possuam saldo superior a um determinado valor, com vistas a concepção de conta corrente com limite de crédito. Novamente o funcionário vê-se diante das opções anteriores, das quais nenhuma é satisfatória. Suponhamos que, a POUPE, expandindo seu negócio, abre novas agências na mesma cidade (ou em outras cidades). Objetivando melhorar a performance global do sistema e obter um tempo de resposta mais rápido, é permitido que múltiplos usuários realizem operações de depósito e retirada simultâneamente. Esta facilidade poderá resultar em dados inconsistentes.

Por exemplo, considere a conta 12345-5 pertencente a João e Maria (conta conjunta), que possui saldo de Cr$ 500,00. Se ambos realizarem saques desta conta ao mesmo tempo, a partir de agências diferentes respectivamente de Cr$ 50,00 e Cr$100,00 , o resultado das operações poderá levar a conta a um estado inconsistente (saldo de Cr$ 450,00, ou Cr$ 400,00 ou quem sabe Cr$ 350,00). De forma a prevenir-se contra esta possibilidade, alguma forma de supervisão deve ser mantida no sistema. Uma vez que os dados podem ser acessados por muitos programas de aplicações diferentes, que não foram previamente coordenados, tal supervisão é muito difícil de ser obtida.

Além de problemas de dificuldade no acesso a dados, e de múltiplos usuários (acima ilustrados), o sistema pode apresentar outros problemas tais como:

- Redundância de dados e inconsistência : o endereço e telefone de determinado cliente podem aparecer em um arquivo que contém registros de contas de poupança e em outro que contém registros de contas correntes. Esta redundância causa um maior custo de armazenamento e acesso,bem como uma potencial inconsistência de dados (ex. se o endereço de um cliente muda, a alteração pode ser efetuada somente nos registros de contas de poupança e não nos registros de contas correntes);

- Isolamento de dados: uma vez que os dados estão espalhados em vários arquivos e os arquivos podem estar em diferentes formatos, é difícil escrever novos programas de aplicação para a retirada conveniente dos dados;

- Problemas de segurança: nem todo usuário deve ser autorizado a acessar todos os dados (ex. setor de folha de pagamento pode ver somente aqueles registros que contenham informações sobre os funcionários do banco; enquanto os caixas podem acessar somente informações relativas aos clientes do banco). Uma vez que os programas de aplicação são adicionados ao sistema de forma empírica, é difícil garantir tais restrições de segurança;

- Problemas de integridade: os valores armazenados devem satisfazer a determinados tipos de restrições de consistência (ex. o saldo de uma conta especial, nunca deve ultrapassar o limite). Estas restrições podem ser apropriadas aos programas de aplicações. Entretanto, quando novas restrições são inseridas, fica difícil alterar os programas para garantí-las.

Estas dificuldades induziram ao desenvolvimento de sistemas gerenciadores de banco de dados.

Um sistema gerenciador de banco de dados é formado por uma coleção de arquivos inter-relacionados e um conjunto de programas, que permitem a diversos usuários acessar e modificar esses arquivos.

Um propósito central de um sistema de banco de dados é o de proporcionar aos usuários uma visão "abstrata" dos dados. Isto é, o sistema esconde certos detalhes de como os dados são armazenados ou mantidos. Porém para que o sistema seja utilizável, os dados precisam ser recuperados eficientemente.

A preocupação com eficiência leva a concepção de estruturas de dados complexas para a representação dos dados de um BD. Porém, uma vez que sistemas de BD são frequêntemente usados por pessoal sem treinamento na área de computação, esta complexidade precisa ser escondida dos usuários do sistema de BD. Isto é conseguido definido-se diversos níveis de abstração pelos quais o banco de dados pode ser visto. São eles:

- Nível físico: este é o nível mais baixo de abstração, no qual se descreve COMO os dados são atualmente armazenados. Neste nível estruturas complexas, de baixo nível, são descritas em detalhe;

- Nível conceitual: este é o nível no qual se descreve TODOS os dados armazenados na base de dados. Este nível é usado pelos administradores de banco de dados, que devem decidir qual informação deve ser mantida no banco de dados;

- Nível de visão: este é o nível mais alto de abstração, obtido a partir do nível conceitual,onde está descrito o subconjunto de dados utilizados por uma aplicação específica.

Uma vez definidos os três níveis de abstração, a capacidade de modificar-se a definição de um nível, sem afetar a definição de um nível mais alto, é denominada de independência de dados. Há dois tipos de independência de dados:

- independência de dados física: é a capacidade de modificar-se o esquema físico sem necessitar reescrever os programas de aplicação. Estas modificações são necessárias ocasionalmente para melhorar a performance do sistema.

- independência de dados lógica: é a capacidade de modificar-se o esquema conceitual sem a necessidade de re-escrever os programas de aplicação. Estas modificações são necessárias sempre que a estrutura lógica do banco de dados é alterada (ex. adição de registros de contas de open-market no exemplo do banco POUPE).

O conceito de independência de dados é similar em muitos aspectos ao conceito de tipos abstratos de dados nas linguagens modernas de programação. Ambos escondem do usuário os detalhes de implementação, permitindo-lhes concentrarem-se na estrutura geral em vez de detalhes de implementação de nível mais baixo.

Outro aspecto relacionado aos bancos de dados que deve ser considerado é o conjunto de tipos de estrutura de dados oferecidos ao nível lógico e físico.

Por estrutura lógica entende-se o conjunto de entidades e relacionamentos necessários ao modelamento de um dado objeto. Por estrutura física entende-se a forma de mapeamento das estruturas lógicas nos dispositivos físicos de armazenamento.

Do ponto de vista do usuário, a estrutura lógica define o tipo de banco de dados. As estruturas mais comuns são do tipo: relacional, hierárquica, em rede e entidade-relacionamento.

As estruturas físicas, por seu lado, estão relacionadas com o gerenciamento do espaço de armazenamento e sua escolha influe substancialmente no desempenho do banco de dados.

Dois tipos de linguagens são disponíveis em um BD: uma linguagem para descrição de dados (DDL), e outra para manipulação de dados (DML). Com a primeira são definidos os esquemas externo e conceitual, e com a segunda, é utilizada para o armazenamento, modificação, eliminação e recuperação de dados armazenados. Note-se que as linguagens de descrição e manipulação de dados são dependentes do modelo lógico utilizado no banco de dados.

Há dois tipos básicos de DML:

- DML procedimental, que requer do usuário a especificação de quais dados são desejados e como chegar até eles;

- DML não procedimental, que requer do usuário a especificação de quais dados são desejados, sem especificar como chegar até eles.

DMLs não procedimentais são geralmente mais fáceis de aprender e usar do que as DMLs procedimentais. Entretanto, uma vez que um usuário não tem que especificar como chegar até os dados, essas linguagens podem gerar código que não seja tão eficiente como aquele produzido por linguagens procedurais. Esta dificuldade pode ser sanada pelo uso de várias técnicas de otimização.

Uma QUERY é um pedido de consulta de informação. A parte de uma DML que envolve consulta a informação é denominada linguagem de consulta. Apesar de tecnicamente incorreto, é comum o uso dos termos linguagem de consulta e linguagem de manipulação de dados como sinônimos.

Tipicamente os bancos de dados requerem grandes quantidades de espaço de armazenamento. Banco de dados corporativos normalmente são medidos em termos de gigabytes de dados ( 1Gbyte = 1000 Megabytes = 1 bilhão de bytes). Uma vez que a memória principal dos computadores não pode guardar toda esta informação, ela é armazenada em discos. Os dados são transportados entre os discos e a memória principal conforme necessário. Visto que o movimento dos dados de/para o disco é relativamente lento, se comparado à velocidade da unidade central de processamento dos computadores (CPU), é imperativo que o sistema de banco de dados estruture os dados de modo a minimizar a necessidade de movimentação de dados entre o disco e a memória principal.

O objetivo de um sistema de banco de dados é simplificar e facilitar o acesso aos dados. Visões de alto nível ajudam a realizar isto. Um gerenciador de banco de dados, é um módulo que proporciona a interface entre os dados de baixo nível armazenados no banco de dados e os programas de aplicação e consultas submetidas ao sistema. O gerenciador de banco de dados é responsável pelas seguintes tarefas:

- Interação com o gerenciador de arquivos: os dados básicos estão armazenados em disco, utilizando o sistema de arquivos que normalmente é integrante de um sistema operacional convencional. O SGBD traduz as várias instruções DML em comandos de baixo nível do sistema de arquivos. Assim o SGBD é o responsável pelo real armazenamento, consulta e atualização dos dados no banco de dados.

- Garantia de integridade: os valores de dados armazenados no banco de dados precisam satisfazer certos tipos de restrições de consistência (ex. saldo de uma conta bancária nunca deve estar abaixo de uma importância pré-especificada; o número de horas trabalhadas em uma semana não deve exceder um número específico, etc.). Estes limites precisam ser especificados explicitamente pelo administrador do banco de dados. Uma vez que isto tenha sido feito, o SGBD pode verificar se atualizações no BD resultarão em violação de quaisquer dessas restrições e, se assim for, uma ação apropriada precisa ser tomada.

- Garantia de segurança: nem todo usuário do banco de dados necessita ter acesso a todo conteúdo do BD. É função do SGBD assegurar estes requisitos.

- Recuperação e backup: um computador, como qualquer outro dispositivo mecânico ou elétrico, está sujeito a falhas. Há uma grande variedade de causas para tais falhas, incluindo nestas, quebras de discos, falhas de alimentação elétrica e erros de software. Em cada caso, informação relativa ao BD é perdida, sendo responsabilidade do SGBD detectar tais falhas e restaurar o BD ao estado anterior (consistente). Isto é realizado a partir da ativação de vários procedimentos de recuperação e backup.

- Controle de concorrência: quando diversos usuários atualizam o BD concorrentemente, a consistência dos dados pode não ser preservada. O SGBD é responsável pelo controle da interação entre os usuários concorrentes

Cabe salientar que alguns SGBD, concebidos especialmente para uso em computadores pessoais, não possuem diversas facilidades relacionadas. Isto permite a implementação de gerenciadores de dados menores que requerem menos recursos físicos, especialmente memória principal e têm menor custo de implementação.

Por exemplo, muitos sistemas pequenos impõe como restrição que somente um usuário por vez pode acessar o banco de dados. Outros deixam as tarefas de backup, recuperação e garantia de segurança para o usuário. Apesar desta abordagem de baixo custo e poucas facilidades seja suficiente para pequenos bancos de dados pessoais, é inadequada para as necessidades de uma empresa de médio ou grande porte.

Uma das principais razões para se ter um sistema gerenciador de banco de dados é possuir um controle central dos dados e dos programas que acessam os dados. A pessoa que tem tal controle sobre o sistema é chamada administrador de banco de dados (DBA). As principais funções do DBA incluem:

- Definição e criação do esquema : escrever um conjunto de definições que são traduzidas pelo compilador DDL para um conjunto de tabelas que são permanentemente armazenadas no dicionário de dados.

- Definição da estrutura de armazenamento e do método de acesso: é realizada escrevendo-se um conjunto de definições que são traduzidas pelo compilador da linguagem de definição de armazenamento de dados.

- Modificação da organização física e do esquema: estas mudanças embora relativamente raras, consistem em alterar-se as tabelas internas do sistema (ex. dicionário de dados).

- Concessão de autorização para acesso a dados: determinar os tipos de acessos a dados aos vários usuários do banco de dados.

- Especificação de restrições de integridade: estas restrições são mantidas em uma estrutura especial do sistema, a qual é consultada pelo gerenciador de banco de dados sempre que uma atualização acontece no sistema.

Um objetivo básico do sistema de banco de dados é proporcionar um ambiente para a consulta de informações e para o armazenamento de novas informações ao banco de dados.

Há basicamente 4 tipos de usuários de um sistema de banco de dados e são diferenciados pela maneira que se propõem a interagir com o sistema.

- Programadores de aplicações: estes são profissionais de computação que interagem com o sistema usando comandos de DML, que na realidade são programas escritos em linguagem principal (host - Cobol, PL/1, Pascal, C, etc.). Estes programas são normalmente chamados de programas de aplicação (ex. prog.que gera cheques de pagto.).

- Usuários ocasionais: são usuários sofisticados, que interagem com o sistema sem escrever programas. Em vez disso formulam requisições escrevendo suas consultas em linguagem de consulta (SQL). Cada uma dessas consultas é submetida a um processador de consultas, cuja função é quebrar um comando DML em instruções que o gerenciador de banco de dados entenda.

- Usuários simples: são usuários não sofisticados que interagem com o sistema utilizando-se dos programas de aplicação existentes.

- Usuários especializados: são usuários sofisticados que escrevem aplicações de banco de dados não adaptáveis aos padrões tradicionais de processamento de dados. Por exemplo, usuários de sistemas CAD, bases de conhecimentos e sistemas especialistas que armazenam dados com tipos de dados complexos (dados gráficos, dados de áudio, etc.).

Um sistema de banco de dados é dividido em módulos que tratam cada uma das responsabilidades do sistema como um todo. Algumas das funções do sistema podem ser providas pelo sistema operacional do computador. Em muitos casos, o sistema operacional proporciona somente os serviços mais básicos e o sistema de banco de dados deve ser construído sobre esta base. Assim, o projeto de um sistema de banco de dados deve considerar a interface entre o banco de dados e o sistema operacional.

Um sistema de banco de dados consiste de um certo número de componentes funcionais que incluem:

- gerenciador de arquivos: gerencia a alocação de espaço de armazenamento em disco e as estruturas de dados usadas para representar a informação armazenada em disco;

- gerenciador do banco de dados: proporciona a interface entre os dados de baixo nível armazenados no BD e os programas de aplicação e consultas submetidas ao sistema;

- processador de consultas: traduz comandos de uma linguagem de consulta em instruções de baixo nível que o gerenciador de BD entenda. Além disso, um processador de consultas tenta transformar um pedido do usuário em outro equivalente, porém mais eficiente, encontrando assim, uma boa estratégia para a execução da consulta;

- pré-compilador DML: converte comandos DML embutidos em um programa de aplicação, para chamadas de rotinas da linguagem do host. O pré-compilador precisa interagir com o processador de consultas de forma a gerar código apropriado;

- compilador DDL: converte comandos DDL em um conjunto de tabelas contendo metadados. Estas tabelas são armazenadas no dicionário de dados.

Em adição, muitas estruturas de dados são necessárias como parte da implementação física do sistema incluindo:

- arquivos de dados: armazenam os dados propriamente ditos;

- dicionário de dados: armazena informações sobre a estrutura do BD e é bastante utilizado.

- índices: proporcionam acesso rápido aos ítens de dados com valores específicos.