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.