Você está na página 1de 246

Introduo

Um Sistema Gerenciador de Banco de Dados (SGBD) constitudo por um conjunto de dados associados a
um conjunto de programas para acesso a esses dados. O conjunto de dados, comumente chamado banco de
dados, contm informaes sobre uma empresa em particular. O principal objetivo de um SGBD proporcionar
um ambiente tanto conveniente quanto eficiente para a recuperao e armazenamento das informaes dos
bancos de dados.
Sistemas de banco de dados so projetados para gerir grandes volumes de informaes. O gerenciamento
de informaes implica a definio das estruturas de armazenamento de informaes e a definio dos
mecanismos para a manipulao dessas informaes. Ainda, um sistema de banco de dados deve garantir a
segurana das informaes armazenadas contra eventuais problemas com o sistema, alm de impedir tentativas
de acesso no autorizadas. Se os dados so compartilhados por diversos usurios, o sistema deve evitar a
ocorrncia de resultados anmalos.
A importncia da informao na maioria das organizaes que estabelece o valor do banco de dados
tem determinado o desenvolvimento de um grande conjunto de conceitos e tcnicas para a administrao eficaz
desses dados.
Objetivos de um Sistema de Banco de dados
Considere a rea de um banco responsvel por todas as informaes de seus cliente e de suas contaspoupana. Um modo de guardar as informaes no computador armazen-las em sistemas de arquivos
permanentes. Para permitir aos usurios a utilizao dessas informaes, o sistema deve apresentar um conjunto
de programas de aplicaes que tratam esses arquivos, incluindo:
Um programa para dbito e crdito na contabilidade.
Um programa para incluir novos registros na contabilidade.
Um programa para balano da contabilidade.
Um programa para gerar relatrios mensais.
Essas aplicaes foram desenvolvidas por programadores a fim de atender s necessidades das
organizaes bancrias.
Novos programas foram incorporados a esses sistemas para atender a necessidades que foram surgindo.
Por exemplo, suponha que novas regras sejam promulgadas pelo governo obrigando que os bancos ofeream
meios para a checagem de suas contas. Com isso, novos arquivos permanentes sero criados contendo dados
para checagem de todas as contas mantidas pelo banco e novos programas de aplicaes sero necessrios a fim
de adequar-se a nova situao, que de fato no foi originada pela caderneta de poupana, como o tratamento de
saldos negativos. Assim, conforme passa o tempo, mais arquivos e mais programas de aplicaes so adicionados
ao sistema.
O sistema de processamento de arquivos tpico que acabamos de descrever pode ser aceito pelos
sistemas operacionais convencionais. Registros permanentes so armazenados em vrios arquivos e diversos
programas de aplicao so escritos para extrair e gravar registros nos arquivos apropriados. Antes do advento
dos SGBDs, as organizaes usavam esses sistemas para armazenar informaes.
Obter informaes organizacionais em sistemas de processamento de arquivos apresenta numerosas
desvantagens:
Inconsistncia e redundncia de dados. J que arquivos e aplicaes so criados mantidos por diferentes
programadores, em geral durando longos perodos de tempo, comum que os arquivos possuam
formatos diferentes e os programas sejam escritos em diversas linguagens de programao. Ainda mais, a
mesma informao pode ser repetida em diversos lugares (arquivos). Por exemplo, o endereo e o
telefone de um cliente em particular pode aparecer tanto no arquivo de contas quanto no arquivo de
checagem de contas. Esta redundncia aumenta os custos de armazenamento e acesso. Ainda, pode
originar inconsistncia de dados; isto , as vrias cpias dos dados podero divergir ao longo do tempo.
74

Por exemplo, a mudana de endereo de um cliente pode refletir nos arquivos de contas, mas no ser
alterada no sistema como um todo.
Dificuldade de acesso aos dados. Suponha que um dos empregados da empresa precise de uma relao
com os nomes de todos os cliente que moravam em determinada rea de acidade cujo CEP 78733. O
empregado pede, ento, ao departamento de processamento de dados que crie tal relao. Como esse
tipo de solicitao no foi prevista no projeto do sistema no h nenhuma aplicao disponvel para
atende-la. No entanto, h uma aplicao para gerar a relao de todos os clientes da empresa. Assim, o
empregado tem duas alternativas: separar manualmente da lista de todos os clientes aqueles de que
necessita ou requisitar ao departamento de processamento de dados um programador para escrever o
programa necessrio. Ambas as alternativas so, obviamente, insatisfatrias. Suponha que o tal programa
seja escrito e que dias depois o mesmo empregado necessite selecionar os clientes que possuem saldo
superior a dez mil dlares. Como esperado, tal programa no existe. Novamente o empregado tem as
mesmas duas opes, nenhuma delas insatisfatria. O fato que um ambiente com um sistema de
processamento de arquivos convencional no atende s necessidades de recuperao de informaes de
modo eficiente. Sistemas mais efetivos (com respostas mais rpidas e adequadas) para a recuperao de
informaes precisam ser desenvolvidos.
Isolamento de dados. Como os dados esto dispersos em vrios arquivos, e estes arquivos podem
apresentar diferentes formatos, difcil escrever novas aplicaes para recuperao apropriada dos
dados.
Problema de integridade. Os valores dos dados atribudos e armazenados em um banco de dados devem
satisfazer certas restries para manuteno da consistncia. Por exemplo, o balano de uma conta
bancaria no pode cair abaixo de um determinado valor. Os programadores determinam o cumprimento
dessas restries por meio da adio de cdigo apropriado aos vrios programas de aplicaes.
Entretanto, quando aparecem novas restries difcil alterar todos os programas para increment-las. O
problema ampliado quando as restries atingem diversos itens de dados em diferentes arquivos.
Problemas de atomicidade. Um sistema computacional, como qualquer outro dispositivo mecnico ou
eltrico, est sujeito a falhas. Em muitas aplicaes crucial assegurar que, uma vez detectada uma falha,
os dados sejam salvos em seu ltimo estado consistente, anterior a ela. Considere um programa para
transferir 50 dlares da conta A para uma conta B. Se ocorrer falha no sistema durante sua execuo,
possvel que os 50 dlares sejam debitados da conta A sem serem creditados na conta B, criando um
estado inconsistente no banco de dados. Logicamente, essencial para a consistncia do banco de dados
que ambos, dbito e crdito, ocorram ou nenhum deles seja efetuado. Isto , a transferncia de fundos
deve ser uma operao atmica deve ocorrer por completo ou no ocorrer. difcil garantir essa
propriedade em um sistema convencional de processamento de arquivos.
Anomalias no acesso concorrente. Muitos sistemas permitem atualizaes simultneas nos dados para
aumento do desempenho do sistema como um todo e para melhores tempos de resposta. Nesses tipos
de ambiente, a interao entre atualizaes concorrentes pode resultar em inconsistncia de dados.
Suponha que o saldo de uma conta bancria A seja 500 dlares. Se dois clientes retiram fundos da conta
A (digamos 50 e 100 dlares, respectivamente), essas operaes, ocorrendo simultaneamente, podem
resultar em erro (ou gerar inconsistncia). Suponha que, na execuo dos programas, ambos os clientes
leiam o saldo antigo e retirem, cada um, seu valor correspondente, sendo o resultado armazenado. Os
dois programas concorrendo, ambos leem o valor 500 dlares, resultado, em 450 e 400 dlares,
respectivamente. Dependendo de qual deles registre seu resultado primeiro, o saldo da conta A ser 450
ou 400 dlares, em vez do valor correto de 350 dlares. Para resguardar-se dessa possiblidade, o sistema
deve manter algum tipo de superviso. Como os dados podem sofrer acesso de diferentes programas, os
quais no foram coordenados previamente, a superviso bastante dificultada.
Problemas de segurana. Nem todos os usurios de banco de dados esto autorizados ao acesso a todos
os dados. Por exemplo, em um sistema bancrio, os funcionrios do departamento pessoal devem ter
75

acesso apenas ao conjunto de pessoas que trabalham no banco. Uma vez que os programas de aplicao
so inseridos no sistema como um todo, difcil garantir a efetividade das regras de segurana.
Estas dificuldades, entre outras, provocaram o desenvolvimento dos SGBDs. A seguir mostraremos os
conceitos e algoritmos que foram desenvolvidos para os sistemas de banco de dados que resolvem os problemas
mencionados anteriormente. Uma aplicao tpica em banco de dados armazena um grande nmero de registros,
sendo que estes registros so frequentemente simples e pequenos.
Viso dos Dados
Um SGBD uma coleo de arquivos e programas inter-relacionados que permitem ao usurio o acesso
para consultas e alteraes desses dados. O maior benefcio de um banco de dados proporcionar ao usurio
uma viso abstrata dos dados. Isto , o sistema acaba por ocultar determinados detalhes sobre a forma de
armazenamento e manuteno desses dados.
Abstrao de Dados
Para que se possa usar um sistema, ele precisa ser eficiente na recuperao de informaes. Esta
eficincia est relacionada forma pela qual foram projetadas as complexas estruturas de representao desses
dados no banco de dados. J que muitos dos usurios dos sistemas de banco de dados no so treinados em
computao, os tcnicos em desenvolvimento de sistemas omitem essa complexidade desses usurios por meio
dos diversos nveis de abstrao de modo a facilitar a interao dos usurios com o sistema:
Nvel fsico. o mais baixo nvel de abstrao que descreve como esses dados esto de fato
armazenados. No nvel fsico, estruturas de dados complexas de nvel baixo so descritas em detalhes.
Nvel lgico. Este nvel mdio de abstrao descreve quais dados esto armazenados no banco de dados
e quais os inter-relacionamentos entre eles. Assim, o banco de dados como um todo descrito em
termos de um nmero relativamente pequeno de estruturas simples. Embora a implementao dessas
estruturas simples no nvel lgico possa envolver estruturas complexas no nvel fsico, o usurio do nvel
lgico no necessariamente precisa estar familiarizado com essa complexidade. O nvel lgico de
abstrao utilizado pelos administradores do banco de dados que precisam decidir quais informaes
devem pertencer ao banco de dados.
Nvel de viso. O mais alto nvel de abstrao descreve apenas parte do banco de dados. A despeito das
estruturas simples do nvel lgico, alguma complexidade permanece devido ao tamanho dos banco de
dados. Muitos dos usurios do banco de dados no precisam conhecer todas as suas informaes. Pelo
contrrio, os usurios normalmente utilizam apenas parte do banco de dados. Assim, para que estas
interaes sejam simplificadas, um nvel de viso definido. O sistema pode proporcionar diversas vises
do mesmo banco de dados.

76

O inter-relacionamento entre esses trs nveis de abstrao est ilustrado na fig. 1.1.
Uma analgica com o conceito de tipos de dados em linguagens de programao pode ajudar a esclarecer
a distino entre os nveis de abstrao. As linguagens de programao de mais alto nvel do suporte noo de
tipos de dados. Por exemplo, nas linguagens semelhantes ao Pascal, podemos declarar um registro como se
segue:

Esse cdigo define um novo registro chamado cliente com quatro campos. Cada campo tem um nome e
um tipo a ele associado. Um banco pode ter diversos tipos de registro, incluindo:
conta, com os campos nmero_conta e saldo;
empregado, com os campos nome_empregado e salario.
No nvel fsico, um registro de cliente, conta ou empregado pode ser descrito como um bloco consecutivo
de memria (p.e., palavras ou bytes). O compilador esconde esse nvel de detalhes dos programadores.
Analogamente, o sistema de banco de dados esconde muitos dos detalhes de armazenamento em nvel mais
baixo dos programadores do banco de dados. Os administradores de banco de dados podem estar familiarizados
com certos detalhes da organizao fsica dos dados.
No nvel lgico, cada registro descrito por um tipo definido, como ilustrado no segmento de cdigo de
programa visto, assim como definida a inter-relao entre esses tipos de registros. Os programadores trabalham
com a linguagem de programao nesse nvel de abstrao. Da mesma forma, os administradores de banco de
dados, usualmente, trabalham nesse nvel de abstrao.
Finalmente, no nvel de viso, os usurios do computador veem um conjunto de programas de aplicao
que esconde os detalhes dos tipos de dados. Nesse nvel, algumas vises do banco de dados so definidas e os
usurios tm acesso a essas vises. Mais do que esconder detalhes prprios do nvel lgico, essas vises tambm
fornecem mecanismos de segurana, de modo a restringir o acesso dos usurios a determinadas partes do banco
de dados. Por exemplo, em um banco, as telefonistas devem ter acesso apenas s informaes dos extratos
bancrios dos clientes, no devem ter acesso a informaes salariais dos empregados do banco.
Instncias e Esquemas
Um banco de dados muda ao longo do tempo por meio das informaes que neles so inseridas ou
excludas. O conjunto de informaes contidas em determinado banco de dados, em um dado momento
chamado instncia do banco de dados. O projeto geral do banco de dados chamado esquema. Os esquemas so
alterados com pouca frequncia.
Analogias com conceitos de linguagem de programao, como tipos de dados, variveis e valores, so
teis aqui. Voltando definio do registro clientes, note que, na declarao de seu tipo, no definimos qualquer
varivel. Para declarar uma varivel em linguagens semelhantes ao Pascal, escrevemos
var cliente1: cliente;
A varivel cliente1 corresponde agora a uma rea de memria que contm um registro tipo cliente.
Um esquema de banco de dados corresponde definio do tipo em uma linguagem de programao.
Uma varivel de um tipo tem um valor em particular em dado instante. Assim, esse valor corresponde a uma
instncia do esquema do banco de dados.
Os sistemas de banco de dados apresentam diversos esquemas, referentes aos nveis de abstrao que
discutimos. No nvel mais baixo h o esquema fsico; no nvel intermedirio, o esquema lgico; e no nvel mais
77

alto, os subesquemas. Em geral, os sistemas de banco de dados do suporte a um esquema fsico, um esquema
lgico e vrios subesquemas.
Independncia de Dados
Os sistemas de banco de dados apresentam diversos esquemas, referentes ao nveis de abstrao j
discutidos. No nvel mais baixo h o esquema fsico; no nvel intermedirio, o esquema lgico; e no nvel mais
alto, os subesquemas. Em geral, os sistemas de banco de dados do suporte a um esquema fsico, um esquema
lgico e vrios subesquemas.
Independncia de Dados
A capacidade de modificar a definio dos esquemas em determinado nvel, sem afetar o esquema
superior, chamado independncia de dados. Existem dois nveis de independncia de dados:
1. Independncia de dados fsica a capacidade de modificar o esquema fsico sem que, com isso, qualquer
programa de aplicao precise ser reescrito. Modificaes no nvel fsico so necessrias, ocasionalmente,
para aprimorar o desempenho.
2. Independncia de dados lgica a capacidade de modificar o esquema lgica sem que, com isso,
qualquer programa de aplicao precise ser reescrito. Modificaes no nvel lgico so necessrias
sempre que uma estrutura lgica do banco de dados alterada (p.e., quando novas moedas so inseridas
no sistema de um banco).
A independncia de dados lgica mais difcil de ser alcanada que a independncia fsica, uma vez que
os programas de aplicao so mais fortemente dependentes da estrutura lgica dos dados do que de seu acesso.
O conceito de independncia de dados de vrias formas similar ao conceito de tipo de dados
empregado nas linguagens modernas de programao. Ambos os conceitos omitem detalhes de implementao
do usurio, permitindo que ele se concentre em sua estrutura geral em vez de se concentrar nos detalhes
tratados no nvel mais baixo.
Modelo de Dados
Sob a estrutura do banco de dados est o modelo de dados: um conjunto de ferramentas conceituais
usadas para a descrio dos dados, relacionamentos entre dados, semntica de dados e regras de consistncia.
Os vrios modelos que vm sendo desenvolvidos so classificados em trs diferentes grupos: modelos lgicos
com base em objetos, modelos lgicos com base em registros e modelos fsicos.
Modelos Lgicos com Base em Objetos
Os modelos lgicos com base em objetos so usados na descrio do nvel lgico e de vises. So
caracterizados por dispor de recursos de estruturao bem mais flexveis e por viabilizar a especificao explcita
das restries de dados. Existem vrios modelos nessa categoria, e outros ainda esto por surgir. Alguns so
amplamente conhecidos, como:
Modelo entidade-relacionamento.
Modelo orientado a objeto.
Modelo semntico de dados.
Modelo funcional de dados.
Modelo Entidade-Relacionamento
O modelo de dados entidade-relacionamento (E-R) tem por base a percepo do mundo real como um
conjunto de objetos bsicos, chamados entidades, e do relacionamento entre eles. Uma entidade uma coisa
ou um objeto do mundo real que pode ser identificado por outros objetos. Por exemplo, cada pessoa uma
entidade, as contas dos clientes de um banco tambm podem ser consideradas entidades. As entidades soa
78

descritas no banco de dados por meio de seus atributos. Por exemplo, os atributos nmero_conta e saldo
descrevem uma conta bancria em particular. Um relacionamento uma associao entre entidades. Por
exemplo, um relacionamento depositante associa um cliente a cada conta que ele possui. O conjunto de todas as
entidades de um mesmo tipo, assim como o conjunto de todos os relacionamentos de mesmo tipo so
denominados conjunto de entidades e conjunto de relacionamentos, respectivamente.
Alm das entidades e dos relacionamento, o modelo E-R representa certas regras, as quais o contedo do
banco de dados precisa respeitar. Uma regra importante o mapeamento das cardinalidades, as quais expressam
o nmero de entidades s quais a outra entidade se relaciona por meio daquele conjunto de relacionamentos.
Toda estrutura lgica do banco de dados pode ser expressa graficamente por meio do diagrama E-R, cujo
construtores dos seguintes componentes so:
Retngulos, que representam os conjuntos de entidades.
Elipses, que representam os atributos.
Losangos, que representam os relacionamentos entre os conjuntos de entidades.
Linhas, que unem os atributos aos conjuntos de entidades e o conjunto de entidades aos seus
relacionamentos.
Cada componente rotulado com o nome da entidade ou relacionamento que representa. Como ilustrao,
considere uma parte do sistema bancrio composta pelos clientes e suas respectivas contas. O diagrama E-R
correspondente mostrado na fig. 1.2.

Modelo Orientado a Objetos


Como o modelo E-R, o modelo orientado a objetos tem por base um conjunto de objetos. Um objeto
contm valores armazenados em variveis instncias dentro do objeto. Um objeto tambm contm conjuntos de
cdigos que operam esse objeto. Esses conjuntos de cdigos so chamados mtodos.
Os objetos que contm os mesmos tipos de valores e os mesmos mtodos so agrupados em classes.
Uma classe pode ser vista como uma definio de tipo para objetos. Essa combinao compacta de dados e
mtodos abrangendo uma definio de tipo similar ao tipo abstrato em uma linguagem de programao.
O nico modo pelo qual um objeto pode conseguir acesso aos dados de outro objeto por meio do
mtodo desse outro objeto. Essa ao chamada de enviar mensagem ao objeto. Assim, a interface de mtodos
de um objeto define a parte externa visvel de um objeto. A parte interna de um objeto as instncias variveis e
o cdigo do mtodo no so visveis externamente. O resultado so dois nveis de abstrao de dados.
Modelos Lgicos com Base em Registros
Modelos lgicos com base em registros so usados para descrever os dados no nvel lgico e de viso. Em
contraste com os modelos com base em objetos, este tipo de modelo usado tanto para especificar a estrutura
lgica do banco de dados quanto para implementar uma descrio de alto nvel.

79

Os modelos com base em registro so assim chamados porque o banco de dados estruturado por meio
de registros de formato fixo de todos os tipos. Cada registro define um nmero fixo de campos ou atributos, e
cada atributo tem um tamanho fixo.
Modelo Relacional
O modelo relacional usa um conjunto de tabelas para representar tanto os dados com a relao entre
eles. Cada tabela possui mltiplas colunas e cada uma possui um nome nico. A fig. 1.3 apresenta um exemplo de
banco de dados relacional condensado em duas tabelas: uma mostrando os clientes do banco e a outra, suas
contas.
Modelo de Rede
Os dados no modelo de rede so representados por um conjunto de registros (como no Pascal) e as
relaes entre estes registros so representados por links (ligaes), as quais podem ser vistas pelos ponteiros. Os
registros so organizados no banco de dados por um conjunto arbitrrio de grficos. A fig. 1.4 apresenta um
exemplo de banco de dados em rede, usando as mesmas informaes da fig. 1.3.
Modelo Hierrquico
O modelo hierrquico similar ao modelo em rede, pois os dados e suas relaes so representados,
respectivamente, por registros e links. A diferena que no modelo hierrquico os registros esto organizados em
arvores em vez de grficos arbitrrios. A fig. 1.5 apresenta um exemplo de modelo de banco de dados
hierrquico, usando as mesmas informaes da fig. 1.4.

80

Diferena entre Modelos


O modelo relacional difere dos modelos hierrquico e em rede por no usar nem ponteiros nem links. Ele
relaciona os registros por valores prprios a eles. Como no necessrio o uso de ponteiros, houve a
possibilidade do desenvolvimento de fundamentos matemticos para sua definio.

81

Modelos Fsicos de Dados


Os modelos fsicos de dados so usados para descrev-los no nvel mais baixo. Em contraste com os
modelos lgicos, h poucos modelos fsicos de dados em uso. Dois deles so amplamente conhecidos: o modelo
unificado (unifying model) e o modelo de partio de memria (frame-memory model).
Os modelos fsicos captam os aspectos de implementao do sistema de banco de dados.
Linguagens de Banco de Dados
Um sistema de banco de dados proporciona dois tipos de linguagens: uma especfica para os esquemas
do banco de dados e outra para expressar consultas e atualizaes.
Linguagens de Definicao de Dados
Um esquema de dados especificado por um conjunto de vises expressas por uma linguagem especial
chamada linguagem de definio de dados (data-definition language DDL). O resultado da compilao dos
parmetros DDLs armazenado em um conjunto de tabelas que constituem um arquivo especial chamado
dicionrio de dados ou diretrio de dados.
Um dicionrio de dados um arquivo de metadados isto , dados a respeito de dados. Em um sistema
de banco de dados, esse arquivo ou diretrio consultado antes que o dado real seja modificado.
A estrutura de memria e o mtodo de acesso usados pelo banco de dados so especificados por um
conjunto de definies em um tipo especial de DDL, chamado linguagem de definio e armazenamento de dados
(data storage and definition language). O resultado da compilao dessas definies um conjunto de instrues
para especificar os detalhes de implementao dos esquemas do banco de dados os detalhes normalmente so
ocultados dos usurios.
Linguagem de Manipulao dos Dados
Os nveis de abstrao j discutidos no se aplicam apenas definio ou estrutura dos dados, mas
tambm a sua manipulao.
Por manipulao de dados entendemos:
82

A recuperao das informaes armazenadas no banco de dados.


Insero de novas informaes no banco de dados.
A remoo de informaes do banco de dados.
A modificao das informaes do banco de dados.

No nvel fsico, precisamos definir algoritmos que permitam o acesso eficiente aos dados. Nos nveis mais
altos de abstrao, enfatizamos a facilidade de uso. O objetivo proporcionar uma interao eficiente entre
homens e sistema.
A linguagem de manipulao de dados (DML) a linguagem que viabiliza o acesso a manipulao dos
dados de forma compatvel ao modelo de dados apropriado. So basicamente dois tipos:
DMLs procedurais exigem que o usurio especifique quais dados so necessrios e como obt-los.
DMLs no procedurais exige que o usurio especifique quais dados so necessrios, sem especificar
como obt-los.
As DMLs no procedurais so normalmente mais fceis de aprender e de usar. Entretanto, como o
usurio no especifica como obter os dados, essas linguagens pode gerar cdigo menos eficiente que os gerados
por linguagens procedurais. Podemos resolver esse tipo de problema por meio de vrias tcnicas de otimizao.
Uma consulta uma solicitao para recuperao de informaes. A parte de uma DML responsvel pela
recuperao de informao chamada linguagem de consultas (query language). Embora tecnicamente incorreto,
comum o uso do termo linguagem de consultas como sinnimo de linguagem de manipulao de dados.
Gerenciamento de Transaes
Frequentemente, muitas operaes em um banco de dados constituem uma nica unidade lgica de
trabalho. Voltamos ao exemplo usado na transferncia de fundos entre contas bancrias, responsvel pelo dbito
na conta A e crdito na conta B. Antes de mais nada, essencial que ocorram ambas as operaes, de crdito e
dbito, ou nenhuma delas dever ser realizada. Isto , ou a transferncia de fundos acontece como um todo ou
nada deve ser feito. Esse tudo-ou-nada chamado atomicidade. Ainda mais, necessrio que a transferncia de
fundos preserve a consistncia do banco de dados. Ou seja, a soma de A+B deve ser preservada. Essas exigncias
de corretismo so chamadas de consistncia. Finalmente, depois da execuo com sucesso da transferncia de
fundos, os novos valores de A e B devem persistir, a despeito das possibilidades de falhas no sistema. Esta
persistncia chamada durabilidade.
Uma transao uma coleo de operaes que desempenha uma funo lgica nica dentro de uma
aplicao do sistema de banco de dados. Cada transao uma unidade de atomicidade e consistncia. Assim,
exigimos que as transaes no violem nenhuma das regras de consistncia do banco de dados. Ou seja, o banco
de dados estava consistente antes do incio da transao e deve permanecer consistente aps o trmino com
sucesso de uma transao. Entretanto, durante a execuo de uma transao, ser necessrio aceitar
inconsistncias temporariamente. Essa inconsistncia temporria, embora necessria pode gerar problemas caso
ocorra uma falha.
responsabilidade do programador definir, de modo apropriado, as diversas transaes, tais que cada
uma preserve a consistncia do banco de dados. Por exemplo, a transao para a transferncia de fundos da
conta A para a conta B poderia ser composta por dois programas distintos: um para dbito na conta A e outro
para crdito na conta B. A execuo destes dois programas um aps o outro ir manter a consistncia do banco
de dados. Entretanto, cada programa executado isoladamente no leva o banco de dados de um para outro
estado inconsistente. Logo, esses programas separados no so transaes.
Assegurar as propriedades de atomicidade e durabilidade tambm responsabilidade do sistema de
banco de dados especialmente, os componentes de gerenciamento de transaes. Na ausncia de falhas, todas
as transaes se completam com sucesso e a atomicidade garantida. No entanto, devido aos vrios tipos de
falhas possveis, uma transao pode no se completar com sucesso. Se estivermos empenhados em garantir a
83

atomicidade, uma transao incompleta no poder comprometer o estado do banco de dados. Assim, o banco
de dados precisa retornar ao estado anterior em que se encontrava antes do incio dessa transao.
responsabilidade do sistema de banco de dados detectar as falhas e recuperar o banco de dados,
garantindo seu retorno a seu ltimo estado consistente.
Por fim, quando muitas transaes atualizam o banco de dados concorrentemente, a consistncia do
banco de dados pode ser violada, mesmo que essas transaes, individualmente, estejam corretas.
responsabilidade do gerenciador de controle de concorrncia controlar a interao entre transaes concorrentes
de modo a garantir a consistncia do banco de dados.
Os sistemas de banco de dados projetados para o uso em computadores pessoais podem no apresentar
todas essas funes.
Administrao de Memria
Normalmente, os banco de dados exigem um grande volume de memria. Um banco de dados
corporativo usualmente medido em termos de gigabytes ou, para banco de dados de grande porte (largest
database), terabytes. Um gigabyte corresponde a 1000 megabytes (1 bilho de bytes) e um terabyte 1 milho
de megabytes (1 trilho de bytes). J que a memria do computador no pode armazenar volumes to grandes de
dados, as informaes so armazenadas em discos. Os dados so transferidos dos discos para a memria quando
necessrio. Uma vez que essa transferncia relativamente lenta comparada velocidade do processador,
imperativo que o sistema de banco de dados estruture os dados de forma a minimizar a necessidade de
movimentao entre disco e memria.
O objetivo de um sistema de banco de dados simplificar e facilitar o acesso aos dados. Vises de alto
nvel ajudam a alcanar esses objetivos. Os usurios do sistema no devem desnecessariamente importunados
com detalhes fsicos relativos implementao do sistema. Todavia, um dos fatores mais importantes de
satisfao ou insatisfao do usurio com um sistema de banco de dados justamente seu desempenho. Se o
tempo de resposta demasiado, o valor do sistema diminui. O desempenho de um sistema de banco de dados
depende da eficincia das estruturas usadas para a representao dos dados, e do quanto esse sistema est apto
a operar essas estruturas de dados. Como acontece com outras reas dos sistemas computacionais, no se trata
somente do consumo de espao e tempo, mas tambm da eficincia de um tipo de operao sobre outra.
Um gerenciador de memria um mdulo de programas para interface entre o armazenamento de dados
em um nvel baixo e consultas e programas de aplicao submetidos ao sistema. O gerenciamento de memria
responsvel pela interao com o gerenciamento de arquivos. Uma linha de dados armazenada no disco usando
os sistema de arquivos que, convencionalmente, fornecido pelo sistema operacional. O gerenciador de memria
traduz os diversos comandos DML em comandos de baixo nvel de sistema de arquivos. Assim, o gerenciador de
memria responsvel pelo armazenamento, recuperao e atualizao de dados no banco de dados.
O Administrador de Banco de Dados
Uma das principais razoes que motivam o uso do SGBDs o controle centralizado tanto dos dados quanto
dos programas de acesso a esses dados. A pessoa que centraliza esse controle do sistema chamado
administrador de dados (DBA). Dentre as funes de um DBA destacamos as seguintes:
Definicao do esquema. O DBA cria o esquema do banco de dados original escrevendo um conjunto de
definies que so transformadas pelo compilador DDL em um conjunto de tabelas armazenadas de
modo permanente no dicionrio de dados.
Esquema e modificaes na organizao fsica. Os programadores realizam relativamente poucas
alteraes no esquema do banco de dados ou na descrio da organizao fsica de armazenamento por
meio de um conjunto de definies que sero usadas ou pelo compilador DDL ou pelo compilador de
armazenamento de dados e definio de dados, gerando modificaes na tabela apropriada, interna ao
sistema (p.e., no dicionrio de dados).

84

Fornecer autorizao de acesso ao sistema. O fornecimento de diferentes tipos de autorizao no acesso


aos dados permite que o administrador de dados regule o acesso dos diversos usurios s diferentes
partes do sistema. Os dados referentes autorizao de acesso so armazenados em uma estrutura
especial do sistema que consultada pelo sistema de banco de dados toda vez que o acesso quele dado
for solicitado.
Especificao de regras de integridade. Os valores dos dados armazenados no banco de dados devem
satisfazer certas restries para manuteno de sua integridade. Por exemplo, o nmero de horas que um
empregado pode trabalhar durante uma semana no deve ser superior a um limite especificado
(digamos, 40 horas). Tal restrio precisa ser explicitada pelo administrador de dados. As regras de
integridade so tratadas por uma estrutura especial do sistema que consultada pelo sistema de banco
de dados sempre que uma atualizao est em curso no sistema.

Usurios de Banco de Dados


A meta bsica de um sistema de banco de dados proporcionar um ambiente para recuperao de
informaes e para o armazenamento de novas informaes no banco de dados. H quatro tipos de usurios de
sistemas de banco de dados, diferenciados por suas expectativas de interao com o sistema.
Programadores de aplicao: so profissionais em computao que interagem com o sistema por meio
de chamadas DML, as quais so envolvidas por programas escritos na linguagem hospedeira (p.e., COBOL,
PL/1, C). Esses programas so comumente referidos como programas de aplicao. Exemplos em um
sistema bancrio incluem programas para gerar relao de cheques pagos, para crdito em contas, para
dbitos em conta ou para transferncia de fundos entre contas.
Uma vez que a sintaxe da DML , em geral, completamente diferente de uma linguagem hospedeira, as chamadas
DML so, normalmente, precedidas por um caractere especial antes que o cdigo apropriado possa ser gerado.
Um pr-processamento, chamado pr-compilador DML, converte os comandos DML para as chamadas normais
em procedimentos da linguagem hospedeira. O programa resultante , ento, submetido ao compilador da
linguagem hospedeira, a qual gera o cdigo de objeto apropriado.
Existem tipos especiais de linguagem de programao que combinam estruturas de controle de
linguagens semelhantes ao Pascal com estruturas de controle para manipulao dos objetos do banco de dados
(p.e., relaes). Estas linguagens, muitas vezes chamadas linguagens de quarta gerao, frequentemente incluem
recursos especiais para facilitar a gerao de formulrios e a apresentao de dados no monitor. A maior parte
dos sistemas de banco de dados comerciais inclui linguagens de quarta gerao.
Usurios sofisticados: interagem com o sistema sem escrever programas. Formulam suas solicitaes ao
banco de dados por meio de linguagens de consultas. Cada uma dessas solicitaes submetida ao
processador de consultas cuja funo quebrar as instrues DML em instrues que o gerenciador de
memria entenda. Os analistas que submetem consultas para explorar dados no banco de dados caem
nessa categoria.
Usurios especialistas: so usurios sofisticados que escrevem aplicaes tradicionais especializadas de
banco de dados que no podem ser classificadas como aplicaes tradicionais em processamento de
dados. Dentre elas esto os sistemas para projetos auxiliados por computador, sistemas especialistas e
sistemas de base de conhecimento, sistemas que armazenam dados de tipos complexos (por exemplo,
dados grficos e de udio) e sistemas para modelagem de ambiente (environment-modeling systems).
Usurios navegantes: so usurios comuns que interagem com o sistema chamando um dos programas
aplicativos permanentes j escritos, como, por exemplo, um usurio que pede a transferncia de 50
dlares da conta A para a B por telefone, usando para isso um programa chamado transfer. Esse
programa pede ao usurio o valor a ser transferido, o nmero da conta para crdito e o nmero da conta
para dbito.
Viso Geral da Estrutura do Sistema
85

Um sistema de banco de dados est dividido em mdulos especficos, de modo a atender a todas as
funes do sistema. Algumas das funes do sistema de banco de dados podem ser fornecidas pelo sistema
operacional. Na maioria das vezes, o sistema operacional do computador fornece apenas as funes essenciais, e
o sistema de banco de dados deve ser construdo nessa base. Assim, o projeto do banco de dados deve considerar
a interface entre o sistema de banco de dados e o sistema operacional.
Os componentes funcionais do sistema de banco de dados podem ser divididos pelos componentes de
processamento de consultas e pelos componentes de administrao de memria. Os componentes de
processamento de consultas incluem:

Compilador DML, que traduz comando DML da linguagem de consulta em instrues de baixo nvel,
inteligveis ao componente de execuo de consultas. Alm disso, o compilador DML tenta transformar a
solicitao do usurio em uma solicitao equivalente, mas mais eficiente, buscando, assim, uma boa
estratgia para execuo da consulta.
Pr-compilador para comandos DML inseridos em programas de aplicao, que convertem comandos
DML em chamadas de procedimentos normais da linguagem hospedeira. O pr-compilador precisa
interagir com o compilador DML de modo a gerar o cdigo apropriado.
Interpretador DDL, que interpreta os comandos DDL e registra-os em um conjunto de tabelas que
contm metadados.
Componentes para o tratamento de consultas, que executam instrues de baixo nvel geradas pelo
compilador DML.

Os componentes para administrao do armazenamento de dados proporcionam a interface entre os dados de


baixo nvel, armazenados no banco de dados, os programas de aplicaes e as consultas submetidas ao sistema.
Os componentes de administrao de armazenamento de dados incluem:
Gerenciamento de autorizaes e integridade, que testam o cumprimento das regras de integridade e a
permisso ao usurio no acesso ao dado.
Gerenciamento de transaes, que garante que o banco de dados permanecer em estado consistente
(correto) a despeito de falhas no sistema e que transaes concorrentes sero executadas sem conflitos
em seus procedimentos.
Administrao de arquivos, que gerencia a alocao de espao no armazenamento em disco e as
estruturas de dados usadas para representar estas informaes armazenadas em disco.
Administrao de buffer, responsvel pela intermediao de dados do disco para a memria principal e
pela deciso de quais dados colocar em memria cache.

Alm disso, algumas estruturas de dados so exigidas como parte da implementao fsica do sistema:
Arquivo de dados, que armazena o prprio banco de dados.
Dicionrio de dados, que armazena os metadados relativos estrutura do banco de dados. O dicionrio
de dados muito usado. Portanto, grande nfase dada ao desenvolvimento de um bom projeto com
uma implementao eficiente do dicionrio.
ndices, que proporcionam acesso rpido aos itens de dados que so associados a valores determinados.
Estatsticas de dados, armazenam as informaes estatsticas relativas aos dados contidos no banco de
dados. Essas informaes so usadas pelo processador de consultas para seleo de meios eficientes para
execuo de uma consulta.

86

Modelo Entidade-Relacionamento
O modelo entidade-relacionamento (E-R) tem por base a percepo de que o mundo real formado por
um conjunto de objetos chamados entidades e pelo conjunto dos relacionamentos entre esses objetos. Foi
desenvolvido para facilitar o projeto do banco de dados, permitindo a especificao do esquema da empresa, que
representa toda estrutura lgica do banco de dados. O modelo E-R um dos modelos com maior capacidade
semntica; os aspectos semnticos do modelo se referem tentativa de representar o significado dos dados. O
modelos E-R extremamente til para mapear, sobre um esquema conceitual, o significado e interaes das
empresas reais. Devido a essa utilidade, muitas das ferramentas de projeto foram concebidas para o modelo E-R.
Conceitos Bsicos
Existem trs noes bsicas empregadas pelo modelo E-R: conjunto de entidades, conjunto de
relacionamentos e os atributos.
Conjunto de Entidades
Um entidade uma coisa ou um objeto no mundo real que pode ser identificada de forma unvoca
em relao a todos os outros objetos. Por exemplo, cada pessoa na empresa uma entidade. Uma entidade tem
um conjunto de propriedades, e os valores para alguns conjuntos dessas propriedades devem ser nicos. Por
exemplo, o nmero social 677-89-9011 identifica uma nica pessoa na empresa. Tambm, pode-se pensar em
emprstimos como entidades, e o emprstimo nmero L-15 referente agncia Perryridge identifica
univocamente uma entidade emprstimo. Uma entidade pode ser concreta, como uma pessoa ou um livro, ou
pode ser abstrata, como um emprstimo, uma viagem de frias ou um conceito.
Um conjunto de entidades um conjunto que abrange entidades de mesmo tipo que compartilham as
mesmas propriedades: os atributos. O conjunto de todas as pessoas que so clientes de um banco de dados, por
exemplo, pode ser definido como o conjunto de entidades clientes. Analogamente, o conjunto de entidades
emprstimo poderia representar o conjunto de todos os emprstimos que o banco em questo viabiliza. As
entidades individuais que constituem um conjunto so chamadas extenses do conjunto de entidades. Assim,
todos os clientes do banco so as extenses do conjunto de entidades cliente.
Os conjuntos de entidades no so necessariamente separados. Por exemplo, possvel definir um
conjunto de entidades com todos os empregados do banco (empregado) e um conjunto de entidades com todos
os clientes do banco (cliente). A entidade pessoa pode pertencer ao conjunto de entidades empregado, ou ao
conjunto de entidades cliente, ou a ambos, ou a nenhum.
Uma entidade representada por um conjunto de atributos. Atributos so propriedades descritivas de
cada membro de um conjunto de entidades. A designao de um atributo para um conjunto de entidades
expressa que o banco de dados mantm informaes similares de cada uma das entidades do conjunto de
entidades; entretanto, cada entidade pode ter seu prprio valor em cada atributo. Atributos possveis ao
conjunto de entidades clientes so nome_cliente, seguro_social, rua_cliente, e cidade_cliente. Atributos possveis
para o conjunto de entidades emprstimo so nmero_emprstimo e conta. Para cada atributo existe um
conjunto de valores possveis, chamado domnio, ou conjunto de valores, daquele atributo. O domnio do atributo
nome_cliente pode ser o conjunto de todos os textos string de um certo tamanho. Similarmente, o domnio do
atributo nmero_emprstimo pode ser o conjunto de todos os inteiros positivos.
Desse modo, um banco de dados inclui uma coleo de conjuntos de entidades, cada qual contendo um
nmero de entidades de mesmo tipo. A fig. 2.1 mostra parte do banco de dados de uma empresa bancria
contendo dois conjuntos entidades: cliente e emprstimo.

87

Formalmente, um atributo de um conjunto de entidades uma funo que relaciona o conjunto de


entidades a seu domnio. Desde que um conjunto de entidades possua alguns atributos, cada entidade pode ser
descrita pelo conjunto formado pelos pares (atributos, valores de dados), um par para cada atributo do conjunto
de entidades. Por exemplo, uma entidade em particular de cliente pode ser descrita pelo conjunto {(nome,
Hayes), (seguro_social, 677-89-9011), (rua_cliente, Main), (cidade_cliente, Harrison)}, o que significa que essa
entidade descreve o cliente Hayes, que possui o seguro social nmero 677-89-90211 e mora na Rua Main em
Harrison. Podemos notar, a esta altura, uma integrao entre o esquema abstrato e a empresa real que est
sendo modelada. Os valores dos atributos que descrevem as entidades constituem uma poro significativa dos
dados que sero armazenados no banco de dados. Um atributo, como usado no modelo E-R, pode ser
caracterizado pelos seguintes tipos:
Atributos simples ou compostos. Em nosso exemplo anterior, todos os atributos eram simples: isto , no
eram divididos em partes. Os atributos compostos, por outro lado, podem ser divididos em partes (isto ,
outros atributos). Por exemplo, nome_cliente pode ser estruturado em prenome, nome_intermediario e
sobrenome. O uso de atributos compostos ajudam-nos a agrupar atributos correlacionados, tornando o
modelo mais claro.
Note que os atributos compostos podem estar hierarquizados. Retornando o exemplo do atributo
composto endereo_cliente, seu atributo rua pode vir a ser subdividido posteriormente em nmero_rua,
nome_rua, e nmero_apto. Esses exemplos de atributos compostos para clientes so apresentados na fig. 2.2.

Atributos monovalorados ou multivalorados. Os atributos usados em nossos exemplos foram todos de


valores simples para uma entidade em particular. Ou seja, o atributo nmero_emprstimo de uma
entidade especfica refere-se apenas a um nmero de emprstimo. Esses atributos so chamados
monovalorados. Pode haver instncias em que um atributo possua um conjunto de valores para uma
nica entidade. Considere o conjunto de entidades empregado com o atributo nome_dependente.
Qualquer empregado em particular pode ter um, nenhum ou vrios dependentes; entretanto, diferentes
entidades empregado dentro do conjunto e empregados tero diferentes nmeros de valores para o
atributo nome_dependente. Esse tipo de atributo dito multivalorado. Quando necessrio, pode-se
estabelecer limites inferiores e superiores para o nmero de ocorrncias em um atributo multivalorado.
Por exemplo, um banco pode ter um nmero limite de registros de endereos para um cliente normal,
um ou dois endereos. O estabelecimento de limites, neste caso, exprime que o atributo
endereo_cliente do conjunto de entidades cliente pode possuir de zero a dois valores.
Atributos nulos. Um atributo nulo usado quando uma entidade no possui valor para determinado
atributo. Por exemplo, se um empregado em particular no possui dependentes, o valor do atributo
88

nome_dependente para esse dependente dever ser nulo, e isso significa que esse atributo no
aplicvel. Nulo tambm pode significar que o valor do atributo desconhecido. Um valor desconhecido
pode caracterizar omisso (o valor existe de fato, mas no temos essa informao) ou no conhecimento
(no sabemos se o valor existe de fato). Por exemplo, se o valor do seguro_social de determinado cliente
nulo, assume-se que seu valor foi omitido, j que exigido para efeitos de impostos. Um valor nulo para
o atributo nmero_apartamento pode significar que o nmero do apartamento foi omitido, ou que o
nmero existe mas no sabemos qual , ou que o endereo no um prdio de apartamentos e,
portanto, no faz parte do endereo do cliente.

Atributo derivado. O valor desse tipo de atributo pode ser derivado de outros atributos ou entidades a
ele relacionados. Por exemplo, digamos que o conjunto de entidades cliente possui o atributo
emprstimos_tomados, que representa o nmero de emprstimos tomados do banco por um cliente.
Podemos derivar o valor desse atributo contando o nmero das entidades emprstimos associadas ao
cliente em questo. Como outro exemplo, consideremos que o conjunto de entidades empregado est
relacionado aos atributos data_contratao e tempo_de_casa, os quais representam o primeiro dia de
emprego no banco e o tempo total que o empregado est trabalhando, respectivamente. O valor do
tempo_de_casa pode ser derivado do valor da data_contratao e tempo_de_casa, os quais representam
o primeiro dia de emprego no banco e o tempo total que o empregado est trabalhando,
respectivamente. O valor do tempo_de_casa pode ser derivado do valor data_contratao e da
data_corrente. Neste caso, a data_contratao pode ser referida como um atributo da base ou um
atributo armazenado.

Um banco de dados para uma empresa bancria pode incluir um nmero diferente de conjuntos de entidades.
Por exemplo, aliado ao que foi dito sobre clientes e emprstimos, um banco tambm possui contas, que esto
representadas pelo conjunto de entidades conta com os atributos nmero_conta e saldo. Tambm, se um banco
tem um nmero diferente de agncias, ento deveramos captar informaes sobre todas essas agncias. Cada
conjunto de entidades agncia pode ser descrito pelos atributos nome_agncia, cidade_agncia e fundos.
Conjuntos de Relacionamentos
Um relacionamento uma associao entre uma ou vrias entidades. Por exemplo, podemos definir um
relacionamento que associa o cliente Hayes com o emprstimo L-15. Esse relacionamento especifica que o cliente
Hayes cliente com o emprstimo nmero L-15.
Um conjunto de relacionamentos um conjunto de relacionamentos do mesmo tipo. De modo formal, a
relao matemtica com n2 conjunto de entidades (podendo ser no-distintos). Se E1, E2, ..., Em so conjuntos
de entidades, ento um conjunto de relacionamentos R um subconjunto de
em que (e1, e2, ..., en) so relacionamentos.
Considere dois conjuntos de entidades da fig. 2.1, cliente e emprstimo. Definimos o conjunto de
relacionamentos devedor para denotar a associao entre clientes e emprstimos bancrios contrados pelo
clientes. Essa associao apresentada na fig. 2.3.

89

Como exemplo, consideremos dois tipos de conjuntos de entidades, emprstimo e agncia. Podemos
definir o conjunto de relacionamento agncia_emprstimo denotando a associao entre um emprstimo
bancrio e a agncia onde esse emprstimo mantido.
A associao entre os conjuntos de entidades referida como uma participao; isto , o conjunto de
entidade E1, E2, ..., En participa do conjunto de relacionamentos R. Uma instncia de relacionamento em um
esquema E-R representa a existncia de uma associao entre essa entidade e o mundo real no qual insere a
empresa que est sendo modelada. Ilustramos a entidade cliente chamada Hayes, que possui o seguro social
nmero 677-89-9011, e a entidade emprstimo L-15 participam na instncia do relacionamento devedor.
Essa instncia do relacionamento representa que, no mundo real da empresa, uma pessoa chamada
Hayes que possui o seguro social nmero 677-89-9011 tomou um emprstimo que tem o nmero L-15.
A funo que uma entidade desempenha em um relacionamento chamada papel. Uma vez que os
conjunto de entidades participantes em um conjunto de relacionamentos so geralmente distintos, papis so
implcitos e no so, em geral, especificados. Entretanto, so uteis quando o significado de um relacionamento
precisa ser esclarecido. Este o caso quando os conjuntos de entidades e os conjuntos de relacionamentos mais
de uma vez, em diferentes papis.
Nesse tipo de conjunto de relacionamentos, que algumas vezes chamado conjunto de relacionamentos
recursivos, nomes explcitos de papis so necessrios para especificar como uma entidade participa de uma
instncia de relacionamento. Por exemplo, considere o conjunto de entidades empregado que mantm
informaes sobre todos os empregados do banco. Podemos ter um conjunto de relacionamentos trabalha_para
que modelado para ordenar os pares de entidades de empregado. O primeiro empregado de um par tem o
papel de gerente, enquanto o outro tem o papel de empregado. Deste modo, todos os relacionamentos de
trabalha_para so caracterizados pelos pares (gerente, empregado); os pares (empregado, gerente) so
excludos.
Um relacionamento tambm pode ter atributos descritos. Considere o conjunto de relacionamentos
depositante com o conjunto das entidades cliente e conta. Poderemos associar o atributo data_acesso a essa
relao para especificar a data do ltimo aceso feito pelo cliente em sua conta. O relacionamento depositante
entre as entidades correspondentes ao cliente Jones e conta A-217 descrita por {(data-acesso, 23 de maio de
2013)}, a qual significa que o mais recente acesso que Jones fez a sua conta A-217 foi em 23 de maio de 2013.

O conjunto de relacionamentos devedor e agncia_emprstimo um exemplo de conjunto de


relacionamentos binrio isto , um relacionamento que envolve dois conjuntos de entidades. A maior parte dos
conjuntos de relacionamentos nos sistemas de banco de dados so binrios. Ocasionalmente, entretanto, os
conjuntos de relacionamentos envolvem mais de dois conjuntos de entidades. Como exemplo, podemos
combinar os conjuntos de relacionamentos devedor e agncia_emprstimo formado o conjunto de
90

relacionamentos CEA, envolvendo os conjuntos de entidades cliente, emprstimo e agncia. Assim, o


relacionamento ternrio entre as entidades correspondente ao cliente Hayes, o emprstimo nmero L-15, e a
agncia Perryridge especifica que o cliente Hayes tem o emprstimo L-15 na agncia Perryridge.
O nmero de conjuntos de entidades que participa de um conjunto de relacionamento tambm o grau
desse conjunto de relacionamento. Um conjunto de relacionamento binrio de grau dois; um relacionamento
ternrio de grau trs.
Metas de Projeto
Um conjunto de entidades e um conjunto de relacionamento no so noes precisas e possvel definir
um conjunto de entidades e de relacionamentos entre eles de vrias formas diferentes.
Uso de Conjuntos de Entidades ou Atributos
Considere o conjunto de entidades empregado com os atributos nome_empregado e nmero_telefone.
Pode ser facilmente verificado que o telefone uma entidade sujeita a seus prprios atributos, como
nmero_telefone e localizao (o escritrio onde o telefone est instalado). Sob esse ponto de vista, o conjunto
de entidades deve ser redefinido, conforme segue:
O conjunto de entidades empregado com o atributo nome_empregado.
O conjunto de entidades telefone com os atributos nmero_telefone e localizao.
O conjunto de relacionamentos emp_telefone, o qual denota a associao entre os empregados e os
telefones que podem ter.
Qual , ento, a principal diferena entre essas duas definies de um empregado? No primeiro caso, a definio
implica que todo empregado possui, precisamente, um nmero de telefone a ele associado. No segundo caso,
entretanto, a definio estabelece que o empregado pode ter vrios nmeros de telefones (incluindo zero) a ele
associados. Assim, a segunda definio mais geral que a primeira e pode refletir com maior preciso as
situaes reais.
Mesmos se nos for dado que cada empregado tem, precisamente, um nmero de telefone a ele
associado, a segunda definio pode, ainda assim, ser mais apropriada, caso um mesmo telefone possa ser
compartilhado por diversos empregados.
No seria apropriado, no entanto, aplicar a mesma tcnica ao atributo nome_empregado; difcil
sustentar que nome_empregado seja uma entidade por si s (em contraste com telefone). Assim, apropriado
manter nome_empregado como atributo do conjunto de entidades empregado.
Duas questes aparecem naturalmente: o que constitui um atributo e o que constitui um conjunto de
entidades? Infelizmente, no existe uma resposta simples. As distines dependem, principalmente, da estrutura
real da empresa que est sendo modelada e da semntica associada aos atributos em questo.
Uso dos Conjuntos de Entidades e Conjunto de Relacionamentos
Nem sempre fica claro se um objeto melhor expresso por um conjunto de entidades ou por um
conjunto de relacionamentos. J assumimos anteriormente que um emprstimo bancrio modelado como uma
entidade. Uma alternativa modelar o emprstimo no como uma entidade, mas como um relacionamento entre
clientes e agncias, com nmero_emprstimo e conta como atributos descritivos. Cada emprstimo
representado por um relacionamento entre um cliente e uma agncia.
Se todo emprstimo tomado por exatamente um cliente e est associado a exatamente uma agncia,
podemos resolver o projeto de modo satisfatrio caso o emprstimo seja representado como relacionamento.
Entretanto, com um projeto assim, no poderemos representar convenientemente uma situao na qual vrios
clientes tomam um emprstimo conjunto. Precisaremos definir um relacionamento em separado para cada
componente de um emprstimo conjunto. Ento, precisaremos replicar os valores dos atributos descritivos,
nmero_emprstimo e conta, para cada um dos relacionamentos. Dois problemas so consequncia dessa
91

replicao: (1) os dados so armazenados diversas vezes, desperdiando espao em memria; e (2) as
atualizaes deixam, potencialmente, os dados em um estado inconsistente, quando os valores diferem nos
atributos de dois relacionamentos que deveriam, supostamente, possuir valores iguais. O meio pelo qual se
evitam tais replicaes aplicado formalmente pela teoria da normalizao.
Uma linha mestra possvel na opo pelo uso de um conjunto de entidades ou pelo uso de um conjunto
de relacionamentos recorrer ao conjunto de relacionamentos para descrever uma ao que ocorre entre
entidades. Essa abordagem pode ser til tambm para decidir se certos atributos podem ser expressos de
maneira mais apropriada como relacionamentos.
Conjunto de relacionamentos Binrios versus n-simos
sempre possvel recompor um conjunto de relacionamentos no-binrios (n-simos, com n>2) por um
nmero de conjuntos de relacionamentos binrios distintos. Para simplificar, considere o conjunto de
relacionamento ternrio (n=3) abstrato R, relacionados aos conjuntos de entidades A, B e C. Poderemos recompor
o conjunto R em um conjunto de entidades E, e criar trs conjuntos de relacionamentos:
RA, relacionando E e A
RB, relacionando E e B
RC, relacionando E e C
Se o conjunto de relacionamentos R possui quaisquer atributos, estes so designados pelo conjunto de entidades
E (j que todo o conjunto de entidades deve ter ao menos um atributo para distinguir seus membros). Para cada
relacionamento (ai, bi, ci) do conjunto de relacionamentos R, podemos criar uma nova entidade ei no conjunto de
entidades E. Ento, em cada um dos trs novos conjuntos de relacionamentos, inserimos um relacionamento,
como segue:
(ei, ai) em RA
(ei, bi) em RA
(ei, ci) em RA
Podemos generalizar esse processo de modo direto para os conjuntos de relacionamentos n-simo.
Assim, conceitualmente podemos restringir o modelo E-R para conter apenas conjuntos de relacionamentos
binrios. Entretanto, essa restrio nem sempre desejvel.
Pode ser que seja necessria a criao de um atributo de identificao para o conjunto de entidades
criado para substituir o conjunto de relacionamentos. Este atributo, juntamente com o conjunto extra de
relacionamentos criados, aumenta a complexidade do projeto e as necessidades de armazenamento
como um todo.
Um conjunto de relacionamentos n-simo mostra claramente todos os conjuntos de entidades que
participam de uma determinada relao. O projeto correspondente, usando somente conjunto de
relacionamentos binrios, torna mais difcil estabelecer as restries dessa participao.
Mapeamento de Restries
O esquema E-R de uma empresa pode definir certas restries, as quais o contedo do banco de dados
deve respeitar.
Mapeamento das Cardinalidades
O mapeamento das cardinalidades, ou rateio de cardinalidades, expressa o nmero de entidades s quais
outra entidade pode estar associada via um conjunto de relacionamentos.
O mapeamento de cardinalidades mais til na descrio dos conjuntos de relacionamentos binrios,
embora, ocasionalmente, possam contribuir para a descrio de conjuntos de relacionamentos que envolvam
mais de dois conjuntos de entidades.
92

Para um conjunto de relacionamentos R binrio entre os conjuntos de entidades A e B, o mapeamento


das cardinalidades deve seguir uma das instrues abaixo:
Um para um. Uma entidade em A est associada no mximo a uma entidade em B, e uma entidade em B
est associada a no mximo uma entidade em A (fig. 2.4a).
Um para muitos. Uma entidade em A est associada a vrias entidades em B. Uma entidade em B,
entretanto, pode estar associada a qualquer nmero de entidades em B e uma entidade em B est
associada a um nmero qualquer de entidades em A (fig. 2.5a).

O mapeamento apropriado de cardinalidades para um conjunto de relacionamentos em particular ,


obviamente, dependente das situaes reais que esto sendo modeladas pelo conjunto de relacionamentos.
Como ilustrao, considere o conjunto de relacionamentos devedor. Se, em um banco em particular, um
emprstimo pode se destinar a apenas um cliente e um cliente pode contrair diversos emprstimos, ento o
conjunto de relacionamentos entre cliente e emprstimo de um para muitos. Esse tipo de relacionamento
apresentado na fig. 2.3. Se um emprstimo puder ser tomado por mais de um cliente (como normalmente
acontece com os vrios scios de um negcio), o relacionamento seria de muitos para muitos.

O rateio de cardinalidades de um relacionamento pode afetar a colocao dos atributos nos


relacionamentos. Atributos em conjuntos de relacionamentos um para um ou um para muitos deve ser
associados a um dos conjuntos de entidades participantes, em vez de serem associados ao conjunto de
relacionamentos. Por exemplo, consideremos depositante como um conjunto de relacionamentos um para
muitos, tal que um cliente pode possuir diversas contas, mas cada conta est vinculada a apenas um cliente.
Nesse caso, o atributo data_acesso poderia estar associado ao conjunto de entidades conta, como mostrados na
93

fig. 2.6; de modo a tornar a figura mais clara, so apresentados apenas alguns dos atributos dos dois conjuntos de
entidades. J que cada entidade conta participa de um relacionamento com no mximo uma instncia de cliente,
fazer esta designao de atributo pode ter o mesmo significado que colocar data_acesso no conjunto de
relacionamentos depositante. Atributos de conjuntos de relacionamentos um para muitos podem apenas ser
reposicionados no conjunto de entidades do lado muitos desse relacionamento. Em conjuntos de
relacionamentos um para um, o atributo do relacionamento pode ser associado a qualquer uma das entidades
participantes.

As decises de projeto, como decidir onde colocar atributos descritivos como um atributo de entidade
ou relacionamento devem refletir as caractersticas da empresa que est sendo modelada. O projetista pode
optar por manter data_acesso como um atributo de depositante para explicitar que um acesso ocorreu em uma
interao entre os conjuntos de entidades cliente e conta.
A escolha de onde colocar um atributo mais clara quando se trata de conjuntos de relacionamentos
muitos para muitos. Retornando ao exemplo, especifiquemos o que talvez seja um dos mais realsticos casos de
conjuntos de relacionamentos muitos para muitos, depositante, que expressa que um cliente pode ter uma ou
mais contas e que uma conta pode estar vinculada a um ou mais clientes.
Se quisermos expressar a data do ltimo acesso de um cliente a uma dada conta, o atributo data_acesso
dever ser atribudo ao conjunto de relacionamentos depositante, em vez de ser alocado a uma das duas
entidades participantes. Se data_acesso fosse atributo de conta, no poderamos determinar qual dos clientes
responsvel pelo acesso mais recente conta em questo.
Quando um atributo determinado pela combinao dos conjuntos de entidades participantes em vez de
estar associado a cada uma das entidades, separadamente, esse atributo precisa ser associado ao conjunto de
relacionamentos muitos para muitos. A colocao de data_acesso como atributo do conjunto de relacionamentos
mostrada na fig. 2.7; novamente, para tornar a figura mais simples, so apresentados apenas alguns dos
atributos dos dois conjuntos de entidades.

94

Dependncia de Existncia
Outra classe importante de restries a dependncia de existncia. Especificamente, se a existncia da
entidade x depende da existncia da entidade y, ento x dito dependente da existncia de y. Operacionalmente,
se y for excludo, o mesmo deve acontecer com x. A entidade y chamada entidade dominante e a x chamada
entidade subordinada. Como ilustrao, considere o conjunto de entidades emprstimo e o conjunto de
entidades pagamento, que mantm todas as informaes dos pagamentos realizados para um determinado
emprstimo. O conjunto de entidades pagamento descrito pelos atributos nmero_pagamento,
data_pagamento e total_pagamento. Criamos um conjunto de relacionamentos pagamento_emprstimo entre
esses dois conjuntos de entidades pagamento descrito pelos atributos nmero_pagamento, data_pagamento e
total_pagamento. Criamos um conjunto de relacionamentos pagamento_emprstimo entre estes dois conjuntos
de entidade que de um para muitos do emprstimo para o pagamento. Toda entidade pagamento est
associada a uma entidade emprstimo. Se uma entidade emprstimo excluda, ento todas as entidades
pagamento a ela associadas devero ser excludas tambm. Em contraste, uma entidade pagamento pode ser
excluda do banco de dados sem afetar em nada qualquer emprstimo. O conjunto de entidades emprstimo,
portanto, dominante e pagamento subordinado ao conjunto de relacionamentos pagamento_emprstimo.
A participao de um conjunto de entidades E no conjunto de relacionamentos R dita total se todas as
entidades em E participam de pelo menos um relacionamento R. Se somente algumas entidades em E participam
do relacionamento R, a participao do conjunto de entidades em E participam do relacionamento R, a
participao do conjunto de entidades E no relacionamento R dito parcial. A participao total est
estreitamente relacionada existncia de dependncia. Por exemplo, desde que toda entidade pagamento esteja
associada a alguma entidade emprstimo pelo relacionamento pagamento_emprstimo, a participao de
pagamento no conjunto de relacionamentos pagamento_emprstimo total. Por outro lado, um indivduo pode
ser cliente de um banco, tendo ou no contrado um emprstimo nele. Da, possvel que apenas parte do
conjunto de entidades cliente esteja relacionada ao conjunto de entidades emprstimo e a participao de cliente
no conjunto de relacionamentos devedor , portanto, parcial.
Chaves

95

importante especificar como as entidades dentro de um dado conjunto de entidades e os


relacionamentos dentro de um conjunto de relacionamentos podem ser identificados. Conceitualmente,
entidades e relacionamentos individuais so distintos, entretanto, na perspectiva do banco de dados, a diferena
entre ambos deve ser estabelecida em termos de seus atributos. O conceito de chave permite-nos fazer tais
distines.
Conjunto de Entidades
Uma superchave um conjunto de um ou mais atributos que, tomados coletivamente, nos permitem
identificar de maneira unvoca uma entidade em um conjunto de entidades. Por exemplo, o atributo
seguro_social do conjunto de entidades cliente suficiente para distinguir uma entidade cliente de outra. Assim,
o seguro_social uma superchave. Do mesmo modo, a combinao de nome_cliente e seguro_social
superchave para o conjunto de entidades cliente. O atributo nome_cliente no superchave de cliente, pois
algumas pessoas podem ter o mesmo nome.
O conceito de superchave no suficiente para nossos propsitos, j que, como vimos, uma superchave
pode conter atributos externos. Se K uma superchave, entoa qualquer superconjunto de K. Nosso interesse
por superchaves para as quais nenhum subconjunto possa ser uma superchave. Essas superchaves so chamadas
chaves candidatas. possvel que vrios conjuntos diferentes de atributos possam servir como superchave.
Suponha que uma combinao de nome_cliente e rua_cliente seja suficiente para distinguir todos os membros do
conjunto de entidades cliente. Ento, (seguro_social) e (nome_cliente, rua_cliente) so chaves candidatas.
Embora os atributos seguro_social e nome_cliente, juntos, possam distinguir as entidades cliente, sua
combinao no forma uma chave candidata, uma vez que seguro_social, sozinho, uma chave candidata.
Chaves candidatas precisam ser escolhidas com cuidado. Como notamos, obviamente o nome de uma
pessoa no suficiente, j que homnimos so possveis. Nos Estados Unidos, o nmero de seguro_social pode
ser uma chave candidata. Em outros pases onde os habitantes normalmente no possuem nmero de seguro
social, as empresas podem gerar seu prprio nmero de identificao, como nmero do cliente ou nmero de
identificao de estudantes ou nmero de identificao, como nmero do cliente ou nmero de identificao de
estudantes ou qualquer outra combinao nica de outros atributos como chave. Uma das combinaes mais
frequentemente usadas o nome, data de nascimento e endereo, j que extremamente difcil que mais de
uma pessoa tenha os mesmos valores para todos esses atributos.
Podemos usar o termo chave primria para caracterizar a chave candidata que escolhida pelo projetista
do banco de dados como de significado principal para a identificao de entidades dentro de um conjunto de
entidades. Uma chave (primria, candidata e super) duas entidades individuais em um conjunto no podem ter,
simultaneamente, mesmos valores em seus atributos-chave. A especificao de uma chave representa uma
restrio ao mundo real da empresa que est sendo modelada.
Conjuntos de Relacionamentos
A chave primria de um conjunto de entidades permite-nos distinguir as vrias entidades de um conjunto.
Precisamos, de modo similar, de um mecanismo para a identificao dos vrios relacionamentos em um conjunto
de relacionamentos.
Seja R um conjunto de relacionamentos envolvendo os conjuntos de entidades E1, E2, ..., En. Seja uma
chave_primria (Ei) denotando o conjunto de atributos que formam a chave primrias sejam nicos (se no
forem, use um esquema apropriado para rebatiz-los). A composio da chave primria para um conjunto de
relacionamentos depende de uma estrutura de atributos associada ao conjunto de relacionamentos R.
Se o relacionamento R no possui atributo, ento o conjunto de atributos:
descreve um relacionamento individual do conjunto R.
Se o conjunto de relacionamento r possui os atributos a1, a2, ..., an a ele associados, ento o conjunto de
atributos:
96

descreve um relacionamento em particular do conjunto R.


Em ambos os casos acima, o conjunto de atributos:
forma uma superchave do conjunto de relacionamentos.
A estrutura da chave primria para o conjunto de relacionamentos depende do mapeamento da
cardinalidade do conjunto de relacionamentos. Como ilustrao, considere o conjunto de entidades cliente e
empregado e um conjunto de relacionamentos cliente_bancrio que representa a associao entre um cliente e
um bancrio (uma entidade empregado). Suponha que um conjunto de relacionamentos seja de muitos para
muitos, suponha tambm que o conjunto de relacionamentos possui o atributo tipo a ele associado,
representando a natureza do relacionamento (como um agente de emprstimo ou como um atendente pessoal).
A chave primria cliente_bancrio constitui-se da unio das chaves primrias de cliente e empregado. Entretanto,
se um cliente pode ser atendido exclusivamente por um bancrio isto , se um relacionamento cliente_bancrio
muitos para um ento, a chave primria de cliente_bancrio simplesmente a chave primria de cliente. Para
relacionamentos um para um, qualquer uma das chaves primrias pode ser usada.
A designao de chaves primrias mais complicada para relacionamentos no-binrios.
Diagrama Entidade-Relacionamento
Toda estrutura lgica do banco de dados pode ser expressa graficamente pelo diagrama E-R. A relativa
simplicidade e clareza desta tcnica de diagramao pode explicar, em grande parte, a ampla disseminao do
uso do modelo E-R.
A seguir so apresentados seus principais componentes:
Retngulos, que representam os conjuntos de entidades.
Elipses, que representam os atributos.
Losangos, que representam os conjuntos de relacionamentos.
Linhas, que unem os atributos aos conjuntos de entidades e os conjuntos de entidades aos conjuntos de
relacionamentos.
Elipses duplas, que representam atributos multivalorados.
Linhas duplas, que indicam a participao total de uma entidade em um conjunto de relacionamentos.
Como mostrado na fig. 2.8, os atributos de um conjunto de entidades que so membros de uma chave
primria devem ser sublinhados.
Considere o diagrama entidade-relacionamento da fig. 2.8, que consiste de dois conjuntos de entidades,
cliente e emprstimo, relacionados pelo conjunto de relacionamentos devedor. Os atributos associados a cliente
so nome_cliente, seguro_social, rua_cliente e cidade_cliente. Os atributos associados a emprstimo so
nmero_emprstimo e total.
O conjunto de relacionamentos devedor pode ser muitos para muitos, um para um, muitos para um ou
um para um. Para fazer a distino entre esses tipos, desenhamos uma linha direcionada () ou uma linha sem
direcionamento (-) entre o conjunto de relacionamentos e o conjunto de entidades em questo.
Uma linha direcionada do conjunto de relacionamentos devedor para o conjunto de entidades
emprstimo especifica que devedor um conjunto de relacionamentos um para um ou muitos para um,
de cliente para emprstimo; devedor no pode ser um conjunto de relacionamentos muitos para muitos
ou um para muitos, de cliente para emprstimo.
Uma linha no direcionada do conjunto de relacionamentos devedor para o conjunto de entidades
emprstimo especifica que devedor um conjunto de relacionamentos muitos para muitos ou um para
muitos, de cliente para emprstimo.

97

Voltando ao diagrama E-R da fig. 2.8, podemos ver que o conjunto de relacionamentos devedor muitos
para muitos. Se o conjunto de relacionamentos dever for um para muitos, de cliente para emprstimo, ento a
linha de devedor para cliente deveria ser direta, com a seta apontando para o conjunto de entidades cliente (fig.
2.9a). Similarmente, se o conjunto de relacionamentos devedor for muitos para um, de cliente para emprstimo,
ento a linha de devedor para emprstimo deveria ser uma seta pontando para o conjunto de entidades
emprstimo (fig. 2.9b).
Finalmente, se o conjunto de relacionamentos devedor for um para um, ento ambas as linhas de
devedor deveriam ser setas: uma apontando para o conjunto de entidades emprstimo e outra apontando para o
conjunto de entidades clientes (fig. 2.10).
Se um conjunto de relacionamentos tambm tem atributos a ele relacionados, ento deveremos fazer a
ligao desses atributos com o conjunto de relacionamentos. Por exemplo, na fig. 2.11, temos o atributo descrito
data_acesso atrelado ao conjunto de relacionamentos depositante para especificar a data mais recente de acesso
do cliente conta.
Indicamos os papeis desempenhados no diagrama E-R por meio da denominao nas linhas que ligam os
losangos aos retngulos. A fig. 2.12 mostra os papeis desempenhados, gerente e empregado, entre o conjunto de
entidades empregado e o conjunto de relacionamentos trabalha_para.
Conjuntos de relacionamentos no-binrios podem ser facilmente especificados no diagrama E-R. A fig.
2.13 apresenta trs conjuntos de entidades, cliente, emprstimo e agncia, interligados pelo conjunto de
relacionamentos CEA.
Esse diagrama especifica que um cliente pode contrair diversos emprstimos e que um emprstimo pode
pertencer a diferentes clientes.
Esse diagrama especifica que um cliente pode contrair diversos emprstimos e que um emprstimo pode
pertencer a diferentes clientes.
A seguir, vemos uma seta apontando para agncia indicando que cada par emprstimo-cliente est
associado a uma agncia bancria especfica. Se o diagrama tem uma seta apontando para cliente e outra
apontando para agncia, o diagrama especificaria que cada emprstimo est associado a um cliente especfico de
uma determinada agncia bancria.

98

99

Conjunto de Entidades Fracas


Um conjunto de entidades pode no ter atributos suficientes para formar uma chave primria. Esse tipo
de conjunto de entidades denominado conjunto de entidades fracas. Um conjunto de entidades que tem uma
chave primria chamado um conjunto de entidades fortes. Como ilustrao, considere o conjunto de entidades
pagamento, com trs atributos: nmero_pagamento, data_pagamento e total_pagamento. Embora cada
100

entidade pagamento seja distinta, os pagamentos de emprstimos no tem uma chave primria; este um
conjunto de entidades fracas. Para um conjunto de entidades fracas ser significativo, ele deve fazer parte de um
conjunto de relacionamentos um para muitos. Esse conjunto de relacionamentos no deve ter nenhum atributo
significativo, j que qualquer atributo exigido pelo conjunto de relacionamentos no deve ter nenhum atributo
significativo, j que qualquer atributo exigido pelo conjunto de relacionamentos pode ser associado ao conjunto
de entidades fracas.
Os conceitos de conjuntos de entidades fortes e fracas no possuir chave primria, precisamos, todavia,
de um significado para a distino entre todas aquelas entidades em um conjunto de entidades que dependem de
uma entidade forte em particular. O identificador de um conjunto de entidades fracas um conjunto de atributos
que permite que essa distino seja feita. Por exemplo, o identificador do conjunto de entidades fracas
pagamento o atributo nmero_pagamento, assim, para cada emprstimo, um nmero de pagamento identifica
um determinado pagamento para aquele emprstimo. O identificador de um conjunto de entidades fracas
tambm chamado de chave parcial de um conjunto de entidades fracas tambm de chave parcial de um
conjunto de entidades.
A chave primaria de um conjunto de entidades fracas formado pela chave primria, precisamos, todavia,
de um significado para a distino entre todas aquelas entidades fortes ao qual a existncia do conjunto de
entidades fracas est vinculada mais o identificador do conjunto de entidades fracas. No caso do conjunto de
entidades pagamento, sua chave primria {nmero_emprstimo, nmero_pagamento}, em que
nmero_emprstimo identifica a entidade dominante pagamento e nmero_pagamento identifica a entidade
pagamento dentro de determinado emprstimo.
O conjunto de entidades dominantes de identificao dito proprietrio do conjunto de entidades fracas
por ele identificada. O relacionamento que associa o conjunto de entidades fracas a seu proprietrio o
relacionamento identificador. Em nosso exemplo, pagamento_emprstimo o relacionamento identificador de
pagamento.
Um conjunto de entidades fracas identificado no diagrama E-R pela linha dupla usada no retngulo e no
losango do relacionamento correspondente. Na fig. 2.14, o conjunto de entidades fracas pagamento
dependente do conjunto de entidades fortes emprstimo pelo conjunto de relacionamentos
pagamento_emprstimo. A figura tambm apresenta o uso de linhas duplas para identificar participao total a
participao do conjunto de entidades (fracas) pagamento no relacionamento pagamento_emprstimo total,
significando que todo pagamento precisa estar relacionado via pagamento_emprstimo a alguma conta.
Finalmente, a seta de pagamento_emprestimo para emprstimo indica que cada pagamento para um nico
emprstimo. O identificador de um conjunto de entidades fracas. Mesmo que um conjunto de entidades fracas
tenha sempre sua existncia dependente de uma entidade dominante, a dependncia de existncia no resulta,
necessariamente, em um conjunto de entidades fracas; isto , o conjunto de entidades subordinadas pode ter
uma chave primria.

101

Em alguns casos, o projetista do banco de dados pode optar por expressar um conjunto de entidades
fracas como um atributo composto multivalorado do conjunto de entidades proprietrio. Em nosso exemplo, essa
alternativa exigiria que o conjunto de entidades emprstimo tivesse um atributo composto multivalorado
pagamento, consistindo de nmero_pagamento, data_pagamento e total_pagamento. Um conjunto de entidades
fracas pode ser modelado de forma mais apropriada, como um atributo, se ele apenas participar da identificao
do relacionamento e ele tiver poucos atributos. Por outro lado, ser mais conveniente optar por um conjunto de
entidades fracas quando os conjuntos participantes no relacionamento no constiturem o relacionamento
identificador e quando o conjunto de entidades fracas possuir diversos atributos.
Recursos de Extenso do E-R
Apesar de ser possvel modelar a maioria dos banco de dados apenas com os conceitos bsicos do E-R,
alguns aspectos de um banco de dados podem ser expressos de modo mais conveniente por meio de algumas
extenses do modelo bsico do E-R.
Especializao
Um conjunto de entidades pode conter subgrupos de entidades que so, de alguma forma, diferentes de
outras entidades do conjunto. Por exemplo, um subconjunto de entidades dentro de um conjunto de entidades
pode possuir atributos que no so compartilhados pelas demais entidades do conjunto. O modelo E-R
proporciona um significado para a representao desses agrupamentos distintos entre as entidades.
Considere o conjunto de entidades conta com os atributos nmero_conta e saldo. Um saldo
futuramente classificado como um dos seguintes grupos:
conta_poupana
conta_movimento
Cada um desses tipos de contas descrito como um conjunto de atributos que, alm de todos os
atributos do conjunto de entidades conta, possui outros atributos adicionais. Por exemplo, as entidades
conta_poupana podem ser descritas pelo atributo taxa_juros, enquanto as entidades conta_movimento podero
possuir o limite_cheque_especial. O processo de especializao de conta permite-nos distinguir os tipos de
contas.
Um conjunto de entidades pode ser especializado por mais de uma caracterstica de diferenciao. Em
nosso exemplo, a distino entre as entidades conta seu tipo. Em nosso exemplo, a distino entre as entidades
conta seu tipo. Outra especializao coexistente poderia ser estabelecida entre os cheques especiais, resultando
nos conjuntos de entidades pessoa_fsica e pessoa_juridica. Quando mais de um tipo de especializao formado
em um conjunto de entidades, uma entidade em particular pode pertencer a pessoa_fisica e conta_movimento.
Podemos aplicar o agrupamento por especializao, repetidamente, para refinar o esquema que est
sendo projetado. Por exemplo, um banco pode oferecer os trs tipos de conta movimento:
1. Conta movimento padro com taxa de trs dlares mensais e 25 folhas de cheques por ms gratuitas.
Para essas contas, o banco emite o extrato bancrio mensal com os nmeros dos cheques.
2. Conta movimento especial que exige um saldo mnimo de mil dlares, pagando 2% em juros, e sem
limites na emisso de cheques. Neste caso, o banco monitora o saldo mnimo e os juros mensais pagos.
3. Conta movimento snior para clientes com idade superior a 65 anos que no pagam taxa de servios e
permite uso ilimitado de cheques, sem custo. Um registro sobre a data de aniversario do cliente
associado a esse tipo de conta.
A especializao da conta_movimento pelo tipo de conta cria os seguintes conjuntos de entidades:
1. Padro, com o atributo nmero_cheque.
2. Especial, com o atributo saldo_mnimo e taxa_juros.
3. Snior, com o atributo data_aniversrio.
102

Em termos de diagrama E-R, a especializao representada pelo tringulo rotulado de ISA, como demonstrado
na fig. 2.15. Este rtulo-padro ISA indica que, por exemplo, uma conta poupana uma conta. Este
relacionamento ISA pode ser tambm entendido como um relacionamento de super ou subclasse. Os conjuntos
de entidades em nvel superior e inferior so representados do mesmo modo que os conjuntos de entidades
regulares, ou seja, por um retngulo contendo o nome do conjunto de entidades.

Generalizao
O refinamento do conjunto de entidades em nveis sucessivos de subgrupos indica um processo top-down
de projeto, no qual as diferenciaes so feitas de modo explcito. O projeto pode ser realizado de modo bottomup, no qual vrios conjuntos de entidades so sintetizados em um conjunto de entidades em alto nvel, com base
em atributos comuns. O projetista do banco de dados poderia identificar, em uma primeira modelagem, o
conjunto de entidades conta_padro com os atributos nmero_conta, saldo e saldo_negativo e o conjunto de
entidades conta_poupanca com os atributos nmero_conta, saldo e taxa_juros.
Existem similaridades entre o conjunto de entidades conta_movimento e o conjunto de entidades
conta_poupana, j que possuem atributos comuns. Esse compartilhamento de atributos pode ser expresso pela
generalizao, que exprime o relacionamento existente entre os conjuntos de entidades de nvel superior e um
ou mais conjuntos de entidades de nvel inferior. E no nosso exemplo, conta um conjunto de entidades de nvel
superior e conta_poupana e conta)movimento so conjuntos de entidades de nvel inferior. Conjuntos de
entidades superiores e inferiores podem tambm ser designados em termos de super e subclasses,
respectivamente. O conjunto de entidades conta uma superclasse de conta_poupanca e conta_movimento so
subclasses.
Na prtica, a generalizao simplesmente o inverso da especializao. Aplicaremos ambos os processos,
combinados, ao longo do projeto do esquema E-R de uma empresa. Em termos do diagrama E-R propriamente
103

dito, no faremos distino entre a especializao e a generalizao. Novos nveis de representao de entidades
sero diferenciadas (especializao) ou sintetizadas (generalizao) de modo que o esquema possa expressar
totalmente a aplicao do banco de dados e atender s necessidades de seus usurios. As diferenas das duas
abordagens podem ser caracterizadas pelo ponto de partida e seus objetivos gerais.
A especializao parte de um nico conjunto de entidades; ela enfatiza as diferenas entre as entidades
pertencentes ao conjunto por meio do estabelecimento das diferenas expressas nos conjuntos de entidades de
nvel inferior. Estes conjuntos de entidades de nvel inferior podem possuir atributos, ou mesmo participar de
relacionamentos que no podem ser aplicados a todas as entidades do conjunto de entidades de nvel superior.
De fato, o projetista usa especializao justamente para representar tais distines. Se conta_poupana e
conta_movimento no possuem atributos nicos; no h necessidade de especializar o conjunto de entidades
conta.
O uso da generalizao procede para o reconhecimento de um nmero de conjunto de entidades que
compartilham caractersticas comuns (so descritos pelos mesmos atributos e participam dos mesmos conjuntos
de relacionamentos). Com base nessas caractersticas comuns, a generalizao sintetiza esses conjuntos de
entidades de nvel superior. A generalizao suada para enfatizar as similaridades entre os conjuntos de
entidades de nvel inferior, omitindo suas diferenas; isso permite tambm uma representao mais econmica,
evitando repeties de atributos compartilhados.
Herana de Atributos
Uma propriedade decisiva das entidades de nveis superior e inferior criadas pela especializao e pela
generalizao a herana de atributos. Os atributos dos conjuntos de entidades de nvel superior so herdados
pelos conjuntos de entidade de nvel inferior. Por exemplo, conta_poupana e conta_movimento herdam os
atributos de conta. Assim, conta_poupana identificado por seus atributos nmero_conta, saldo e taxa_juros;
conta_movimento identificado por seus atributos nmero_conta, saldo e limite_cheque_especial. Os conjuntos
de entidade de nvel inferior (ou subclasses) tambm herdam a participao em conjuntos de relacionamentos
dos quais participam seus conjuntos de entidades de nvel superior(ou superclasse). Tanto que o conjunto de
entidades conta_poupana e conta_movimento participam do conjunto de relacionamentos depositante. Os
conjuntos de entidades padro, especial e snior de nvel inferior herdam os atributos e a participao nos
relacionamentos de conta_movimento e conta.
Se uma dada poro do modelo E-R chegou especializao ou generalizao, os resultados so
basicamente os mesmos:
Conjuntos de entidades de nvel superior com atributos e relacionamentos que so aplicados a todos os
seus conjuntos de entidades de nvel inferior.
Conjunto de entidades de nvel inferior com caractersticas distintas que so apenas aplicadas a um
conjunto de entidades de nvel inferior em particular.
Como se percebe, embora frequentemente nos refiramos apenas generalizao, as propriedades que
discutimos pertencem totalmente a ambos os processos.
A fig. 2.15 apresenta uma hierarquia nos conjuntos de entidades. Na figura, conta_movimento um
conjunto de entidades de nvel superior aos conjuntos de entidades padro, especial e snior. Hierarquicamente,
um dado conjunto de entidades somente poder ser envolvido, como um conjunto de entidades de nvel inferior,
por meio de um relacionamento ISA. Se um conjunto de entidades um conjunto de entidades de nvel inferior
em mais de um relacionamento ISA, a estrutura resultante chamada reticulada.
Restries de Projeto
Para modelagem mais apurada de uma empresa, o projetista do banco de dados pode optar por definir
algumas restries em uma generalizao em particular. Um tipo de restrio envolve a determinao das

104

entidades que podem participar de um dado conjunto de entidades de nvel inferior. Tais escolhas podem ser
uma das seguintes:
Definida por condio. Um conjunto de entidades de nvel inferior definido por condio selecionado
com base na satisfao ou no de condies ou predicados preestabelecidos. Por exemplo, considere que
o conjunto de entidades de nvel superior conta possui o atributo tipo_conta. Todas as entidades conta
evoluem para um dos atributos tipo_conta. Somente aquelas entidades que satisfaam a condio
tipo_conta = conta_poupana, podem pertencer ao conjunto de entidades de nvel inferior
conta_poupana. Todas as entidades que satisfaam a condio tipo_conta = conta_movimento so
includas em conta movimento. Desde que todas as entidades de nvel inferior sejam classificadas com
base nos mesmos atributos (neste caso, tipo_conta), esse tipo de generalizao chamado
definida_por_atributo.
Definida pelo usurio. Um conjunto de entidades de baixo nvel definido pelo usurio no tem seus
membros classificados por uma condio; as entidades so designadas a um determinado conjunto de
entidades por usurios do banco de dados. Por exemplo, suponhamos que, depois de trs meses de
trabalho, os empregados do banco sejam convocados para compor um dentre os quatro grupo de
trabalho existentes. Esses grupos so representados por quatro conjuntos de entidades de baixo nvel,
derivados do conjunto de entidades de alto nvel empregado. A escolha de um determinado empregado
para participar de um conjunto de entidades de um grupo especfico no originada automaticamente
pela definio de uma condio explcita. Pelo contrrio, a escolha para compor determinado grupo
feita por critrios individuais, pesando na deciso a opinio do usurio, e sua implementao feita por
uma operao que adiciona a entidade ao conjunto de entidades.
O segundo tipo de restrio determina se uma entidade pode ou no pertencer a mais de um conjunto de
entidades de nvel inferior dentro de uma generalizao simples. Os conjuntos de entidades de nvel inferior
podem ser um dos seguintes:
Manuteno exclusivos. Restries mutuamente exclusivas exigem que uma entidade pertena a apenas
um conjunto de entidades de nvel inferior. Em nosso exemplo, uma entidade conta pode satisfazer a
apenas uma condio para o atributo tipo_conta; uma entidade pode ser tanto uma conta poupana
como uma conta movimento, mas nunca ambas.
Sobrepostos. Em generalizaes sobrepostas, uma mesma entidade pode pertencer a mais de um
conjunto de entidades de nvel inferior dentro de uma generalizao simples. Para ilustrao, retornemos
ao exemplo dos grupos de trabalho dos empregados do banco e suponhamos que determinados gerentes
participem de mais de um desses grupos. Um determinado empregado pode, portanto, pertencer a mais
de um conjunto de entidades formadas pelos grupos de trabalho.
Conjuntos de entidades de nvel inferior com sobreposio o caso-padro; restries mutuamente
exclusivas devem ser apresentadas explicitamente em uma generalizao (ou especializao).
Uma restrio final, a restrio de totalidade em uma generalizao, determina se uma entidade de nvel
superior pertence ou no a, no mnimo, um dos conjuntos de entidades de nvel inferior dentro da generalizao.
Essa restrio pode ser uma das seguintes:
Total. Cada entidade do conjunto de entidades de nvel superior deve pertencer a um conjunto de
entidades de nvel inferior.
Parcial. Qualquer entidade de nvel superior pode pertencer a qualquer um dos conjuntos de entidades
de nvel inferior.
A generalizao conta total: todas as entidades contas devem ser contas de poupana ou contas movimento.
Como os conjuntos de entidades de alto nvel de uma generalizao so, geralmente, compostos somente pelas
entidades de nvel inferior. O conjunto de entidades dos grupos de trabalho ilustram uma especializao parcial.
105

Desde que os empregados participem de um dos grupos somente aps trs meses de trabalho, algumas
entidades empregados podem no ser membros de qualquer um dos conjuntos de entidades de grupos de nvel
inferior.
Podemos caracterizar os conjuntos de entidades de grupos de modo completo como especializao
parcial e sobreposta de empregado. A generalizao conta_movimento e conta_poupana de conta total,
generalizao mutuamente exclusiva. As restries de totalidade e de sobreposio, entretanto, ano so
dependentes uma das outra. Os padres de generalizao podem ser parcial-mutuamente-exclusivas e totalsobrepostas.
Podemos ver que certas exigncias para inseres e excluses seguem restries que so aplicadas a
dadas generalizaes ou especializaes. Por exemplo, quando uma restrio total aplicada, uma entidade
inserida em um conjunto de entidades de nvel superior dever ser inserida em pelo menos um de seus conjuntos
de entidades de nvel inferior. Em restries definidas por condio, todas as entidades de nvel superior que
satisfaam tal condio devem ser inseridas nos conjuntos de entidades de nvel inferior. Finalmente, uma
entidade excluda de um conjunto de entidades de nvel superior tambm dever ser excluda de todos os
conjuntos de entidades de nvel inferior s quais pertencem.
Agregao
Uma das limitaes do modelo E-R que no possvel expressar relacionamentos entre
relacionamentos. Para ilustrar a necessidade desse tipo de construtor, consideremos novamente um banco de
dados descrevendo informaes sobre clientes e seus emprstimos. Suponha que cada par emprstimo-cliente
possui um bancrio, ou agente-emprstimo, responsvel pelo acompanhamento de determinado emprstimo.
Usando os construtores do modelo E-R bsico, obteramos o diagrama apresentado na fig. 2.16. Nota-se que o
conjunto de relacionamentos devedor e agente_emprstimo poderia ser combinado em um nico conjunto de
relacionamentos. No entanto, no podemos faz-lo, porque isso tornaria obscura a estrutura lgica desse
esquema. Por exemplo, se combinarmos os conjuntos de relacionamentos devedor e agente_emprestimo, essa
combinao deveria especificar que um agente-emprstimo especfico responsvel por uma par emprstimocliente, o que no ocorre. A separao em dois conjuntos de relacionamentos distintos resolve esse problema.
Entretanto, existe redundncia de informaes na figura resultante, uma vez que todo par emprstimocliente em agente_emprstimo est tambm em devedor. Se o agente_emprstimo fosse um valor, em vez de
uma entidade de empregado, poderamos fazer de agente_emprstimo um atributo multivalorado do
relacionamento devedor. Mas, assim, seria ainda mais difcil (nos custos de lgica e execuo) encontrar, por
exemplo, o par emprstimo-cliente pelo qual determinado bancrio responsvel.
J que um agente de emprstimo uma entidade empregado, essa alternativa descartada em qualquer
caso.

106

O melhor modo de modelar a situao acima descrita usando a agregao. Agregao a abstrao por
meio da qual os relacionamentos so tratados como entidades de nvel superior. Assim, em nosso exemplo,
simbolizamos o conjunto de relacionamentos devedor e o conjunto de entidades cliente e emprstimo como um
conjunto de entidades de nvel superior, chamado devedor.
Como um conjunto de entidades, tratado da mesma forma que qualquer outro conjunto de entidades.
A notao mais comum para a agregao mostrada na fig. 2.17.

107

Projeto de um Esquema de Banco de Dados E-R


O modelo de dados E-R nos d uma flexibilidade substancial par ao projeto de um esquema de banco de
dados na modelagem de determinada empresa. Vamos agora considerar quais as opes possveis para o
projetista dentre o grande nmero de possibilidades. Algumas das possveis opes so:
Optar pelo uso de um atributo ou de um conjunto de entidades para representao de um objeto.
Se uma concepo real expressa de modo mais preciso por um conjunto de entidades ou por um
conjunto de relacionamentos.
Optar por um conjunto de relacionamentos ternrio ou por um par de relacionamento binrio.
Se se deve usar um conjunto de entidades forte. Um conjunto de entidades forte e seus conjuntos de
entidades fracas dependentes podem ser visto como um nico objeto do banco de dados, j que as
entidades fracas tm sua existncia vinculada de uma entidade forte.
Se o uso da generalizao apropriado. A generalizao, ou uma hierarquia de relacionamentos ISA,
contribui para a modularidade, j que atributos comuns a conjuntos de entidades similares podem ser
representados em apenas um local do diagrama E-R.
Se o uso da agregao for apropriado, agregar grupos de uma parte do diagrama E-R em um conjunto de
entidades simples, permitindo-nos tratar do conjunto de entidades agregadas como uma unidade
simples, sem abordar os detalhes de suas estruturas internas.
Podemos notar que um projetista de banco de dados necessidade de um bom entendimento da empresa
que est sendo modelada para que possa tomar essas decises.
Fases de Projeto
108

Um modelo de dados de alto nvel proporciona ao projetista uma base conceitual na qual se pode
especificar, de modo sistemtico, quais as necessidades dos usurios do banco de dados e como este banco de
dados ser estruturado para atender plenamente a todas estas necessidades. A fase inicial do projeto
caracterizar todos os dados necessrios na perspectiva do usurio. O resultado dessa fase a especificao das
necessidades do usurio (ou levantamento de requisitos).
A seguir, o projetista escolhe o modelo de dados e, por meio da aplicao de seus conceitos, transcreve as
necessidades especificadas em um esquema conceitual de banco de dados. O esquema desenvolvido nessa fase
chamado projeto conceitual e proporcional uma viso detalhada da empresa. Como s estudamos o modelo E-R
at agora, iremos us-lo para o desenvolvimento do esquema conceitual. Empregando os termos do modelo E-R,
o esquema deve especificar todos os conjuntos de entidades, relacionamentos, atributos e o mapeamento das
restries. O projetista rev o esquema para confirmar se todos os dados exigidos esto de fato representados e
se no h conflitos entre eles. Ele dever tambm examinar o projeto para remover qualquer tipo de
redundncia. Neste momento, seu enfoque descrever os dados e seus relacionamentos, em vez de especificar
os detalhes fsicos de armazenamento.
O desenvolvimento completo do esquema conceitual ir indicar tambm as necessidades funcionais da
empresa. Na especificao das necessidades funcionais, os usurios descrevem os tipos de operaes (ou
transaes) que sero realizados nos dados. Os exemplos dessas operaes incluem modificao para atualizao
dos dados, pesquisa para recuperao de um determinado dado e remoo de dados. Dever ser feita, nesse
estgio do projeto conceitual, uma reviso do esquema dos dados em funo das necessidades funcionais.
O transporte do modelo de dados abstrato, para sua implementao, ocorre nas duas fases finais do
projeto. Na fase de projeto lgico, o esquema conceitual de alto nvel mapeado para o modelo de
implementao de dados do SGBD que ser usado. O esquema de dados resultante usado para a fase
subsequente, que a do projeto fsico, especificamente dependente dos recursos do SGBD usado. Esses recursos
incluem as formas de organizao de arquivos e estruturas internas de armazenamento.
Vamos abordar somente os conceitos do modelo E-R como usados na fase do projeto do esquema
conceitual.
Dados Necessrios a uma Empresa da rea Bancria
A especificao dos requisitos dos usurios pode ser apurada por meio de entrevistas unidas prpria
avaliao do projetista sobre a empresa.
A descrio resultante dessa fase do projeto a base para a especificao da estrutura conceitual do
banco de dados. A lista de itens que se segue apresenta as principais necessidades de uma empresa da rea
bancria.
Um banco organizado em agncias. Cada agncia localizada em uma cidade e identificada por um
nome nico. O banco controla os fundos de cada uma dessas agncias.
Os clientes do banco so identificados pelo nmero do seu seguro social. O banco mantm dados como
nome, rua, e cidade do cliente. Os clientes podem possuir contas e contrair emprstimos. O cliente pode
estar associado a um bancrio especfico que cuida de seus negcios ou atua como um agente de
emprstimos.
Os empregados do banco tambm so identificados por meio do seu seguro social. A administrao do
banco mantm o nome e o nmero do telefone de cada um de seus empregados, os nomes de seus
dependentes e o nmero do seguro social de seu gerente. O banco tambm possui a data de contrata do
empregado e, com isso, seu tempo de trabalho.
O banco oferece dois tipos de contas contas poupana e contas movimento. As contas movimento
podem possuir mais de um correntista, e um correntista pode possuir mais de uma conta. Cada conta
possui um nico nmero. O banco controla o saldo de cada conta, assim como a data mais recente de
acesso a essa conta. Por outro lado, cada conta poupana possui a taxa de juros associada, assim como
so tambm registrados os excessos nos limites da conta movimento.
109

Um emprstimo originado em uma agncia em particular pode ter sido obtido por um ou mais clientes.
Um emprstimo identificado por um nmero nico. Para cada emprstimo o banco mantm o
montante emprestado, assim como os pagamentos das parcelas. Embora o nmero das parcelas de um
emprstimos no identifique de modo nico um pagamento especfico dentre os muitos realizados no
banco, o nmero da parcela identifica um pagamento especfico dentre os muitos realizados no banco, o
nmero da parcela identifica um pagamento efetuado para um emprstimo em particular. A data e o
montante so registrados no pagamento de cada parcela.

Em um banco real, poderia ser de interesse manter informaes sobre depsitos e retiradas tanto para as contas
poupana quanto para as contas movimento, assim como se mantm informaes sobre o pagamento de
parcelas dos emprstimos. Uma vez que a modelagem dos requisitos dos usurios nas necessidades descritas a
pouco so semelhantes quelas feitas no incio, podemos optar por um exemplo de aplicao mais reduzido, no
fazendo, em nosso modelo, o acompanhamento dos depsitos e das retiradas.
Designao de Conjuntos de Entidades em Empresas Bancrias
Nossa especificao dos requisitos de dados servem como base inicial para a construo de um esquema
conceitual do banco de dados.
Para as especificaes relacionadas, comeamos por identificar os conjuntos de dados e seus atributos.
O conjunto de entidades agncia, com os atributos:
nome_agncia, cidade_agncia, e fundos
O conjunto de entidades cliente, com os atributos:
nome_cliente, seguro_social, rua_cliente e cidade_cliente
Com a possibilidade do atributo adicional nome_bancrio.
O conjunto de entidades empregado, com os atributos:
seguro_social_empregado, nome_empregado, nmero_telefone, salario e gerente.
Recursos adicionais descritivos so os atributos multivalorados nome_dependentes, o atributo bsico
data_incio e o atributo descritivo tempo_de_trabalho.
Dois conjuntos de entidades contas conta_poupana e conta_movimento com os atributos comuns
nmero_conta e saldo; tambm, conta_poupana possui o atributo taxa_de_juros e conta_movimento, o
atributo limite_cheque_especial.
O conjunto de entidades emprstimo, com os atributos:
nmero_emprstimo, total e agncia_origem
So possveis os seguintes atributos adicionais: pagamento_emprstimo, composto multivalorado; com os
seguintes atributos componentes:
nmero_pagamento, data_pagamento e total_pagamento
Designao dos conjuntos de Relacionamentos de uma Empresa da rea Bancria
Retornemos agora ao esquema do projeto descrito para especificar os seguintes conjuntos de
relacionamentos e mapeamentos de cardinalidades:
devedor, como conjunto de relacionamentos muitos para um que indica qual a agncia responsvel pelo
emprstimo.
pagamento_emprstimo, relacionamento um para muitos entre emprstimo e pagamento, que
documento que um pagamento est sendo feito para um determinado emprstimo.
depositante, com os atributos de relacionamento data_acesso, um conjunto de relacionamentos muitos
para muitos entre cliente e conta, indicando que um cliente possui uma conta.

110

agente_cliente, com o atributo de relacionamento tipo, um conjunto de relacionamentos muitos para um


expressando que um cliente pode ser atendido por determinado empregado do banco e que um
empregado do banco pode atender a um ou mais clientes.
trabalha_para, conjunto de relacionamentos entre entidades empregado que determina se se trata de
gerente ou empregado; o mapeamento da cardinalidade expressa que um empregado trabalha para um
gerente especfico e que um gerente supervisiona um ou mais empregados.

Note que trocamos o atributo nome_agente do conjunto de entidades cliente pelo conjunto de relacionamentos
agente_cliente, e o atributo gerente do conjunto de entidades empregado pelo conjunto de relacionamentos
trabalha_para. Optamos por manter o conjunto de entidades emprstimo. O conjunto de relacionamentos
agncia_emprstimo e pagamento_emprstimo foi substitudo, respectivamente, pelos atributos agncia_origem
e pagamento_emprstimo do conjunto de entidades emprstimo.
Digrama E-R de uma Emprstimo de uma Empresa da rea Bancria
Esquematizando, apresentamos agora o diagrama E-R completo para nosso exemplo de empresa da rea
bancria. A fig. 2.18 mostra a representao de um modelo conceitual de um banco, expresso nos termos
conceituais de E-R. O diagrama inclui os conjuntos de entidades, atributos, conjuntos de relacionamentos e o
mapeamento das cardinalidades concludas durante o processo descrito anteriormente, e j refinado.

111

Reduo de um Esquema E-R a Tabelas


Um banco de dados em conformidade com o esquema de banco de dados E-R pode ser representado por
uma coleo de tabelas. Para cada conjunto de entidades e para cada relacionamentos, dentro de um banco de
dados, existe uma tabela nica registrando o nome do conjunto de entidades ou relacionamentos
correspondentes. Cada tabela possui vrias colunas, cada uma delas com um nico nome.
Tanto o modelo E-R quanto o modelo relacional so abstratos, ou seja, representaes lgicas de
empresas reais. Como esses dois modelos empregam princpios de projetos similares, podemos converte o
projeto E-R em projeto relacional. Converter a representao de um banco de dados de um diagrama E-R para um
formato de tabela a base para a derivao de um diagrama E-R de um projeto a partir de um banco de dados
relacional. Embora existam importantes diferenas entre uma relao e uma tabela, informalmente, uma relao
pode ser considerada uma tabela de valores.
Representao Tabular dos Conjuntos de Entidades Fortes

112

Seja E um conjunto de entidades fortes descrito pelos atributos a1, a2, ..., an. Representamos essa
entidade por uma tabela chamada E com n colunas distintas, cada uma delas correspondendo a um dos atributos
de E. Cada linha da tabela corresponde a uma entidade do conjunto de entidades E.
Como ilustrao, considere o conjunto de entidades emprstimo do diagrama E-R mostrado na fig. 2.8.
Esse conjunto de entidades possui dois atributos: nmero_emprstimo e total. Representaremos esse conjunto
de entidades pela tabela chamada emprstimo, com duas colunas, como mostra a fig. 2.19. A linha (L-17, 1000)
da tabela emprstimo significa que o emprstimo de nmero L-17 de mil dlares. Podemos adicionar uma nova
entidade ao banco de dados pela insero de uma linha na tabela. Tambm podemos excluir ou modificar as
linhas.

Denotaremos como D1 o conjunto de todos os nmeros de emprstimos e D2 o conjunto de todos os


saldos. Qualquer linha da tabela emprstimo deve consistir de uma 2-tupla (v1, v2), em que v1 um emprstimo
(isto , v1 est no conjunto D1) e v2 um total (isto , v2 est no conjunto D2). No geral, a tabela emprstimo
conter somente o subconjunto de todas as linhas possveis. Iremos nos referir ao conjunto de todas as linhas
possveis de emprstimo como o produto cartesiano de D1 e D2, denotado por: D1xD2.
No geral, se tivermos uma tabela com n colunas, denotaremos o produto cartesiano de D1, D2, ..., Dn por:
Como outro exemplo, considere o conjunto de entidades cliente do diagrama E-R mostrado na fig. 2.8.
Esse conjunto de entidades tem os atributos nome_cliente, seguro_social, rua_cliente e cidade_cliente. A tabela
correspondente a cliente tem quatro colunas, como mostra a fig. 2.20.

Representao Tabular dos Conjuntos de Entidades Fracas


Seja A um conjunto de entidades fracas com os atributos a1, a2, ..., an. Seja B um conjunto de entidades
fortes, do qual A dependente. Seja a chave primria de B composta pelos atributos b1, b2, ..., bn. Representamos
o conjunto de entidades A pela tabela chamada A com uma coluna para cada um dos atributos do conjunto:
113

Como ilustrao, considere o conjunto de entidades pagamento mostrado no diagrama E-R da fig. 2.14.
Esse conjunto de entidades tem trs atributos: nmero_pagamento, data_pagamento e total_pagamento. A
chave primria do conjunto de entidades emprstimo, do qual pagamento dependente, o
nmero_emprstimo. Assim, pagamento representado por uma tabela com quatro colunas chamadas
nmero_emprstimo, nmero_pagamento, data_pagamento e total_pagamento, como mostrado na fig. 2.21.

Representao Tabular do Conjunto de Relacionamentos


Seja R um conjunto de relacionamentos; seja a1, a2, ..., an o conjunto de atributos formado pela unio das
chaves primarias de cada um dos conjuntos de entidades participantes de R; e seja os atributos descritivos b1, b2,
..., bn (se houver) de R. Representamos esse conjunto de relacionamentos pela tabela chamada R, com uma
coluna para cada atributo do conjunto:
Para ilustrar, considere o conjunto de relacionamentos devedor no diagrama E-R da fig. 2.8. Esse conjunto
de relacionamentos envolve os dois conjuntos de entidades seguintes:
cliente, com a chave primria seguro_social.
Emprstimo, com a chave primria nmero_emprstimo.
Uma vez que o conjunto de relacionamentos no possui atributos prprios, a tabela devedor possui duas colunas,
a de seguro_social e nmero_emprstimo, como mostra a fig. 2.22.

Tabelas Redundantes
114

O caso do conjunto de relacionamentos unindo um conjunto de entidades fracas ao seu conjunto de


entidades fortes correspondente um caso especial. Como pudemos ver anteriormente, esses relacionamentos
so muitos para um e no possuem atributos descritivos. Alm disso, a chave primria de um conjunto de
entidades fracas inclui a chave primria do conjunto de entidades fortes. No diagrama E-R da fig. 2.14, o conjunto
de entidades fracas pagamento dependente do conjunto de entidades fortes emprstimo por meio do conjunto
de relacionamentos pagamento_emprstimo. A chave primria de pagamento {nmero_emprstimo,
nmero_pagamento} e a chave primria de emprstimo {nmero_emprstimo}. Desde que
pagamento_emprstimo no possui atributos descritivos, a tabela para pagamento_emprstimo poderia ter duas
colunas, nmero_emprstimo e nmero_pagamento. A tabela para o conjunto de entidades pagamento tem
quatro colunas, nmero_emprstimo, nmero_pagamento, data_pagamento e total_pagamento. Assim, a tabela
pagamento_emprstimo redundante. Em geral, a tabela para o conjunto de relacionamentos unindo o conjunto
de entidades fracas com seu conjunto de entidades fortes correspondente redundante e no precisa ser
apresentada em uma representao tabular do diagrama E-R.
Combinao de tabelas
Considere um conjunto de relacionamento muitos para um AB entre os conjuntos de entidades A e B.
Usando nosso esquema de construo de tabelas previamente descrito, teremos trs tabelas: A, B e AB.
Entretanto, se existe dependncia de A sobre B (isto , para cada entidade a em A, a existncia de a depende da
existncia de alguma entidade b em B), ento podemos combinar as tabelas A e AB para formar uma tabela
simples consistindo da unio das colunas de ambas as tabelas.
Como ilustrao, considere o diagrama E-R da fig. 2.23. O conjunto de relacionamentos entre conta e
agncia, agncia_conta, muitos para um. Daqui para frente, uma linha dupla no diagrama E-R indica que a
participao de conta em conta_agncia total. Da, uma conta no pode existir sem que esteja associada a uma
agncia em particular. Portanto, necessitamos somente de duas tabelas:
conta, com os atributos nmero_conta, saldo e nome_agncia.
agncia, com atributos nome_agncia, cidade_agncia e fundos.

Atributos Multivalorados
Vimos que, em geral, os atributos do diagrama E-R so mapeados diretamente em colunas nas tabelas
apropriadas. Atributos multivalorados, entretanto, constituem uma exceo; novas tabelas so criadas para esses
tipos de atributos.
Para um atributo multivalorado M, criamos a tabela T com uma coluna C que corresponde a M e as
colunas correspondentes chave primria do conjunto de entidades ou conjunto de relacionamento do qual M
atributo. Como ilustrao, considere o diagrama E-R apresentado na fig. 2.18. o diagrama inclui o atributo
multivalorado nome_dependente. Para esse atributo multivalorado, criamos a tabela nome_dependente com as
colunas nomed, referente ao atributo nome_dependente do empregado, e seguro_social_empregado,

115

representando a chave primria do conjunto de entidades empregado. Cada dependente de um empregado


representado por uma nica linha na tabela.
Representao Tabular da Generalizao
Existem dois modos diferentes de transformar um diagrama E-R que contenha generalizao em tabelas.
Embora nos refiramos generalizao mostrada na fig. 2.15, preferimos simplificar essa discusso incluindo
somente o primeiro grupo dos conjuntos de entidades de nvel inferior isto , os atributos conta_poupana e
conta_movimento.
1. Criar a tabela para o conjunto de entidades de nvel superior. Para cada conjunto de entidades de nvel
inferior, criar uma tabela que inclua uma coluna para cada um dos coluna para cada um dos atributos
daquele conjunto de entidades mais uma coluna para cada atributo da chave primria do conjunto de
entidades mais uma coluna para cada atributo da chave primria do conjunto de entidades de nvel
superior. Assim, para o diagrama da fig. 2.15, teremos trs tabelas:
conta, com os atributos nmero_conta e saldo.
conta_poupana, com os atributos nmero_conta e taxa_juros.
conta_movimento, com os atributos nmero_conta e limite_cheque_especial.
2. Se a generalizao mutuamente exclusiva e total isto , se nenhuma entidade membro de mais de
um conjunto de entidades de nvel imediatamente inferior ao conjunto de entidades de nvel superior e
se todas as entidades do conjunto de entidades de nvel inferior , ento, uma outra representao
alternativa possvel. Para cada conjunto de entidades de nvel inferior, cria-se uma tabela que inclua
uma coluna para cada um dos atributos do conjunto de entidades mais uma coluna para cada atributo do
conjunto de entidades de nvel superior. Ento, para o diagrama E-R da fig. 2.15, teremos duas tabelas.
Conta_poupana, com atributos nmero_conta, saldo e taxa_juros.
Conta_movimento, com os atributos nmero_conta, saldo e limite_cheque_especial.
As relaes correspondentes a conta_poupana e conta_movimento para essas tabelas tm, ambas, saldo
como chave primria.
Se o segundo mtodo for usado para generalizaes com sobreposio, alguns valores, como saldo,
podem ser armazenados duas vezes sem necessidade. Similarmente, se a generalizao no for total isto , se
algumas contas no forem nem de poupana nem de movimento, ento tais contas no podero ser
representadas usando o segundo mtodo.
Representao Tabular da Agregao
A transformao de um diagrama E-R com agregao para forma tabular bastante direta. Considere o
diagrama da fig. 2.17. A tabela para o conjunto de relacionamentos agente_emprstimo inclui uma coluna para
cada atributo, uma para a chave primria do conjunto de entidades empregado e uma para o conjunto de
relacionamentos devedor. Poderia tambm incluir uma coluna para cada um dos atributos descritivos do
conjunto de relacionamentos agente_emprstimo, se eles existirem. Usando o mesmo procedimento anterior
para o resto do diagrama, criamos as seguintes tabelas:
cliente, com os atributos nome_cliente, seguro_social, rua_cliente e cidade_cliente.
emprstimo, com os atributos nmero_emprstimo e total.
devedor, com os atributos seguro_social e nmero_emprstimo.
empregado, com os atributos seguro_social_empregado, nome_empregado, e nmero_telefone.
agente_emprstimo, com os atributos seguro_social, nmero_emprstimo e seguro_social_empregado.

116

Arquiteturas de Sistemas de Banco de Dados


A arquitetura de um sistema de banco de dados fortemente influenciada pelo sistema bsico
computacional sobre o qual o sistema de banco de dados executado. Aspectos da arquitetura de computadores
como rede, paralelismo e distribuio tm influncia na arquitetura do banco de dados.
Rede de computadores permite que algumas tarefas sejam executadas no servidor do sistema e outras
sejam executadas no cliente. Essa diviso de trabalho tem levado ao desenvolvimento de sistemas de
banco de dados cliente-servidor.
Processamento paralelo em um sistema de computadores permite que atividades do sistema de banco de
dados sejam realizadas com mais rapidez, reduzindo o tempo de resposta das transaes e, assim,
aumentando o nmero de transaes processadas por segundo. Consultas podem ser processadas de
forma a explorar o paralelismo oferecido pelo sistema operacional. A necessidade de processamento
paralelo de consultas tem levado ao desenvolvimento de sistemas de banco de dados paralelos.
A distribuio de dados pelos ns da rede ou pelos diversos departamentos de uma organizao
permitem que esses dados residam onde so gerados ou mais utilizados, mas, ainda assim, estejam
acessveis para outros ns de outros departamentos. Dispor de diversas cpias de um banco de dados em
diferentes ns tambm permite a organizaes de grande porte manter operaes em seus bancos de
dados mesmo quando um n afetado por um desastre natural, como inundaes, incndios ou
terremotos. Sistemas de banco de dados distribudos tm se desenvolvido para tratar dados distribudos
geogrfica ou administrativamente por diversos sistemas de banco de dados.
Vamos agora estudar a arquitetura dos sistemas de banco de dados, comeando com os sistemas
centralizados tradicionais e passando por sistemas de banco de dados cliente-servidor, paralelos e distribudos.
Sistemas Centralizados
Sistemas de banco de dados centralizados so aqueles executados sobre um nico sistema computacional
que n ao interagem com outros sistemas. Tais sistemas podem ter a envergadura de um sistema de banco de
dados de um s usurio executado em um computador pessoal at sistemas de alto desempenho em sistema de
grande porte.
Um sistema computacional genrico moderno consiste em uma ou poucas CPUs e dispositivos de controle
que so conectados por meio de um bus comum que proporciona acesso memria compartilhada (fig. 16.1). As
CPUs tm memrias cache locais que armazenam cpias de partes da memria para acesso rpido aos dados.
Cada dispositivo de controle atende a um tipo especfico de dispositivo (por exemplo, um drive de disco, um
dispositivo de udio ou de vdeo). A CPU e os dispositivos de controle podem trabalhar concorrentemente,
competindo pelo acesso memria. A memria cache parcialmente reduz a conteno de acesso memria,
uma vez que reduz o nmero de tentativas de acesso da CPU memria compartilhada.

117

Dividimos em dois modos a forma pela qual os computadores so usados: por um sistema de um nico
usurio e sistemas multiusurios. Computadores pessoais e estaes de trabalho caem na primeira categoria. Um
sistema monousurio tpico uma unidade de trabalho de uma nica pessoa, com uma nica CPU e um ou dois
discos rgidos, com um sistema operacional que pode dar suporte a apenas um nico usurio. Um sistema
multiusurio tpico, por outro lado, possui um nmero maior de discos e rea de memria, podendo ter diversas
CPUs e um sistema operacional multiusurio. Atende a um grande nmero de usurios que esto conectados ao
sistema por meio de terminais. Tais sistemas so frequentemente chamados de sistemas servidor.
Sistemas de banco de dados projetados para ser monousurios, como os de computadores pessoais,
normalmente no proporcionam muitos recursos comuns aos banco de dados multiusurios. Em particular, ele
no do suporte ao controle de concorrncia, o que no necessrio quando somente um usurio pode gerar
atualizaes.
A recuperao de perdas nesse tipo de sistema , seno inexistente, primitiva por exemplo, fazendo um
backup do banco de dados antes de qualquer atualizao. Muitos desses sistemas no do suporte SQL,
fornecendo linguagens de consulta bem mais simples, como uma variante da QBE.
Embora os sistemas de computadores de propsito geral possuam atualmente mltiplos processadores,
eles tm paralelismo de granulao-grossa, com um nmero limitado de processadores (entre dois e quatro,
normalmente), todos compartilhando a memria principal. Os banco de dados rodando em tais equipamentos
normalmente no promovem o particionamento de uma consulta entre processadores: ao contrrio, cada
consulta roda em um nico processador, permitindo que diversas consultas sejam executada concorrentemente.
Assim, tais sistemas proporcionam alto throughput, isto , um grande nmero de transaes processador por
segundo, embora uma transao, individualmente, no seja necessariamente processada com maior rapidez.
Banco de dados processados em equipamento de um s processador j dispem de recursos multitarefas,
nos quais diversos processos podem ser executados em um mesmo processador de modo compartilhado, dando
ao usurio a impresso de que diversos processos so executados em paralelo. Assim, equipamentos com
paralelismo de granulao-grossa parecem, na lgica, idnticos a um equipamento de um nico processador;
sistemas de banco de dados projetados para equipamentos time-shared podem facilmente ser adaptados para
esse ambiente.
Em contrate, os equipamentos de granulao-fina tm um grande nmero de processadores, e os
sistemas de banco de dados rodando nesse tipo de equipamento podem processar unidades de tarefas
(consultas, por exemplo) submetidas pelos usurios em paralelo.
118

Sistemas Cliente-Servidor
Como os computadores pessoais tm se tornado mais rpidos, mais poderosos e baratos, h uma
tendncia de seu uso nos sistemas centralizados. Terminais conectados a sistemas centralizados esto sendo
substitudos por computadores pessoais. Simultaneamente, interfaces com o usurio usadas funcionalmente para
manuseio direto com sistemas centralizados esto sendo adequadas ao trato com computadores pessoais.
Como resultado, sistemas centralizados atualmente agem como sistemas servidores que atendem a
solicitaes de sistemas clientes. A estrutura geral de um sistema cliente-servidor exibida na fig. 16.2.
As funcionalidades de um banco de dados podem ser superficialmente divididas em duas categorias
front-end e back-end como mostra a fig. 16.3. O back-end gerencia as estruturas de acesso, desenvolvimento e
otimizao de consultas, controle de concorrncia e recuperao. O front-end dos sistemas de banco de dados
consiste em ferramentas como formulrios, gerador de relatrios e recursos de interface grfica. A interface
entre front-end e o back-end feita por meio da SQL ou de um programa de aplicao.

Sistemas servidores podem ser caracterizados, de modo geral, como servidores de transaes e
servidores de dados.
Sistemas servidores de transaes, tambm chamados sistemas servidores de consultas (query-server),
proporcionam uma interface por meio da qual os clientes podem enviar pedidos para determinada ao
e, em resposta, eles executam a ao e mandam de volta os resultados ao cliente. Usurios podem
especificar pedidos por SQL ou por meio de um programa de aplicao usando um mecanismo de
chamada de procedimento remota (remote-procedure-call).
Sistemas servidores de dados permitem que os servidores interajam com clientes que fazem solicitaes
de leitura e atualizao de dados em unidades como arquivos ou pginas. Por exemplo, servidores de
arquivos que proporcionam uma interface sistema-arquivo na qual os clientes podem criar, atualizar, ler e
remover arquivos. Servidores de dados para sistemas de banco de dados oferecem muito mais recursos:
do suporte a unidades de dados como pginas, tuplas ou objetos menores que um arquivo.
Proporcionam meios para indexao de dados e transaes, tal que os dados nunca se tornem
inconsistentes se um equipamento cliente ou processo falhar.

119

Servidores de Transaes
Em sistemas centralizados, o front-end e o back-end so ambos executados dentro de um nico sistema.
Entretanto, a arquitetura de servidores de transaes segue a diviso funcional entre front-end e back-end.
Devido grande exigncia de processamento para cdigo de interface grfica e ao aumento do poder de
processamento dos computadores pessoais, o recurso para front-end possvel em computadores pessoais. Os
computadores pessoais agem como clientes de sistemas servidores, os quais armazenam grandes volumes de
dados e do suporte aos recursos de back-end. Clientes enviam solicitaes ao sistema servidor no qual essas
transaes so executadas e os resultados so enviados de volta ao cliente que tem a responsabilidade de exibir
esses dados.
Padres do tipo ODBC (open database connectivity) visam atender interface de clientes e servidores.
ODBC so programas de aplicao de interface que possibilitam aos clientes a criao de comandos SQL que so
enviados para o servidor, no qual so executados. Qualquer cliente que use uma interface ODBC pode se conectar
a qualquer servidor que fornea essa interface. Nas primeiras geraes de sistemas de banco de dados, a falta
desse tipo de padro levou ao uso de software de mesmo fabricante tanto para back-end quanto para front-end.
Com a difuso de padres para interfaces, diversos fabricantes passaram a disponibilizar ferramentas de
front-end e os servidores back-end. Gupta SQL e PowerBuilder so exemplos de sistemas front-end
independentes dos servidores back-end. Logo, alguns programas de aplicao, como as planilhas eletrnicas e
pacotes para anlise estatstica, usaro interfaces cliente-servidor para acesso direto aos dados de um servidor
back-end. Com efeito, eles funcionam como front-ends especializados para tarefas especficas.
Interfaces cliente-servidor no ODBC so tambm usadas para alguns sistemas de processamento de
transaes. So definidas por uma interface de programa de aplicao na qual os clientes enviam chamadas de
procedimento transacional remota (transactional remote procedure call) para o servidor. Essas chamadas
parecem chamadas de procedimentos simples feitas por programas, mas, na verdade, todas as chamadas de
procedimentos simples feitas por programas, mas, na verdade, todas as chamadas de procedimentos remotas
feitas pelo cliente so encapsuladas em uma nica transao para o servidor. Assim, se a transao for abortada,
o servidor poder reverter os resultados da chamada de procedimento remota.
Como os equipamentos pequenos e individuais apresentam atualmente custo bem menor de aquisio e
manuteno, as grandes corporaes tendem a adotar o down-sizing. Muitas empresas esto substituindo seus
equipamentos de grande porte por redes de computadores com estacoes de trabalho ou computadores pessoais
conectados a equipamentos servidores back-end. Algumas das vantagens so a maior funcionalidade e o menor
custo, mais flexibilidade na disseminao, expanso e alocao dos recursos, melhores interfaces com os usurios
e manuteno mais fcil.
Servidores de dados
Sistemas servidores de dados so usados em redes locais, nas quais h conexes de alta velocidade entre
clientes e servidores, os equipamentos clientes so comparveis, em poder de processamento, aos equipamentos
servidores e as tarefas executadas so do tipo processamento intensivo. Em tal ambiente, faz sentido o trfego de
dados para o equipamento cliente, para o processamento local (o que pode levar certo tempo) e ento o envio
dos dados de volta para o servidor. Note que essa arquitetura exige ampla funcionalidade back-end (fig. 16.3) nos
clientes. Arquiteturas de servidores de dados tm sido comuns nos sistemas de banco de dados orientados a
objetos.
A origem do interesse nesse tipo de arquitetura surge a partir do momento em que o custo, relativo ao
consumo de tempo, da comunicao entre cliente e servidor alta comparada ao tempo de referncia memria
local (milissegundos versus menos de cem nanossegundos).
Transmisso de pginas versus transferncia de itens. A unidade de comunicao para os dados pode ser
de granularidade grossa, como uma pgina, ou de granularidade fina, como uma tupla (ou um objeto, no
contexto de banco de dados orientado a objetos).

120

Se a unidade de comunicao um nico item, o overhead para a troca de mensagens alto se


comparado ao volume de dados transmitido. Quando um item solicitado, faz sentido tambm enviar
outros itens que certamente sero usados em um futuro prximo. A busca de itens antes mesmo que
sejam solicitados chamada prefetching. A transferncia de pginas pode ser considerada uma forma de
prefetching se diversos itens residirem em uma mesma pgina, j que todos os itens na pgina so
transferidos quando um processo deseja ter acesso a um nico item de uma pgina.
Bloqueio. Os bloqueios, em geral, so utilizados pelo servidor em itens de dados transitando entre
clientes. Uma desvantagem da transferncia de pginas que as mquinas clientes precisam bloquear a
unidade da granularidade um bloqueio de uma pgina implica o bloqueio de todos os itens dessa
pgina. Mesmo que o cliente no esteja acessando mais de um item dessa pgina, fica implcito o
bloqueio sobre todos os itens reservados. Outro cliente que solicite bloqueio nesses itens ser impedido
desnecessariamente. Algumas tcnicas para escala de liberao de bloqueio (lock deescalation) j foram
propostas, nas quais o servidor pode solicitar de volta para seus clientes a transferncia dos bloqueios
dos itens reservados. Se o cliente no precisar de um item reservado, ele pode transferir o bloqueio do
item de volta ao servidor, que ento pode ser bloqueado por outro cliente.
Data caching. Os dados que navegam para um cliente durante uma transao pode ser cached no cliente,
mesmo depois de completada a transao, se houver espao suficiente disponvel. Transaes sucessivas
em um mesmo cliente podem acarretar o uso de dados cached. Entretanto, o uso de cache exige certa
coerncia: mesmo que uma transao ache um dado cached, preciso ter certeza de que esse dado
esteja atualizado, uma vez que ele pode ter sido alterado por um outro cliente depois de ter sido
colocado em cache. Assim, uma mensagem precisar ainda ser trocada com o servidor para checar a
validade e conseguir um bloqueio sobre o dado.
Bloqueio cache (lock caching). Se os dados forem bem particionados entre os clientes, com um cliente
raramente solicitando um dado ao mesmo tempo que outro, os bloqueios podem tambm ser
armazenados localmente (cached) no equipamento cliente. Suponha que um item de dado esteja em
cache e que o bloqueio solicitado para acesso a esse dado tambm esteja em cache. Ento, o acesso pode
ser realizado sem qualquer comunicao com o servidor. Entretanto, o servidor precisa controlar os
bloqueios em cache: se um cliente solicita um bloqueio ao servidor, o servidor precisa recuperar todos os
bloqueios em conflito de itens de dados de qualquer outro equipamento cliente que possua bloqueio em
cache. Essa tarefa torna-se muito mais complicada quando so consideradas as falhas de equipamento.
Essa tcnica difere da escala de liberao de bloqueios apenas pelo fato de ser realizada ao longo da
transao; de resto, ambas as tcnicas so similares.

Sistemas Paralelos
Sistemas paralelos imprimem velocidade ao processamento e I/O por meio do uso em paralelos de
diversas CPUs e discos. Equipamentos paralelos esto se tornando bastante comuns, fazendo com que o estudo
de sistema de bancos de dados paralelos seja tambm cada vez mais importante. O direcionamento das atenes
para os sistemas de banco de dados paralelos proveem da demanda de aplicaes que geram consultas em banco
de dados muito grandes (da ordem de terabytes isto , 1012 bytes) ou que tenham de processar um volume
enorme de transaes por segundo (da ordem de milhares de transaes por segundo). Sistemas de banco de
dados centralizados e cliente-servidor no so poderosos o suficiente para tratar desse tipo de aplicao.
No processamento paralelo, muitas operaes so realizadas simultaneamente, ao contrrio do
processamento serial, no qual os passos do processamento so sucessivos. Um equipamento paralelo de
granulao-grossa consiste em poucos e poderosos processadores; um paralelismo intensivo ou de granulaofina usa milhares de pequenos processadores; um paralelismo intensivo ou de granulao-fina usa milhares de
pequenos processadores. A maioria das mquinas high-end, atualmente, oferece algum grau de paralelismo de
granulao-grossa: dois a quatro processadores em uma nica mquina j comum. Computadores de
paralelismo intensivo podem ser diferenciados dos equipamentos de paralelismo de granulao-grossa pelo grau
121

de paralelismo muito mais alto que podem oferecer. Computadores paralelos com centenas de CPUs e discos j
esto disponveis comercialmente.
So duas as principais formas de avaliar o desempenho de um sistema de banco de dados. A primeira o
throughput: o nmero de tarefas realizadas em um dado intervalo de tempo. A segunda o tempo de resposta: o
tempo total que o sistema leva para completar uma nica tarefa. Um sistema que processa um grande nmero de
pequenas transaes pode aumentar o throughput por meio do processamento de diversas transaes em
paralelo. Um sistema que processa um grande volume de transaes pode aumentar o tempo de resposta, assim
como o throughput por meio do processamento em paralelo.
Acelerao e Escalabilidade
Duas metas so importantes no estudo do paralelismo, a acelerao e a escalabilidade. A acelerao
refere-se reduo do tempo de execuo de uma tarefa por meio do aumento do grau de paralelismo. A
escalabilidade diz respeito ao manuseio de um maior nmero de tarefas por meio do aumento do grau de
paralelismo.
Considere uma aplicao de banco de dados rodando em um sistema paralelo com um certo nmero de
processadores e discos. Agora, suponha que incrementemos o nmero de processadores ou discos e outros
componentes do sistema. A meta processar a tarefa em tempo inversamente proporcional aos processadores e
discos alocados. Suponha que o tempo de execuo de uma tarefa em um equipamento de grande porte seja TL e
que o tempo de execuo da mesma tarefa em uma mquina de menor porte seja TS. A acelerao em funo do
paralelismo definida por Ts/TL.
O sistema paralelo apresenta um comportamento de acelerao linear se a acelerao for N quando um
sistema de maior porte tiver N vezes mais recursos (CPU, disco e assim por diante) que o sistema de menor porte.
Se a acelerao menor que N, diz-se que o sistema apresenta comportamento de acelerao sublinear. A fig.
16.4 ilustra as aceleraes linear e sublinear.

A escalabilidade relaciona-se capacidade de processar grande volume de tarefas em um mesmo


intervalo de tempo por meio do aumento dos recursos. Seja Que uma tarefa e QN uma tarefa que N vezes maior
que Q. Suponha que o tempo de execuo de Que em um determinado equipamento MS seja TS e o tempo de
execuo da tarefa QN em um equipamento paralelo ML, que N vezes maior que MS, seja TL.
A escalabilidade , ento, definida como TS /TL. o sistema paralelo ML apresenta um comportamento de
escalabilidade linear na tarefa Q se TL = TS. Se TL > TS, o sistema apresenta um comportamento de escalabilidade
sublinear. A fig. 16.5 ilustra a escalabilidade linear e sublinear. H dois tipos de escalabilidade relevantes em
sistemas de banco de dados paralelos, dependendo de como se mede a tarefa:
Na escalabilidade em lote (batch), o tamanho do banco de dados aumenta e as tarefas so grandes jobs
cujo tempo de execuo depende do tamanho do banco de dados. Um exemplo de tarefa desse tipo a
pesquisa em uma relao cujo tamanho proporcional ao tamanho do banco de dados. Assim, o
tamanho do banco de dados determinante para a medio do problema. A escalabilidade no
122

processamento em lote tambm vale para as aplicaes cientficas, como na execuo de uma consulta
com refinamento de N vezes ou a execuo de uma simulao com N repeties.
Na escalabilidade de transao, a taxa de submisso das transaes para o banco de dados aumenta e o
tamanho do banco de dados aumenta proporcionalmente taxa de transaes. Esse tipo de
escalabilidade o que relevante nos sistemas de processamento de transaes nos quais as transaes
so pequenas atualizaes por exemplo, um depsito ou saque de uma conta e a taxa de transaes
cresce medida que mais contas so criadas. Esse tipo de processamento de transaes especialmente
adequado para execuo em paralelo, uma vez que as transaes podem ser executadas concorrente e
independentemente em processadores separados, e cada transao leva, aproximadamente, o mesmo
tempo, at mesmo se o banco de dados crescer.

A escalabilidade a mais importante mtrica para medir a eficincia de um sistema de banco de dados
paralelo. Normalmente, o objetivo do paralelismo em sistemas de banco de dados garantir um desempenho
aceitvel, mesmo se o tamanho do banco de dados e o volume de transaes crescerem. O aumento da
capacidade do sistema em funo do paralelismo proporciona um caminho mais suave para o crescimento de
uma empresa que a transferncia do sistema centralizado para um equipamento mais rpido (mesmo supondo
que tal mquina exista).
Entretanto, devemos tambm dar uma olhada nos nmeros relativos ao desempenho absoluto quando
avaliamos a escalabilidade: uma mquina cujo crescimento da escalabilidade seja linear pode resultar em um
desempenho pior que outra cuja escala de crescimento seja menor que a linear, porque se partiu de uma
premissa indevida.
Alguns fatores trabalham contra a eficincia das operaes em paralelo e podem reduzir tanto a
acelerao quanto a escalabilidade.
Custo inicial. Existe um custo inicial associado inicializao de um processo. Em operaes paralelas
consistindo de milhares de processos, o tempo de iniciao (startup time) pode se sobrepor ao tempo
real de processamento, afetando de modo negativo a acelerao.
Interferncia. Uma vez que os processos executando em um sistema paralelo frequentemente mantem
seus acessos a recursos compartilhados, alguma lentido pode resultar da interferncia de cada novo
processo, j que ele disputar os recursos comuns com os processos existentes, tais como cabos, discos
compartilhados ou mesmo bloqueios. Tanto a acelerao quanto a escalabilidade so afetadas por esse
fenmeno.
Distoro (skew). Com a quebra de uma tarefa em um nmero determinado de passos paralelos
reduzimos o tamanho do passo mdio. Nem sempre o tempo de servio do passo mais lento determinar
o tempo de servio para a tarefa como um todo. Frequentemente, difcil dividir uma tarefa em partes
iguais e o modo de estabelecer essas partes , portanto, distorcido. Por exemplo, se uma tarefa de
tamanho menor que 10 ou de tamanho maior que 10; mesmo que uma tarefa tenha tamanho 20, a
123

acelerao obtida executando as tarefas em paralelo de apenas 5, em vez de 10, como poderia ser
esperado.
Interconexo de Redes
Os sistemas paralelos so conjuntos de componentes (processadores, memria, e discos) que podem se
comunicar entre si via redes interconectadas. Exemplos de interconexo de redes incluem:
Bus. Todos os componentes do sistema podem enviar e receber dados em um nico bus (cabo) de
comunicao. O bus pode ser uma ethernet ou um interconector paralelo. Arquiteturas com bus
trabalham bem com um pequeno nmero de processadores. Entretanto, no respondem bem ao
aumento do paralelismo, j que o bus s pode servir a uma comunicao por vez.
Malha (mesh). Os componentes so organizados como ns de uma grade, e cada componente
conectado na grade a todos os componentes adjacentes. Em uma malha bidimensional, cada n
conectado a quatro ns adjacentes, enquanto em uma malha tridimensional, cada n conectado a seis
ns adjacentes. Os ns que no esto diretamente interconectados podem se comunicar roteando
mensagens por meios dos ns intermedirios. O nmero de ligaes para comunicao cresce com o
crescimento do nmero de componentes e a capacidade de comunicao da malha, portanto responde
melhor ao aumento do paralelismo.
Hipercbica (hypercube). Os componentes so numerados em binrios e um componente conectado a
outro se a representao binaria de seus nmeros diferirem em exatamente um bit. Assim, cada um dos n
componentes est conectado a log(n) outros componentes. Isso pode ser verificado quando em uma
interconexo hipercbica uma mensagem de um componente pode alcanar outro por meio de, no
mximo, log(n) ligaes. Em contraste, em uma malha, um componente pode manter -1 ligacoes com
algum outro componente (ou /2 ligacoes, se a interconexo pela malha alcanar as bordas da grade).
Assim, atrasos na comunicao em um hipercubo so significativamente menores que em uma malha.
Arquiteturas de Banco de Dados Paralelo
H diversos modelos arquitetnicos para mquinas paralelas. Entre elas, as mais promissoras so
mostradas na fig. 16.6 (na figura, M denota memria, P, processador e os discos so representados por cilindros):
Memria compartilhada. Todos os processadores compartilham uma mesma memria. Esse modelo
mostrado na fig. 16.6a.
Disco compartilhado. Todos os processador compartilham o mesmo disco. Esse modelo mostrado na
fig. 16.6b. Sistemas com discos compartilhados so, s vezes, chamados de clusters.
Ausncia de compartilhamento. Os processadores no compartilham nem a memria nem disco. Esse
modelo apresentado na figura 16.6c.
Hierrquico. Esse modelo mostrado na fig. 16.6d; ele um hibrido das arquiteturas anteriores.

124

Memria compartilhada
Na arquitetura com memria compartilhada, os processadores e os discos acessam a memria comum,
normalmente, por meio de cabo ou por meio de rede de interconexo. A vantagem da memria compartilhada
sua extrema eficincia na comunicao entre processadores qualquer processador pode ter acesso aos dados
em memria compartilhada sem necessidade de ser movido por software. Um processador pode enviar
mensagens a outro processador usando a memria. Essas trocas de mensagens so bem mais rpidas
(normalmente, menos de um microssegundo) se comparadas s que usam mecanismos de comunicao. O
problema das mquinas com memria compartilhada que a arquitetura no adequada ao uso de mais de 32
ou 64 processadores, uma vez que o bus ou a interconexo por rede torna-se um gargalo (pois compartilhado
por todos os processadores). Aps determinado ponto, adicionar mais processadores no resolve; eles gastaro a
maior parte de seu tempo esperando sua vez de usar o bus para acesso memria. Arquiteturas de memria
compartilhada utilizam, normalmente, grande memria cache em cada processador para que o acesso memria
compartilhada seja evitado sempre que possvel. Porm, pelo menos alguns desses dados no estaro em
memria cache e os acessos sero dirigidos memria compartilhada. Consequentemente, mquinas com
memria compartilhada no possibilitam aumento de escala alm de determinado ponto; as mquinas de
memria compartilhada, atualmente, no do suporte a mais de 64 processadores.
Disco Compartilhado
No modelo de disco compartilhado, todos os processadores podem ter acesso direto a todos os discos, via
interconexo por rede, mas os processadores possuem memrias prprias. H duas vantagens da arquitetura de
discos compartilhados sobre a de memria compartilhada. Primeiro, uma vez que cada processador possui
memria exclusiva, o bus de memria no representa um gargalo. Segundo, essa arquitetura oferece um modo
barato de aumentar a tolerncia a falhas: se o processador (ou sua memria) falha, o outro processador pode
assumir suas tarefas, j que o banco de dados residente nos discos acessvel a todos os processadores. Podemos
fazer o subsistema de discos, ele prprio, tolerante a falhas usando a arquitetura RAID. A arquitetura de discos
compartilhados vem obtendo aceitao em diversos tipos de aplicaes; os sistemas construdos sobre
arquitetura desse tipo so frequentemente chamados de clusters.

125

O principal problema dos sistemas de discos compartilhados , novamente, o grau de crescimento.


Embora o bus de memria no represente mais um gargalo, a restrio agora a interconexo com o subsistema
de discos; esse caso particularmente determinante quando o banco de dados acessa muito os discos.
Comparando aos sistemas de memria compartilhada, os sistemas de discos compartilhados podem ser usados
com um nmero maior de processadores, mas a comunicao entre os processadores lenta (um pouco acima de
milissegundos quando no h hardware especfico para a comunicao), uma vez que ela tem de atravessar a
rede.
Cluster DEC rodando Rdb foi um dos primeiros usurios comerciais a utilizar a arquitetura de discos
compartilhados (o Rdb atualmente propriedade da Oracle e chamado de Oracle Rdb).
Ausncia de Compartilhamento
Em um sistema sem compartilhamento, cada equipamento de um n consiste em um processador, uma
memria e discos. O processador de um n pode comunicar-se com outros processadores de outros ns usando
intercomunicao de rede de alta velocidade. Um n serve de servidor dos dados alocados em seus discos. Uma
vez que as referncias aos discos so atendidas em cada processador por discos locais, o modelo sem
compartilhamento transpe os percalos de submeter todos os I/Os por meio de uma nica rede de
interconexo; somente consultas, acessos a discos remotos e o resultado das relaes so transportados por
meio da rede. Alm disso, as redes de interconexo dos sistemas sem compartilhamento so normalmente
projetadas para permitir o crescimento de escala, o que significa que sua capacidade aumenta quanto mais ns
so acrescidos. Consequentemente, arquiteturas sem compartilhamento so mais flexveis quanto escala e
podem, facilmente, dar suporte a um grande nmero de processadores. Os principais problemas dos sistemas
sem compartilhamento so os custos de comunicao e os acessos a discos remotos, que so maiores que no
arquitetura com memria ou discos compartilhados, j que a transmisso de dados envolve interao feita por
software em ambos os lados.
A mquina de banco de dados Teradata foi um dos primeiros sistemas comerciais a usar a arquitetura de
banco de dados com ausncia de compartilhamento.
Hierrquica
A arquitetura hierrquica combina as caractersticas das arquiteturas de compartilhamento de memria e
discos com a arquitetura sem compartilhamento. Em seu nvel mais alto, o sistema constitui-se de ns que so
conectados por uma rede sem compartilhar discos ou memria entre si. O topo de linha um sistema sem
compartilhamento. Cada n do sistema pode ser um sistema com memria compartilhada entre poucos
processadores. Alternativamente, cada n poderia ser um sistema de discos compartilhados e cada um desses
sistemas que compartilham um conjunto de discos poderia tambm compartilhar memria. Desse modo, o
sistema poderia ser construdo obedecendo a uma hierarquia, com o compartilhamento de memria por alguns
processadores na base e sem compartilhamento algum no nvel mais alto, com possivelmente uma arquitetura de
compartilhamento de discos intermediaria. A fig. 16.6d ilustra uma arquitetura hierrquica de ns com memria
compartilhada conectada por uma arquitetura com ausncia de compartilhamento. Sistemas de banco de dados
paralelos comerciais atualmente rodam em diversas dessas arquiteturas.
Tentativas para reduo da complexidade de programao desse tipo de sistema resultaram em
arquiteturas de memria virtual distribuda, nas quais h uma nica memria lgica compartilhada, mas
fisicamente h diversos sistemas de memria separados; o acoplamento de hardware com mapeamento da
memria virtual por meio de suporte extra de memria oferece uma visa nica de rea de memria virtual dessas
memrias separadas.
Sistemas Distribudos
Em um sistema de banco de dados distribudo, o banco de dados armazenado em diversos
computadores. Os computadores de um sistema de banco de dados distribudo comunica-se com outros por
126

intermdio de vrios meios de comunicaes, como redes de alta velocidade ou linhas telefnicas. Eles no
compartilha memria principal ou discos. Os computadores em um sistema de banco de dados distribudo podem
variar, quanto ao tamanho e funes, desde estacoes de trabalho at sistemas de grande porte (mainframe).
Os computadores de um sistema de banco de dados distribudo recebem diversos nomes, como sites ou
ns, dependendo do contexto no qual so inseridos. Usaremos preferencialmente o termo site (local, stio) para
enfatizar a distribuio fsica desses sistemas. A estrutura geral do sistema distribudo mostrada na fig. 16.7.
As principais diferenas entre os banco de dados paralelos sem compartilhamento e os banco de dados
distribudos so que, nos banco de dados distribudos, h a distribuio fsica geogrfica, administrao separada
e uma intercomunicao menor. Outra importante diferena que, nos sistemas distribudos, distinguimos
transaes locais de globais. Uma transao local acessa um nico site, justamente no qual ela se inicia. Uma
transao global, por outro lado, aquela que busca acesso a diferentes sites, ou a outro site alm daquele em
que se inicia.

Exemplo Ilustrativo
Considere o sistema de uma empresa da rea bancria que consiste em quatro agncias em quatro
cidades diferentes. Cada agncia possui seu prprio computador, com um banco de dados abrangendo todas as
contas referentes quela agncia.
Cada uma dessas instalaes , assim, um site. H tambm um nico site que mantem informaes sobre
todas as agncias do banco. Cada agncia mantm (entre outras) uma relao conta (Esquema_conta), em que:
Esquema_conta = (nome_agncia, nmero_conta, saldo)
O site que mantm informaes sobre as quatro agncias possui a relao agncia(Esquema_agncia), em
que:
Esquema_agncia = (nome_agncia, cidade_agncia, fundos)
H outras relaes nos diversos sites; ns a ignoramos em nosso exemplo.
Para ilustrar a diferena entre os dois tipos de transaes, consideramos a transao de adicionar 50
dlares conta A-177 localizada na agncia Valleyview. Se uma transao foi iniciada na agncia Valleyview, ela
ento considerada local; caso contrrio, ser considerada global. Uma transao para transferir 50 dlares da
conta A-177 para a conta A-305, a qual est localizada na agncia Hillside, uma transao global, uma vez que
conta em sites diferentes sofrem acessos como resultado de sua execuo.
O que faz dessa configurao um sistema de banco de dados distribudo so os seguintes aspectos:
127

Os vrios sites esto disponveis entre si.


Os sites compartilham um esquema global comum, embora algumas relaes possam estar armazenadas
em alguns sites.
Cada site proporciona um ambiente para execuo tanto de transaes locais quanto de transaes
globais.
Cada site roda o mesmo software para o gerenciamento de banco de dados.

Se houver sistemas gerenciadores de banco de dados diferentes rodando nos sites, torna-se difcil o
gerenciamento de transaes globais. Tais sistemas so chamados de sistemas de banco de dados mltiplos
(multidatabase) ou sistemas de banco de dados distribudos heterogneos.
Tradeoffs
H diversas razoes para a utilizao de sistemas de banco de dados distribudos, como o
compartilhamento de dados, a autonomia e a disponibilidade.
Compartilhamento de dados. A maior vantagem de um sistema de banco de dados distribudo criar um
ambiente no qual os usurios de um site podem ter acesso a dados residentes em outros sites. Por
exemplo, no sistema distribudo bancrio usado como exemplo, os usurios de uma agncia podem ter
acesso aos dados de outra agncia. Sem essa disponibilidade, um usurio que desejasse transferir fundos
de uma agncia para outra teria de recorrer a algum mecanismo externo.
Autonomia. A primeira vantagem do compartilhamento dos dados por meio da distribuio dos dados
que cada site pode manter certo nvel de controle sobre os dados que esto armazenados localmente. Em
sistemas centralizados, o administrado do banco de dados central quem gerencia o banco de dados. Em
sistemas de banco de dados distribudos h um administrador geral responsvel pelo banco como um
todo. Uma parte dessa responsabilidade delegada ao administrador local de cada site. Dependendo do
projeto do banco de dados distribudo, os administradores podem possuir diferentes graus de autonomia
local provavelmente uma das maiores vantagens dos banco de dados distribudos.
Disponibilidade. Se um site sai do ar em um sistema distribudo, os demais sites podem continuar em
operao. Particularmente, se os itens de dados so replicados em diversos sites, uma transao que
precise de um item de dado em particular pode encontrar tal item presente em diversos sites. Assim, a
queda de um site no implica, necessariamente, a queda do sistema.
A queda de um site precisa ser detectada pelo sistema, assim como determinadas aes devem ser
executadas para recuper-lo da falha. O sistema no poder mais usar os servios do site fora do ar. Finalmente,
quando um site volta a funcionar ou quando consertado, necessrio dispor de mecanismos para integr-lo
paulatinamente ao sistema.
Embora a recuperao de uma falha seja mais complexa nos sistemas distribudos que nos sistemas
centralizados, a capacidade da maioria dos sistemas manter-se em operao a despeito da falha de um site acaba
por aumentar a disponibilidade. A disponibilidade crucial para os sistemas de banco de dados usados em
aplicaes de tempo real. A perda do acesso aos dados em, por exemplo, uma companhia area pode fazer com
que um cliente em potencial prefira viajar com uma companhia concorrente.
A principal desvantagem dos sistemas de banco de dados distribudos o acrscimo de complexidade
necessrio para assegurar a coordenao entre os sites. Esse aumento de complexidade toma diversas formas:
Custo de desenvolvimento de software. mais difcil implementar sistemas de banco de dados
distribudos, portanto, o custo mais alto.
Maior possibilidade de bugs. Uma vez que os sites que constituem o sistema distribudo operam em
paralelo, difcil assegurar a preciso dos algoritmos, especialmente durante a ocorrncia e recuperao
de falha em parte do sistema. H, potencialmente, a chance de bugs extremamente sutis.
128

Aumento do processamento e overhead. A troca de mensagens e processamento adicional necessrios


coordenao entre sites so uma forma de overhead que no ocorre nos sistemas centralizados.

Na escolha do projeto do sistema de banco de dados, o projetista deve ponderar as vantagens e


desvantagens da distribuio dos dados. H diversas abordagens para um projeto de banco de dados distribudo,
partindo de projetos totalmente distribudos at os que mantm alto nvel de centralizao.
Tipos de Redes
Sistemas de banco de dados distribudos e sistemas cliente-servidor so apoiados em redes de
comunicao. H basicamente dois tipos de redes: redes locais (local-area networks LAN) e redes de longa
distncia (wide-area networks WAN). A principal diferena entre as duas o modo pelo qual so distribudas
geograficamente. Redes locais so compostas por processadores distribudos sobre pequenas extenses
geogrficas, como um nico edifcio ou alguns prdios prximos. Redes de longa distncia, por outro lado, so
compostas por determinado nmero de processadores autnomos, distribudos por uma extensa rea geogrfica.
Essas diferenas envolvem maiores variaes na velocidade e confiabilidade das redes de comunicao e se
refletem no projeto do sistema operacional.
Redes Locais
As redes locais (LANs) apareceram no incio dos anos 70 como meio de comunicao entre computadores
e para compartilhamento de dados. Percebeu-se que, em diversas empresas, numerosos pequenos
computadores, cada um com suas prprias aplicaes, so mais econmicos que um nico grande sistema. Como
cada pequeno equipamento provavelmente necessita de acesso a um grande nmero de dispositivos perifricos
(como discos e impressoras) e como a necessidade de alguma forma de compartilhamento de dados
frequentemente em uma empresa, a consequncia natural foi a conexo desses pequenos sistemas em uma rede
de computadores.
As LANs so normalmente projetadas para cobrir uma pequena rea geogrfica e so, geralmente, usadas
me escritrios. Todos os sites deste tipo de sistema esto prximos entre si, assim a comunicao entre eles
tende a manter velocidades mais altas e menores taxas de erro que as apresentadas pelas redes de longa
distncia. O tipo de ligao mais comum entre os computadores de uma rede local o par tranado, cabo coaxial
de banda larga e fibra tica. A velocidade de comunicao gira em torno de um megabyte por segundo, para rede
como Appletalk e IBM, redes lentas em anel (token ring), at um gigabit por segundo, para redes ticas
experimentais. Dez megabits por segundo bastante comum, essa a velocidade da Ethernet. As redes de fibra
tica FDDI (optical-fiber-based) e Fast Ethernet rodam a cem megabits por segundo. Redes com base no
protocolo chamado protocolo assncrono (asynchronous transfer mode ATM) podem alcanar velocidades
superiores, como 144 megabits por segundo, e esto se tornando bastante populares.
Uma LAN tpica consiste em diferentes estaes de trabalho, um ou mais sistemas servidores, vrios
dispositivos perifricos compartilhados (como impressora a laser ou unidades de fita magntica) e um ou mais
gateways (processadores especializados) que proporcionam acesso a outras redes (fig. 16.8). o esquema Ethernet
usado com frequncia em LANs.

129

Redes de Longa Distncia


As redes de longa distncia (WANs) apareceram no final da dcada de 1960, principalmente em projetos
de pesquisas acadmicas para comunicao eficiente entre sites, permitindo que o hardware e o software
pudessem ser compartilhados conveniente e economicamente entre a grande comunidade de usurios. Os
sistemas que permitiram a conexo de terminais remotos com um computador central via linhas telefnicas
foram desenvolvidos no incio da dcada de 1960, embora no fossem de fato uma WAN. A primeira WAN
projetada e desenvolvida foi a Arpanet. Os trabalhos na Arpanet comearam em 1968. A Arpanet desenvolveu-se
a partir de quatro redes experimentais at chegar rede mundial, a Internet, compreendendo milhes de
sistemas computacionais. A ligao caracterstica da WAN so circuitos telefnicos que usam linhas de fibra tica
e (por vezes) canais de satlite.
Como exemplo, consideremos a Internet, que conecta computadores pelo mundo. O sistema possibilita
que hosts em sites geograficamente separados comuniquem-se entre si. Os computadores hosts diferem uns dos
outros no tipo, velocidade, tamanho da palavra, sistema operacional, etc. Os hosts so, geralmente, LANs
conectadas a redes regionais. As redes regionais so interligadas a roteadores para formar a rede mundial. As
conexes entre as redes usam frequentemente o servio de telefonia chamado T1, que oferece taxas de
transferncia de cerca de 44.736 megabits por segundo. As mensagens enviadas para a rede so roteadas por
sistemas chamados de roteadores, que controlam o caminho percorrido por cada mensagem atravs da rede.
Esse roteamento pode ser dinmico, para aumentar a eficincia da comunicao, ou esttico, para reduzir riscos
ou permitir que a carga de comunicao seja processada mais facilmente.
Outras WANs em operao usam linhas telefnicas padro como principal meio de comunicao. Os
modems so dispositivos que recebem sinal digital de um computador e convertem esses dados em sinais
analgicos, que so usados pelo sistema de telefonia. Um modem no site de destino converte o sinal analgico
em digital e, assim, o equipamento de destino recebe o dado. A velocidade dos modems varia de 2400 bips a 32
kilobits por segundo. Os sistemas de telefonia que aceitam o padro Rede Digital de Servios Integrados
(Integrated Services Digital Network ISDN) permitem que os dados sejam transferidos ponto a ponto a altas
taxas, normalmente 128 kilobits por segundo.
A rede UNIX, UUCCP, permite que os sistemas se comuniquem uns com os outros um nmero limitado de
vezes (e, geralmente, predeterminado), via modems, para troca de mensagens. Essas mensagens so roteadas
para outro sistema prximo e, dessa forma, propagadas para todos os hosts da rede (mensagens publicas) ou
transferidas para seu destino (mensagens particulares).
130

As WANs so classificadas em dois tipos:


WAN conexo descontnua, como aquelas que tm por base a UUCP, em que os hosts esto conectados
rede somente por determinados perodos.
WAN conexo contnua, como a Internet, cujos hosts esto conectados rede o tempo todo.

O projeto de um sistema de banco de dados distribudo fortemente influenciado pelo tipo de WAN de
apoio. Os verdadeiros sistemas de banco de dados distribudos podem rodar apenas sobre as redes conectadas
continuamente pelo menos durante as horas em que o banco de dados distribudo est operacional.
Redes que no esto continuamente conectadas, geralmente, no permitem transaes entre sites, mas
tomam cpias locais dos dados remotos e atualizam periodicamente essas cpias (toda noite, por exemplo). Para
aplicaes cuja consistncia no seja crtica, como compartilhamento de documentos, sistemas de trabalho em
grupo (groupware systems) como o Lotus Notes, permitem atualizaes em dados remotos feitos localmente e
essas atualizaes retornam periodicamente ao site remoto. H conflito potencial de atualizaes entre sites que
precisa ser detectado e resolvido. Um mecanismo para deteces de atualizaes conflitantes existe; o
mecanismo para resoluo de conflitos de atualizao, entretanto, dependente da aplicao.
Arquitetura de sistemas de bancos de dados
INTRODUO
Agora temos condies de apresentar uma arquitetura para um sistema de bancos de dados. Nosso
objetivo ao apresentar essa arquitetura fornecer um arcabouo sobre o qual possamos desenvolver os captulos
subsequentes. Esse arcabouo til para descrever conceitos gerais de bancos de dados e explicar a estrutura de
sistemas de bancos de dados especficos mas no afirmamos que todo sistema pode se enquadrar bem nesse
arcabouo em particular, nem queremos sugerir que essa arquitetura prev o nico arcabouo possvel. Em
especial, provvel que sistemas pequenos (ver Captulo 1) no ofeream suporte para todos os aspectos da
arquitetura. Porm, a arquitetura em questo de fato parece se ajustar razoavelmente bem maior parte dos
sistemas; alm disso, ela basicamente idntica arquitetura proposta pelo ANSI/SPARC Study Group on Data
Base Management Systems (a chamada arquitetura ANSI/SPARC consulte as referncias [2.1-2.2]). Contudo,
optamos por no seguir a terminologia ANSI/SPARC em todos os detalhes.
OS TRS NVEIS DA ARQUITETURA
A arquitetura ANSI/SPARC se divide em trs nveis, conhecidos como nvel interno, nvel conceitual e nvel
externo, respectivamente (ver Figura 2.1). De modo geral:
O nvel interno (tambm conhecido como nvel fsico) o mais prximo do meio de armazenamento fsico ou
seja, aquele que se ocupa do modo como os dados so fisicamente armazenados.
O nvel externo (tambm conhecido como nvel lgico do usurio) o mais prximo dos usurios ou seja,
aquele que se ocupa do modo como os dados so vistos por usurios individuais.
O nvel conceitual (tambm conhecido como nvel lgico comunitrio, ou s vezes apenas nvel indireto, sem
qualificao) um nvel de simulao entre os outros dois.
Observe que o nvel externo se preocupa com as percepes dos usurios individuais, enquanto o nvel
conceitual est preocupado com uma percepo da comunidade de usurios. Em outras palavras, haver muitas
vises externas distintas, cada qual consistindo em uma representao mais ou menos abstrata de alguma
parte do banco de dados completo, e haver exatamente uma viso conceitual, consistindo em uma
representao analogamente abstrata do banco de dados em sua totalidade.* (Lembre-se de que a maioria dos
usurios no estar interessada em todo o banco de dados, mas somente em alguma poro restrita do banco de
dados.) Do mesmo modo, haver precisamente uma viso interna, representando o modo como o banco de
dados est fisicamente armazenado.

131

Um exemplo ajudar a esclarecer essas ideias. A Figura 2.2 mostra a viso conceitual, a viso interna
correspondente e duas vises externas correspondentes (uma para um usurio PL/I e outra para um usurio
COBOL), todas para um simples banco de dados de pessoal. claro que o exemplo inteiramente hipottico
ele no pretende se assemelhar a qualquer sistema real e muitos detalhes irrelevantes foram deliberadamente
omitidos. Explicao:
No nvel conceitual, o banco de dados contm informaes relativas a um tipo de entidade chamada
EMPREGADO. Cada empregado individual tem um NUMERO_EMPREGADO (seis caracteres), um
NUMERO_DEPARTAMENTO (quatro caracteres) e um SALARIO (cinco dgitos decimais).
No nvel interno, os empregados so representados por um tipo de registro armazenado, denominado
EMP_ARMAZENADO, com vinte bytes de comprimento. EMP_ARMAZENADO contm quatro campos
armazenados: um prefixo de seis bytes (presumivelmente contendo informaes de controle, tais como flags ou
ponteiros) e trs campos de dados correspondentes s trs propriedades de empregados. Alm disso, os registros
EMP_ARMAZENADO so indexados sobre o campo EMP# por um ndice chamado EMPX, cuja definio no
mostrada.
O usurio PL/I tem uma viso externa do banco de dados na qual cada empregado representado por um
registro PL/I que contm dois campos (nmeros de departamentos no so de interesse para esse usurio, e por
isso foram omitidos da viso). O tipo de registro definido por uma declarao de estrutura PL/I comum, de
acordo com as regras normais de PL/I.
De modo semelhante, o usurio COBOL tem uma viso externa em que cada empregado representado por um
registro COBOL contendo, mais uma vez, dois campos (agora, foram omitidos os salrios). O tipo de registro
definido por uma descrio comum de registro COBOL, de acordo com as regras normais do COBOL.

Observe que itens de dados correspondentes podem ter nomes diferentes em pontos diferentes. Por
exemplo, a referncia ao nmero do empregado chamada EMP# na viso externa de PL/I, EMPNO na viso
externa COBOL, NUMERO EMPREGADO na viso conceitual e novamente EMP# na viso interna. claro que o
sistema deve estar ciente das correspondncias; por exemplo, ele tem de ser informado de que o campo EMPNO
do COBOL derivado do campo conceitual Por abstrata, queremos dizer nesse caso apenas que a representao

132

em questo envolve construes como registros e campos, mais orientadas para o usurio, em oposio a
construes como bits e bytes, mais orientadas para a mquina.
Observe que faz pouca diferena para as finalidades deste captulo saber se o sistema que est sendo
considerado relacional ou no. Contudo, pode ser til indicar de forma resumida como os trs nveis da
arquitetura
so
em
geral
percebidos
especificamente
em
um
sistema
relacional:
Primeiro, o nvel conceitual em tal sistema ser definitivamente relacional, no sentido de que os objetos visveis
nesse nvel sero tabelas relacionais, e os operadores sero operadores relacionais (incluindo, em especial, os
operadores de restrio e projeo examinados de forma abreviada no Captulo 1).
Em segundo lugar, uma determinada viso externa tambm ser tipicamente relacional, ou algo muito prximo
disso; por exemplo, as declaraes de registros PL/I ou COBOL da Figura 2.2 podem ser consideradas de maneira
informal, respectivamente, os equivalentes PL/I ou COBOL da declarao de uma tabela relacional em um sistema
relacional.
Nota: devemos mencionar de passagem que o termo viso externa (em geral abreviado apenas como viso)
infelizmente tem um significado bastante especfico em contextos relacionais que no idntico ao significado
atribudo ao termo neste captulo. Consulte os Captulos 3 e 9 para ver uma explicao e uma descrio do
significado relacional.
Terceiro, o nvel interno no ser relacional, porque os objetos nesse nvel no sero apenas tabelas relacionais
(armazenadas) em vez disso, eles sero os mesmos tipos de objetos encontrados no nvel interno de qualquer
outra espcie de sistema (registros armazenados, ponteiros, ndices, hashing etc.). De fato, o modelo relacional
em si no tem absolutamente nenhuma relao com o nvel interno; ele se preocupa, como vimos no Captulo 1,
com o modo como o banco de dados visto pelo usurio.
Agora vamos prosseguir com o exame dos trs nveis da arquitetura com um nvel muito maior de
detalhes, comeando pelo nvel externo. Em toda a nossa descrio, faremos repetidas referncias Figura 2.3,
que mostra os principais componentes da arquitetura e seus inter-relacionamentos pelo administrador de banco
de dados (DBA) .

133

O NVEL EXTERNO
O nvel externo o nvel do usurio individual. Como foi explicado no Captulo 1, um determinado usurio
pode ser ou programador de aplicaes ou um usurio final com qualquer grau de sofisticao. (O DBA um caso
especial importante; porm, diferentemente de outros usurios, o DBA tambm precisar estar interessado nos
nveis conceitual e interno. Consulte as duas sees seguintes.)
Cada usurio tem uma linguagem sua disposio:
Para o programador de aplicaes, essa linguagem ser uma linguagem de programao convencional (como
PL/I, C+ +, Java) ou uma linguagem proprietria especfica para o sistema em questo. Essas linguagens
proprietrias so frequentemente chamadas de linguagens de quarta gerao (L4Gs), pelo fato (muito difuso!)
de que (a) o cdigo de mquina, a linguagem assembler e a linguagem PL/I podem ser consideradas como trs
geraes mais antigas de linguagens e (b) as linguagens proprietrias representam o mesmo tipo de
aperfeioamento em relao s linguagens de terceira gerao (L3Gs) que essas linguagens representavam em
relao linguagem assembler e esta ltima, por sua vez, representava em relao ao cdigo de mquina.
Para o usurio final, a linguagem ser uma linguagem de consulta ou alguma linguagem de uso especial, talvez
dirigida por formulrios ou menus, adaptada aos requisitos desse usurio e com suporte de algum programa
aplicativo on-line.
Para nossos propsitos, o ponto importante sobre todas essas linguagens que elas incluiro uma
sublinguagem de dados isto , um subconjunto da linguagem completa relacionado de modo especfico aos
objetos e s operaes do banco de dados. A sublinguagem de dados (abreviada como DSL data sublanguage
na Figura 2.3) dita embutida na linguagem hospedeira correspondente. A linguagem hospedeira
responsvel pelo fornecimento de diversos recursos no relacionados com bancos de dados, como variveis
locais, operaes de clculo, lgica de desvios condicionais (if-then-else), e assim por diante. Um dado sistema
poderia admitir qualquer nmero de linguagens hospedeira e qualquer nmero de sublinguagens de dados;
porm, uma determinada sublinguagem de dados reconhecida por quase todos os sistemas atuais a linguagem
SQL, discutida brevemente no Captulo 1. A maioria desses sistemas permite que a SQL seja usada tanto de modo
interativo como uma linguagem de consulta autnoma, quanto incorporada a outras linguagens como PL/I ou
Java
(consulte
o
Captulo
4
para
ver
detalhes
adicionais).
Observe que, embora seja conveniente para propsitos arquiteturais distinguir entre a sublinguagem de dados e
134

a linguagem hospedeira que a contm, as duas podem de fato no ser distintas para o usurio; na verdade, talvez
seja prefervel sob a perspectiva do usurio que elas no sejam distintas. Se elas no forem distintas, ou se s
puderem ser distinguidas com dificuldade, diremos que elas esto fortemente acopladas. Se forem clara e
facilmente distinguveis, dizemos que elas esto fracamente acopladas. Apesar de alguns sistemas comerciais (em
especial sistemas de objetos ver Captulo 24) admitirem o acoplamento forte, a maioria no o aceita. Em
particular, os sistemas SQL costumam oferecer suporte apenas para o acoplamento fraco. (O acoplamento forte
oferece um conjunto de recursos mais uniforme para o usurio, mas sem dvida envolve maior esforo por parte
dos desenvolvedores de sistemas, um fato que presumivelmente contribui para o status quo.)
Em princpio, qualquer sublinguagem de dados determinada , na realidade, uma combinao de pelo menos
duas linguagens subordinadas uma linguagem de definio de dados (DDL Data Definition Language), que d
suporte definio ou declarao de objetos dos bancos de dados, e uma linguagem de manipulao de dados
(DML Data Manipulation Language), que admite a manipulao ou o processamento desses objetos. Por
exemplo, considere o usurio PL/I da Figura 2.2, na Seo 2.2. A sublinguagem de dados para esse usurio
consiste
nos
recursos
de
PL/I
utilizados
para
a
comunicao
com
o
SGBD:
A parte de DDL consiste nas construes declarativas de PL/I necessrias para se declararem objetos do banco
de dados a prpria instruo DECLARE(DEL), certos tipos de dados de PL/I, possivelmente extenses especiais
de PL/I para oferecer suporte a novos objetos no manipulados pela PL/I existente.
A parte da DML consiste nas instrues executveis de PL/I que transferem informaes de e para o banco de
dados mais uma vez incluindo, possivelmente, novas instrues especiais.
Nota: mas precisamente, devemos dizer que a PL/I no inclui na realidade nenhum recurso especfico de bancos
de dados na poca em que este livro foi escrito. Em particular, as instrues de DML costumam ser apenas
instrues CALL de PL/I que invocam o SGBD (embora essas chamadas possam estar sintaticamente disfaradas
de algum modo, a fim de torn-las um pouco mais amistosas para o usurio consulte a discusso sobre a SQL
embutida no Captulo 4).
Voltando arquitetura: j indicamos que um usurio individual geralmente s estar interessado em
alguma parte do banco de dados como um todo; alm disso, a viso que esse usurio tem dessa parte ser em
geral um tanto abstrata quando comparada com o modo como os dados esto fisicamente armazenados. O termo
ANSI/SPARC para a viso de um usurio individual viso externa. Uma viso externa , portanto, o contedo do
banco de dados visto por algum usurio determinado (ou seja, para esse usurio a viso externa o banco de
dados). Por exemplo, um usurio do Departamento de Pessoal poderia considerar o banco de dados uma coleo
de ocorrncias de registros de departamentos e empregados, e ele poderia no ter nenhum conhecimento das
ocorrncias de registros de fornecedores e peas vistas pelos usurios do Departamento de Compras.
Nvel Conceitual
A viso conceitual uma representao de todo contedo de informao de informaes do banco de
dados, mais uma vez (como no caso de uma viso externa) em uma forma um tanto abstrata, em comparao
com o modo como os dados so visualizados por qualquer usurio em particular. Em termos gerais, a viso
conceitual pretende ser uma viso dos dados como eles realmente so, em vez de forar os usurios a v-los
pelas limitaes (por exemplo) da linguagem ou do hardware que eles possam estar utilizando.
A viso conceitual consiste em muitas ocorrncias de cada um dos vrios tipos de registros conceituais.
Por exemplo, ela pode consistir em uma coleo de ocorrncias de registros de departamentos, junto com uma
coleo de ocorrncias de registros de empregados, junto com uma coleo de ocorrncias de registros de
fornecedores, mais uma coleo de ocorrncias de registros de peas, e assim por diante. Um registro conceitual
no necessariamente o mesmo que um registro externo, nem o mesmo que um registro armazenado.
A viso conceitual definida por meio do esquema conceitual, que inclui definies de cada um dos vrios
tipos de registros conceituais (mais uma vez, observe um exemplo simples da fig. 2.2). o esquema conceitual
escrito por meio de outra linguagem de definio de dados, a DDL conceitual. Se quisermos alcanar a
independncia fsica dos dados, ento essas definies de DDL conceitual no devero envolver quaisquer
consideraes sobre a representao fsica ou a tcnica conceitual, no dever haver nenhuma referncia a
representaes de campos armazenados, sequencias de registros armazenados, ndices, esquemas de hashing,
ponteiros ou quaisquer outros detalhes de armazenamento e acesso. Se o esquema conceitual se tornar
verdadeiramente independente de dados dessa maneira, ento os esquemas externos, definidos em termos do
esquema conceitual, tambm so independentes dos dados.
Portanto, a viso conceitual uma viso do contedo total do banco de dados, e o esquema conceitual
uma definio dessa viso. Porm, seria enganoso sugerir que o esquema conceitual nada mais do que um
135

conjunto de definies muito semelhante s definies de registros simples, encontradas hoje em (por exemplo)
um programa COBOL. As definies no esquema conceitual tm por finalidade incluir muitos recursos adicionais,
como as restries de segurana e integridade. Algumas autoridades no assunto chegariam at a sugerir que o
objetivo final do esquema conceitual descrever a empresa inteira no apenas seus dados em si, mas tambm
o modo como esses dados so usados; como eles fluem de um ponto para outro dentro da empresa, para q eles
so usados em cada ponto, quais controles de auditoria ou outros controles devem ser aplicados em cada ponto,
e assim por diante. No entanto, devemos enfatizar que nenhum sistema atual admite realmente um esquema
conceitual q sequer se aproxime desse grau de complexidade; na maior parte dos sistemas existentes, o
esquema conceitual , na verdade, pouco mais que uma simples unio de todos os esquemas externos
individuais, juntamente com determinadas restries de segurana e integridade. Porm, sem dvida, possvel q
sistemas futuros eventualmente se tornem muito mais sofisticados em seu suporte ao nvel conceitual.
O NVEL INTERNO
O terceiro nvel da arquitetura o nvel interno. A viso interna uma representao de baixo nvel do
banco de dados por inteiro; ela consiste em muitas ocorrncias de cada um dos vrios tipos de registros internos.
Registro interno o termo ANSI/SPARC que representa a construo que temos chamado de registro
armazenado (e continuaremos a usar essa ltima forma). Assim, a viso interna ainda est muito afastada do
nvel fsico, pois ela no lida com registros fsicos tambm chamados blocos ou pginas nem com quaisquer
consideraes especficas de dispositivos, como tamanhos de cilindros ou trilhas. Em outras palavras, a viso
interna pressupe efetivamente um espao de endereos linear infinito; os detalhes de como esse espao de
endereos mapeado no meio de armazenamento fsico so bastante especficos para cada sistema e foram
deliberadamente omitidos da arquitetura geral. Nota: o bloco, ou a pgina, a unidade de entrada e sada (E/S)
isto , ele representa a quantidade de dados transferidos entre o meio de armazenamento secundrio e a
memria principal em uma nica operao de E/S. Os tamanhos de pginas tpicos so 1 K, 2 K ou 4 K bytes (K =
1.024).
A viso interna descrita por meio do esquema interno, que no somente define os diversos tipos de
registros armazenados mas tambm especifica quais ndices existem, como os campos armazenados esto
representados, em que sequncia fsica esto os registros armazenados, e assim por diante (mais uma vez, veja
na Figura 2.2 um exemplo simples). O esquema interno escrito usando-se ainda outra linguagem de definio de
dados a DDL interna. Nota: neste livro, usaremos normalmente os termos mais intuitivos estrutura de
armazenamento ou banco de dados armazenado em vez de viso interna, e ainda definio de estrutura de
armazenamento em lugar de esquema interno.
Para encerrar lembramos que, em certas situaes excepcionais, os programas aplicativos em
particular as aplicaes de natureza utilitria (ver Seo 2.11) podem ter permisso para operar diretamente
no nvel interno, e no no nvel externo. No preciso dizer que essa prtica no recomendvel; ela representa
um risco de segurana (pois as restries de segurana so ignoradas) e um risco de integridade (pois tambm as
restries de integridade so ignoradas), e o programa ter uma inicializao dependente dos dados; porm, s
vezes essa poder ser a nica maneira de obter a funcionalidade ou o desempenho exigido do mesmo modo o
usurio em uma linguagem de programao de alto nvel poderia ter a necessidade ocasional de descer at a
linguagem assembler para satisfazer certos objetivos de funcionalidade ou desempenho.

MAPEAMENTOS
Alm dos trs nveis bsicos, a arquitetura da Figura 2.3 envolve, em geral, certos mapeamentos
um mapeamento conceitual/interno e vrios mapeamentos externos/conceituais:
O mapeamento conceitual/interno define a correspondncia entre a viso conceitual e o banco de
dados armazenado; ele especifica o modo como os registros e campos conceituais so representados no
nvel interno. Se a estrutura do banco de dados armazenado for alterada isto , se for efetuada uma
mudana na definio do banco de dados armazenado o mapeamento conceitual/interno ter de ser
alterado de acordo, a fim de q o esquema conceitual possa permanecer invarivel. ( responsabilidade
do DBA, ou provavelmente, do SGBD, administrar tais alteraes.) Em outras palavras, os efeitos dessas
mudanas devem ser isolados abaixo do nvel conceitual, a fim de preservar a independncia de dados
fsica.
Definir o esquema interno
136

O DBA tambm deve decidir como sero representados os dados no banco de dados
armazenado. Em geral, esse processo chamado projeto de banco de dados fsico.* Tendo elaborado o
projeto fsico, o DBA deve ento criar a definio da estrutura de armazenamento correspondente (isto
, o esquema interno), usando a DDL interna. Alm disso, ele tambm deve definir o mapeamento
conceitual/interno associado. Na prtica, a DDL conceitual ou a DDL interna mais provavelmente a
primeira dever incluir os meios para definir esse mapeamento, mas as duas funes (criao do
esquema, definio do mapeamento) devem ser claramente distinguveis. Como no caso do esquema
conceitual, o esquema interno e o mapeamento correspondente existiro tanto na forma de fonte
quanto de objeto.
Ligao com usurios
tarefa do DBA fazer a ligao com os usurios, a fim de garantir que os dados de que eles
necessitam estaro disponveis, e escrever (ou ajudar os usurios a escreverem) os esquemas externos
necessrios, usando a DDL externa aplicvel. (Como j foi dito, um dado sistema pode admitir vrias
DDLs externas distintas.) Alm disso, os mapeamentos externos/conceituais correspondentes tambm
devem ser definidos. Na prtica, a DDL externa provavelmente incluir os meios para especificar esses
mapeamentos, mas, de novo, os esquemas e os mapeamentos devem ser claramente distinguveis. Cada
esquema externo e o mapeamento correspondente devero existir tanto na forma de fonte quanto de
objeto.
Outros aspectos da funo de ligao com o usurio incluem a consultoria em projeto de
aplicaes, o fornecimento de instruo tcnica, a assistncia para determinao e resoluo de
problemas e servios profissionais semelhantes.
Definir restries de segurana e integridade
Como j vimos, as restries de segurana e integridade podem ser consideradas uma parte do
esquema conceitual. A DDL conceitual deve incluir recursos para a especificao de tais restries.
Definir normas de descarga e recarga
Uma vez que uma empresa esteja comprometida com um sistema de banco de dados, ela se
torna dependente de modo crtico do sucesso desse sistema. Em caso de danos a qualquer parte do
banco de dados provocados por erro humano, digamos, ou por uma falha de hardware ou do sistema
operacional essencial ser capaz de reparar os dados em questo com um mnimo de demora e com
o menor efeito possvel sobre o restante do sistema. Por exemplo, em condies ideais, a
disponibilidade dos dados que no tenham sido danificados no deve ser afetada. O DBA tem de definir
e implementar um esquema apropriado de controle de danos, em geral envolvendo (a) descarga
peridica ou dumping do banco de dados para o meio de armazenamento de backup e (b)
recarregamento do banco de dados quando necessrio, a partir do dump mais recente.
A propsito, a discusso anterior fornece uma razo pela qual seria uma boa ideia espalhar a
coleo total de dados por vrios bancos de dados, em vez de manter tudo em um nico lugar; o banco
de dados individual poderia muito bem formar a unidade para finalidades de descarga e
recarregamento. Nessa linha, observe que j existem sistemas terabyte** isto , instalaes de
bancos de dados comerciais que armazenam bem mais de um trilho de bytes de dados, em termos
informais e que os sistemas do futuro devero ser muito maiores. E desnecessrio dizer que tais
sistemas VLDB (banco de dados muito grande very large database) exigem administrao muito
cuidadosa e sofisticada, em especial se houver um requisito de disponibilidade contnua (que
normalmente existe). No obstante, por simplicidade, continuaremos a falar como se de fato houvesse
um nico banco de dados.
* Observe a sequncia: primeiro, defina que dados voc deseja; depois, decida como represent-los no
meio de armazenamento.
O projeto fsico sempre deve ser feito depois do projeto lgico.
**1.o24 bytes = um kilobyte (KB); 1.024 KB = um megabyte (MB); 1.024 MB = um gigabyte (GB); 1.024
GB um terabyte (TB); 1.024 TB = um petabyte (PB); 1.024 PB = um exabyte (EB). Observe que,
informalmente, um gigabyte equivale a um bilho de bytes (a abreviatura BB empregada s vezes em
lugar de GB).
137

Monitorar o desempenho e responder a requisitos de mudanas


Como foi indicado na Seo 1.4, o DBA responsvel pela organizao do sistema de modo a
obter o desempenho que seja o melhor para a empresa, e por fazer os ajustes apropriados isto , a
sintonia fina (tuning) conforme os requisitos se alterarem. Por exemplo, poderia ser necessrio
reorganizar o banco de dados armazenado de tempos em tempos para assegurar que os nveis de
desempenho permanecero aceitveis. Como j mencionamos, qualquer mudana no nvel de
armazenamento fsico (interno) do sistema deve ser acompanhada por uma mudana correspondente
na definio do mapeamento de nvel conceitual/interno, de modo que o esquema conceitual possa
permanecer
constante.
E claro que a lista anterior no esgota o assunto ela pretende apenas dar uma ideia da
extenso e da natureza das responsabilidades do DBA.
O SISTEMA DE GERENCIAMENTO DE BANCOS DE DADOS
O sistema de gerenciamento de bancos de dados (SGBD) o software que trata de todo o acesso
ao banco de dados. Conceitualmente, o que ocorre o seguinte (observe mais uma vez a Figura 2.3):
1. Um usurio faz um pedido de acesso usando uma determinada sublinguagem de dados (em geral,
SQL).
2. O SGBD intercepta o pedido e o analisa.
3. O SGBD inspeciona, por sua vez, o esquema externo (ou as verses objeto desse esquema) para esse
usurio, o mapeamento externo/conceitual correspondente, o esquema conceitual, o mapeamento
conceitual/interno e a definio da estrutura de armazenamento.
4. O SGBD executa as operaes necessrias sobre o banco de dados armazenado.
Como exemplo, considere as aes relacionadas com a busca de uma determinada ocorrncia de
registro externo. Em geral, sero necessrios campos de vrias ocorrncias de registros conceituais e,
por sua vez, cada ocorrncia de registro conceitual exigir campos de vrias ocorrncias de registros
armazenados. Ento, conceitualmente, o SGBD deve primeiro buscar todas as ocorrncias necessrias
de registros armazenados, depois construir as ocorrncias de registros conceituais exigidas e, em
seguida, construir a ocorrncia de registro externo. Em cada estgio, podem ser necessrias converses
de tipos de dados ou outras converses.
Naturalmente, a descrio anterior muito simplificada; em particular, ela implica que todo o
processo interpretativo, medida que sugere que os processos de anlise do pedido, inspeo dos
diversos esquemas etc., so todos realizados durante a execuo. A interpretao, por sua vez, em geral
implica um desempenho sofrvel devido sobrecarga em tempo de execuo. Porm, na prtica talvez
seja possvel fazer os pedidos de acesso serem compilados antes do momento da execuo (em
particular, diversos produtos atuais de SQL fazem isso consulte as anotaes relativas s referncias
[4.12] e [4.26] do Captulo 4).
Vamos examinar agora as funes do SGBD com um pouco mais de detalhes. Essas funes
incluiro o suporte a pelo menos todos os itens a seguir (observe a Figura 2.4):
Definio de dados
O SGBD deve ser capaz de aceitar definies de dados (esquemas externos, o esquema
conceitual, o esquema interno e todos os mapeamentos associados) em forma fonte e convert-los para
a forma objeto apropriada. Em outras palavras, o SGBD deve incluir componentes de processador de
DDL ou compilador de DDL para cada uma das diversas linguagens de definio de dados (DDLs). O SGBD
tambm deve entender as definies da DDL, no sentido de que, por exemplo, ele entende que os
registros externos EMPREGADO incluem um campo SALARIO; ele deve ento ser capaz de usar esse
conhecimento para analisar e responder a pedidos de manipulao de dados (por exemplo, obtenha
todos os empregados com salrio < R$ 50.000,00).
Manipulao de dados
O SGBD deve ser capaz de lidar com solicitaes do usurio para buscar, atualizar ou excluir
dados existentes no banco de dados, ou para acrescentar novos dados ao banco de dados. Em outras
138

palavras, o SGBD deve incluir um componente processador de DML ou compilador de DML para lidar
com a linguagem de manipulao de dados (DML data manipulation language).
Em geral, as solicitaes de DML podem ser planejadas ou no-planejadas:
a. Uma solicitao planejada aquela para a qual a necessidade foi prevista com bastante antecedncia
em relao ao momento em que a solicitao executada. O DBA provavelmente ter ajustado o
projeto de banco de dados fsico de modo a garantir um bom desempenho para solicitaes planejadas.
b. Em contraste, uma solicitao no-planejada uma consulta ad hoc, isto , uma solicitao cuja
necessidade no foi prevista com antecedncia mas, em vez disso, surgiu no ltimo instante. O projeto
de banco de dados fsico pode estar ou no adaptado de forma ideal para a solicitao especfica sendo
considerada.
Para usar a terminologia introduzida no Captulo 1 (Seo 1.3), as solicitaes planejadas so
caractersticas de aplicaes operacionais ou de produo, ao passo que as solicitaes noplanejadas so caractersticas de aplicaes para apoio deciso. Alm disso, as solicitaes
planejadas em geral sero emitidas a partir de programas aplicativos escritos previamente, enquanto as
solicitaes no-planejadas sero, por definio, emitidas de modo interativo por meio de algum
processador de linguagem de consulta. Nota: como vimos no Captulo 1, o processador de linguagem de
consulta na realidade uma aplicao on-line embutida, no uma parte do SGBD per se; ele foi includo
na Figura 2.4 por completitude.
Otimizao e execuo
As requisies de DML, planejadas ou no-planejadas, devem ser processadas pelo componente
otimizador, cujo propsito determinar um modo eficiente de implementar a requisio. A otimizao
discutida em detalhes no Captulo 17. As requisies otimizadas so ento executadas sob o controle do
gerenciador em tempo de execuo (run time). Nota: na prtica, o gerenciador em tempo de execuo
provavelmente invocar algum tipo de gerenciador de arquivos para obter acesso aos dados
armazenados. Os gerenciadores de arquivos so descritos resumidamente no final desta seo.
Segurana e integridade de dados
O SGBD deve monitorar requisies de usurios e rejeitar toda tentativa de violar as restries
de segurana e integridade definidas pelo DBA (consulte a seo anterior). Essas tarefas podem ser
executadas em tempo de compilao ou em tempo de execuo, ou ainda em alguma mistura dos dois.
Recuperao e concorrncia de dados
O SGBD ou, mais provavelmente, algum outro componente de software relacionado, cm geral
chamado gerenciador de transaes ou monitor de processamento de transaes (monitor TP) deve
impor certos controles de recuperao e concorrncia. Os detalhes desses aspectos do sistema esto
alm do escopo deste captulo; consulte a Parte IV deste livro, que contm uma descrio em
profundidade do assunto. Nota: o gerenciador de transaes no mostrado na Figura 2.4 porque, em
geral, ele no faz parte do SGBD propriamente dito.
Dicionrio de dados
O SGBD deve fornecer uma funo de dicionrio de dados. O dicionrio de dados pode ser
considerado um banco de dados em si (mas um banco de dados do sistema, no um banco de dados
impem restries - de segurana e integridade do usurio), O dicionrio contm dados sobre os
dados (s vezes chamados metadados ou descritores) ou seja, definies de outros objetos do
sistema, em vez de dados brutos somente. Em particular, todos os vrios esquemas e mapeamentos
(externos, conceituais etc.) e todas as diversas restries de segurana e integridade estaro
armazenados, tanto na forma de fonte quanto de objeto, no dicionrio. Um dicionrio completo
tambm incluir muitas informaes adicionais mostrando, por exemplo, os programas que utilizam
determinadas partes do banco de dados, os usurios que exigem certos relatrios, os terminais
conectados ao sistema, e assim por diante. O dicionrio poderia at estar na verdade, provavelmente
deve estar integrado ao banco de dados que define e, portanto, incluir sua prpria definio. Por
certo, deve haver a opo de consultar o dicionrio como qualquer outro banco de dados para que, por
exemplo, seja possvel saber que programas e/ou usurios tero maior probabilidade de serem afetados
139

por alguma alterao proposta no sistema. Consulte o Captulo 3 para ver uma discusso adicional sobre
o assunto.
Nota: estamos entrando agora em uma rea sobre a qual existe muita confuso de terminologia.
Algumas pessoas fariam referncia ao que estamos chamando de dicionrio como um diretrio ou
catlogo, o que implica que diretrios ou catlogos so de algum modo inferiores a um verdadeiro
dicionrio e reservariam o termo dicionrio para designar uma variedade especfica (importante) de
ferramenta para desenvolvimento de aplicaes. Outros termos que tambm so algumas vezes
empregados para designar essa ltima variedade de objetos so repositrio de dados (ver Captulo 13) e
enciclopdia de dados.

desnecessrio dizer que o SGBD deve realizar todas as funes identificadas anteriormente de forma
to eficiente quanto possvel.
Podemos resumir tudo o que foi mencionado antes afirmando que a funo geral do SGBD fornecer a
interface do usurio para o sistema de banco de dados. A interface do usurio pode ser definida como a fronteira
no sistema abaixo da qual tudo invisvel para o usurio. Por definio, portanto, a interface do usurio est no
nvel externo. Contudo, como veremos no Captulo 9, h algumas situaes em que improvvel que a viso
externa seja significativamente diferente da poro relevante da viso conceitual subjacente, pelo menos nos
produtos SQL comerciais de hoje.
Conclumos esta seo com uma breve comparao entre os sistemas de gerenciamento de bancos de
dados discutidos anteriormente e os sistemas de gerenciamento de arquivos (gerenciadores de arquivos ou
servidores de arquivos). Em linhas gerais, o gerenciador de arquivos o componente do sistema operacional
bsico que administra arquivos armazenados; portanto, em termos informais, ele est mais prximo ao disco
que o SGBD. (Na verdade, o SGBD costuma ser montado sobre algum tipo de gerenciador de arquivos.) Desse
140

modo, o usurio de um sistema de gerenciamento de arquivos ser capaz de criar e destruir arquivos
armazenados e de executar operaes simples de busca e atualizao sobre registros armazenados em tais
arquivos. No entanto, em contraste com o SGBD:
Os gerenciadores de arquivos no tm conhecimento da estrutura interna dos registros armazenados e, por
isso, no podem lidar com requisies que dependam de um conhecimento dessa estrutura.
Em geral, eles fornecem pouco ou nenhum suporte para restries de segurana e integridade.
Em geral, eles fornecem pouco ou nenhum suporte para controles de recuperao e concorrncia.
No h verdadeiramente um conceito de dicionrio de dados no nvel do gerenciador de arquivos.
Eles proporcionam muito menos independncia de dados que o SGBD.
Em geral, os arquivos no esto integrados ou compartilhados no mesmo sentido que o banco de dados
(normalmente, eles so privativos de algum usurio ou alguma aplicao em particular).
O GERENCIADOR DE COMUNICAES DE DADOS
Nesta seo, consideraremos resumidamente o tpico de comunicaes de dados. As requisies a
bancos de dados de um usurio final so, na verdade, transmitidas da estao de trabalho do usurio que pode
estar fisicamente afastada do prprio sistema de banco de dados para alguma aplicao on-line (embutida ou
no), e da at o SGBD, sob a forma de mensagens de comunicao. De modo semelhante, as respostas do SGBD e
da aplicao on-line para a estao de trabalho do usurio tambm so transmitidas sob a forma de mensagens.
Todas essas transmisses de mensagens tm lugar sob o controle de outro componente de software, o
gerenciador de comunicaes de dados (gerenciador DE data communications).
O gerenciador DE no faz parte do SGBD, mas um sistema autnomo. Porm, como o gerenciador DE e
o SGBD so claramente obrigados a trabalhar em harmonia, s vezes os dois so considerados parceiros de igual
nvel em um empreendimento cooperativo de nvel mais alto, denominado sistema de banco de
dados/comunicaes de dados (sistema DB/DE), no qual o SGBD toma conta do banco de dados e o gerenciador
DE manipula todas as mensagens de e para o SGBD ou, mais precisamente, de e para aplicaes que utilizam o
SGBD. Porm, neste livro, teremos pouco a dizer sobre o manejo de mensagens como essas (o que, por si s,
um assunto extenso). A Seo 2.12 descreve resumidamente a questo das comunicaes entre sistemas distintos
(ou seja, entre mquinas diferentes em uma rede de comunicaes, como a Internet), mas esse , na realidade,
um tpico parte.
ARQUITETURA CLIENTE/SERVIDOR
Descrevemos at agora neste captulo os sistemas de bancos de dados sob o ponto de vista da chamada
arquitetura ANSI/SPARC. Em particular, a Figura 2.3 forneceu uma representao simplificada dessa arquitetura.
Nesta seo, examinaremos os sistemas de bancos de dados sob uma perspectiva um pouco diferente.
Naturalmente, o objetivo geral desses sistemas fornecer suporte ao desenvolvimento e execuo de
aplicaes de bancos de dados. Portanto, sob um ponto de vista de mais alto nvel, um sistema de banco de
dados pode ser considerado como tendo uma estrutura muito simples em duas partes, consistindo em um
servidor (tambm chamado back end) e um conjunto de clientes (tambm chamados front ends). Consulte a
Figura 2.5. Explicao:
O servidor o prprio SGBD. Ele admite todas as funes bsicas de SGBDs discutidas na Seo 2.8 definio
de dados, manipulao de dados, segurana e integridade de dados, e assim por diante. Em particular, ele oferece
todo o suporte de nvel externo, conceitual e interno que examinamos nas Sees 2.3 a 2.6. Assim, o termo
servidor neste contexto to-somente um outro nome para o SGBD.
Os clientes so as diversas aplicaes executadas sobre o SGBD tanto aplicaes escritas por usurios quanto
aplicaes internas, ou seja, aplicaes fornecidas pelo fabricante do SGBD ou por produtores independentes. No
que se refere ao servidor, claro que no existe nenhuma diferena entre aplicaes escritas pelo usurio e
aplicaes internas todas elas empregam a mesma interface para o servidor, especificamente a interface de
nvel externo discutida na Seo 2.3.

141

Nota: certas aplicaes especiais chamadas utilitrios poderiam constituir uma exceo ao que vimos antes,
pois s vezes elas podem precisar operar diretamente no nvel interno do sistema (conforme mencionamos na
Seo 2.5). Esses utilitrios devem ser considerados componentes integrais do SGBD, em vez de aplicaes no
sentido usual. Os utilitrios sero discutidos com mais detalhes na prxima seo.
Vamos aprofundar o exame da questo de aplicaes escritas pelo usurio versus aplicaes fornecidas
pelo
fabricante:
Aplicaes escritas pelo usurio so basicamente programas aplicativos comuns, escritos (em geral) em uma
linguagem de programao convencional de terceira gerao (L3G), como C ou COBOL, ou ento em alguma
linguagem proprietria de quarta gerao (L4G) embora em ambos os casos a linguagem precise ser de algum
modo acoplada a uma sublinguagem de dados apropriada, conforme explicamos na Seo 2.3.
Banco de dados
Aplicaes fornecidas por fabricante (chamadas frequentemente de ferramentas tools) so aplicaes cuja
finalidade bsica auxiliar na criao e execuo de outras aplicaes! As aplicaes criadas so aplicaes
adaptadas a alguma tarefa especfica (elas podem no ser muito semelhantes s aplicaes no sentido
convencional; de fato, a finalidade das ferramentas permitir aos usurios, em especial aos usurios finais, criar
aplicaes sem ter de escrever programas em uma linguagem de programao convencional). Por exemplo, uma
das ferramentas fornecidas pelo fabricante ser um gerador de relatrios, cuja finalidade permitir que os
usurios finais obtenham relatrios formatados a partir do sistema sob solicitao. Qualquer solicitao de
relatrio pode ser considerada um pequeno programa aplicativo, escrito em uma linguagem de gerao de
relatrios
de
nvel
muito
alto
(e
finalidade
especial).
As ferramentas fornecidas pelo fabricante podem ser divididas em diversas classes mais ou menos
distintas:
a. Processadores de linguagem de consulta.
b. Geradores de relatrios.
c. Subsistemas grficos de negcios.
d. Planilhas eletrnicas.
e. Processadores de linguagem natural.
f. Pacotes estatsticos.
g. Ferramentas para gerenciamento de cpias ou extrao de dados.
h. Geradores de aplicaes (inclusive processadores L4G).
i. Outras ferramentas para desenvolvimento de aplicaes, inclusive produtos de engenharia de software
auxiliada pelo computador (CASE computer-aided software engineering).
Os detalhes dessas ferramentas e de vrias outras esto alm do escopo deste livro; entretanto,
observamos que, tendo em vista que (como foi dito antes) toda a importncia de um sistema de banco de dados
est em dar suporte criao e execuo de aplicaes, a qualidade das ferramentas disponveis , ou deve ser,
um fator preponderante na deciso sobre o banco de dados (isto , o processo de escolha do produto de banco
de dados apropriado). Em outras palavras, o SGBD em si no o nico fator que precisa ser levado em
considerao,
nem
mesmo

necessariamente
o
fator
mais
significativo.
Encerramos esta seo com uma referncia para o que se segue. Como o sistema por completo pode
estar to claramente dividido em duas partes, servidores e clientes, surge a possibilidade de executar os dois em
142

mquinas diferentes. Em outras palavras, existe o potencial para o processamento distribudo. O processamento
distribudo significa que mquinas diferentes podem estar conectadas entre si para formar algum tipo de rede de
comunicaes, de tal modo que uma nica tarefa de processamento de dados possa ser dividida entre vrias
mquinas na rede. Na verdade, essa possibilidade to atraente por urna variedade de razes, principalmente
de ordem econmica que o termo cliente/servidor passou a se aplicar a quase exclusivamente ao caso em
que o cliente e o servidor esto de fato localizados em mquinas diferentes. Examinaremos o processamento
distribudo com mais detalhes na Seo 2.12.
UTILITRIOS
Utilitrios so programas projetados para auxiliar o DBA com diversas tarefas administrativas. Como
mencionamos na seo anterior, alguns programas utilitrios operam no nvel externo do sistema e, portanto, so
na verdade apenas aplicaes de uso especial; alguns podem nem mesmo ser fornecidos pelo fabricante do
SGBD, mas sim por algum fabricante independente. Porm, outros utilitrios operam diretamente no nvel
interno (em outras palavras, eles realmente fazem parte do servidor) e, desse modo, devem ser oferecidos pelo
fornecedor do SGBD.
Aqui esto alguns exemplos dos tipos de utilitrios que costumam ser necessrios na prtica:
Rotinas de carga, a fim de criar a verso inicial do banco de dados a partir de um ou mais arquivos do sistema
operacional.
Rotinas de descarregamento/recarregamento, a fim de descarregar o banco de dados, ou partes dele, para o
meio de armazenamento de backup e recarregar dados dessas cpias de backup ( claro que o utilitrio de
recarregamento basicamente idntico ao utilitrio de carga que acabamos de mencionar).
Rotinas de reorganizao, a fim de rearranjar os dados no banco de dados armazenado por vrias razes (em
geral, relacionadas com o desempenho) por exemplo, para agrupar dados de algum modo particular no disco,
ou para reaver o espao ocupado por dados que se tornaram obsoletos.
Rotinas estatsticas, a fim de calcular diversas estatsticas de desempenho, tais como tamanhos de arquivos e
distribuio de valores de dados ou contagens de E/S etc.
Rotinas de anlise, a fim de analisar as estatsticas mencionadas antes. A lista precedente representa apenas
uma pequena amostra das funes em geral oferecidas pelos utilitrios; existe uma srie de outras possibilidades.

PROCESSAMENTO DISTRIBUDO
Repetindo o que mencionamos na Seo 2.10, a expresso processamento distribudo significa que
mquinas diferentes podem estar conectadas entre si em uma rede de comunicaes como a Internet, de tal
modo que uma nica tarefa de processamento de dados possa se estender a vrias mquinas na rede. (A
expresso processamento paralelo tambm utilizada algumas vezes com significado quase idntico, exceto
pelo fato de que as diferentes mquinas tendem a manter uma certa proximidade fsica em um sistema
paralelo e no precisam estar to prximas em um sistema distribudo por exemplo, elas poderiam estar
geograficamente dispersas no ltimo caso.) A comunicao entre as vrias mquinas efetuada por algum tipo
de software de gerenciamento de rede possivelmente uma extenso do gerenciador DE discutido na Seo 2.9
ou, com maior probabilidade, um componente de software separado.
So possveis muitos nveis ou variedades de processamento distribudo. Conforme mencionamos na
Seo 2.10, um caso simples envolve a execuo do back end do SGBD (o servidor) em uma das mquinas e dos
front ends da aplicao (os clientes) em outra. Ver Figura 2.6.
Como vimos no final da Seo 2.10, o termo cliente/servidor, embora seja estritamente uma expresso
relacionada com a arquitetura, passou a ser quase um sinnimo da disposio ilustrada na Figura 2.6, na qual o
cliente e o servidor funcionam em mquinas diferentes. De fato, h muitos argumentos em favor de um esquema
desse tipo:
O primeiro basicamente o argumento usual sobre o processamento paralelo: especificamente, muitas
unidades de processamento esto sendo agora aplicadas na tarefa global, enquanto o processamento do servidor
(o banco de dados) e o processamento do cliente (a aplicao) esto sendo feitos em paralelo. O tempo de
resposta e a vazo (throughput) devem assim ser melhorados.
Alm disso, a mquina servidora pode ser uma mquina feita por encomenda para se ajustar funo de SGBD
(uma mquina de banco de dados) e pode assim fornecer melhor desempenho de SGBD.

143

Do mesmo modo, a mquina cliente poderia ser uma estao de trabalho pessoal, adaptada s necessidades do
usurio final e, portanto, capaz de oferecer interfaces melhores, alta disponibilidade, respostas mais rpidas e, de
modo geral, maior facilidade de utilizao para o usurio.

Vrias mquinas clientes distintas poderiam ser capazes (na verdade, normalmente sero capazes) de obter
acesso mesma mquina servidora. Assim, um nico banco de dados poderia ser compartilhado entre vrios
sistemas clientes distintos (ver Figura 2.7).
Alm dos argumentos anteriores, existe tambm o fato de que a execuo do(s) cliente(s) e do servidor
em mquinas diferentes combina com a maneira como as empresas operam na realidade. E bastante comum que
uma nica empresa um banco, por exemplo opere muitos computadores, de tal modo que os dados
correspondentes a uma parte da empresa sejam armazenados em um computador e os dados de outra parte
sejam armazenados em outro computador. Prosseguindo com o exemplo do banco, muito provvel que os
usurios de uma agncia precisem ocasionalmente obter acesso a dados armazenados em outra agncia.
Portanto, observe que as mquinas clientes poderiam ter seus prprios dados armazenados, e a mquina
servidora poderia ter suas prprias aplicaes. Dessa forma, em geral caia maquina atuar como um servidor para
alguns usurios e como cliente para outros (ver Figura 2.8); em outras palavras, cada mquina admitir um
sistema de banco de dados por inteiro, no sentido estudado em sees anteriores deste captulo.
O ltimo ponto a mencionar que uma nica mquina cliente poderia ser capaz de obter acesso a vrias
mquinas servidoras diferentes (a recproca do caso ilustrado na Figura 2.7). Esse recurso desejvel porque,
como mencionamos antes, as empresas em geral operam de tal maneira que a totalidade de seus dados no fica
armazenada em uma nica mquina, mas se espalha por muitas mquinas diferentes, e as aplicaes s vezes
precisaro ter a capacidade de conseguir acesso a dados de mais de uma mquina. Basicamente, esse acesso
pode ser fornecido de dois modos distintos:
Um dado cliente pode ser capaz de obter acesso a qualquer nmero de servidores, mas somente um de cada
vez (ou seja, cada requisio individual ao banco de dados tem de ser direcionada para apenas um servidor). Em
um sistema desse tipo no possvel, dentro de uma nica requisio, combinar dados de dois ou mais servidores
diferentes. Alm disso, o usurio de tal sistema tem de saber qual mquina em particular contm cada um dos
fragmentos de dados.
O cliente pode ser capaz de obter acesso a muitos servidores simultaneamente (isto , uma nica solicitao ao
banco de dados poderia ter a possibilidade de combinar dados de vrios servidores). Nesse caso, os servidores
aparentam para o cliente de um ponto de vista lgico ser realmente um nico servidor, e o usurio no
precisa saber qual mquina contm cada um dos itens de dados.

144

Esse ltimo caso constitui um exemplo daquilo que se costuma chamar sistema de banco de dados
distribudo, O tema de bancos de dados distribudos um grande tpico por si s; levado a sua concluso lgica, o
suporte completo a bancos de dados distribudos implica que uma nica aplicao deve ser capaz de operar de
modo transparente sobre dados espalhados por uma variedade de bancos de dados diferentes, gerenciados por
uma variedade de SGBDs diferentes, funcionando em uma variedade de mquinas distintas, com suporte de uma
variedade de sistemas operacionais diferentes e conectados entre si por meio de uma variedade de redes de
comunicaes diferentes onde de modo transparente significa que a aplicao opera, de um ponto de vista
lgico, como se os dados fossem todos gerenciados por um nico SGBD funcionando em uma nica mquina. Esse
recurso pode parecer algo muito difcil de conseguir, mas altamente desejvel de uma perspectiva prtica, e os
fabricantes esto trabalhando arduamente para tornar realidade esses sistemas. Discutiremos em detalhes os
sistemas de bancos de dados distribudos no Captulo 20.

145

Normalizao
O conceito de normalizao foi introduzido por E. F. Codd em 1970 (primeira forma normal). Esta tcnica
um projeto matemtico formal, que tem seus fundamentos na teoria dos conjuntos.
Atravs deste processo pode-se, gradativamente, substituir um conjunto de entidades e relacionamentos
por um outro, o qual se apresenta purificado em relao s anomalias de atualizao (incluso, alterao e
excluso) as quais podem causar certos problemas, tais como: grupos repetitivos (atributos multivalorados) de
dados, dependncias parciais em relao a uma chave concatenada, redundncia de dados desnecessrios,
perdas acidentais de informao, dificuldade na representao de fatos da realidade observada e dependncias
transitivas entre atributos.
Os conceitos abordados podem ser aplicados s duas formas de utilizao da normalizao:
- sentido de cima para baixo (TOP-DOWN):
Aps a definio de um modelo de dados, aplica-se a normalizao para se obter uma sntese dos dados,
bem como uma decomposio das entidades e relacionamentos em elementos mais estveis, tendo em vista sua
implementao fsica em um banco de dados;
- sentido de baixo para cima (BOTTON-UP):
Aplicar a normalizao como ferramenta de projeto do modelo de dados, usando os relatrios,
formulrios e documentos utilizados pela realidade em estudo, constituindo-se em uma ferramenta de
levantamento.
Anomalias de Atualizao
Observando-se o formulrio de PEDIDO apresentado na fig. 12.1, podemos considerar que uma entidade
formada com os dados presentes ter a seguinte apresentao:
Atributos da entidade PEDIDO:
o nmero do pedido
o prazo de entrega
o cliente
o endereo
o cidade
o UF
o CGC
o inscrio estadual
o cdigo do produto (*)
o unidade do produto (*)
o quantidade do produto (*)
o descrio do produto (*)
o valor unitrio do produto (*)
o valor total do produto (*)
o valor total do pedido (*)
o cdigo do vendedor
o nome do vendedor
(*) Atributos que se repetem no documento

146

Caso a entidade fosse implementada como uma tabela em um banco de dados, as seguintes anomalias
iriam aparecer:
anomalia de incluso: ao ser includo um novo cliente, o mesmo tem que estar relacionado a uma venda;
anomalia de excluso: ao ser excludo um cliente, os dados referentes as suas compras sero perdidos;
anomalia de alterao: caso algum fabricante de produto altere a faixa de preo de uma determinada
classe de produtos, ser preciso percorrer toda a entidade para se realizar mltiplas alteraes.
Primeira forma normal (1FN)
Em uma determinada realidade, s vezes encontramos algumas informaes que se repetem (atributos
multivalorados), retratando ocorrncias de um mesmo fato dentro de uma nica linha e vinculadas a sua chave
primria.
Ao observarmos a entidade PEDIDO, apresentada acima, visualizamos um certo grupo de atributos
(produtos solicitados) se repete (nmero de ocorrncias no definidas) ao longo do processo de entrada de dados
na entidade.
A 1FN diz que: cada ocorrncia da chave primria deve corresponder a uma e somente uma informao
de cada atributo, ou seja, a entidade no deve conter grupos repetitivos (multivalorados).

147

Para se obter entidades na 1FN, necessrio decompor cada entidade no normalizada em tantas
entidades quanto for o nmero de conjuntos de atributos repetitivos. Nas novas entidades criadas, a chave
primria a concatenao da chave primria da entidade original mais o(s) atributo(s) do grupo repetitivo
visualizado(s) como chave primria desse grupo.
Para a entidade PEDIDO, temos:
Entidade no normalizada:

Ao aplicarmos a 1FN sobre a entidade PEDIDO, obtemos mais uma entidade chamada de ITEM-DEPEDIDO, que herdar os atributos repetitivos e destacados da entidade PEDIDO.

148

Um PEDIDO possui no mnimo 1 e no mximo N elementos de ITEM-DE-PEDIDO e um ITEM-DE-PEDIDO


pertence a 1 e somente 1 PEDIDO, logo o relacionamento POSSUI do tipo 1:N.
Variao Temporal e a Necessidade de Histrico
Observamos que normalmente, ao se definir um ambiente de armazenamento de dados, seja ele um
banco de dados ou no, geralmente se mantm a ltima informao cadastrada, que s vezes, por sua prpria
natureza, possui um histrico de ocorrncias. Mas como a atualizao sempre feita sobre esta ltima
informao, perdem-se totalmente os dados passados.
A no-observao deste fato leva a um problema na hora de uma auditoria de sistemas, que em vez de
utilizar uma pesquisa automatizada sobre os histricos, se v obrigada a uma caada manual cansativa sobre um
mar imenso de papeis e relatrios, e que na maioria das vezes se apresenta incompleta ou inconsistente devido a
valores perdidos (documentos extraviados) ou no documentados.
Com a no-utilizao de histricos e a natural perda destas informaes, a tomada de decises por parte
da alta administrao de uma empresa pode levar a resultados catastrficos para a corporao.
Toda vez que a deciso de armazenar o histrico de algum atributo for tomada, cria-se explicitamente um
relacionamento de um para muitos (1-N), entre a entidade que contm o atributo e a entidade criada para conter
o histrico deste atributo. Passa a existir ento uma entidade dependente, contendo (no mnimo) toda data em
que houve alguma alterao do atributo bem como o respectivo valor do atributo para cada alterao. A chave
desta entidade de histrico ser concatenada, e um de seus atributos ser a data de referncia.
149

Com base nesta necessidade de armazenamento de histricos, aps a aplicao da 1FN devemos observar
para cada entidade definida, quais de seus atributos se transformaro com o tempo, se preciso armazenar
dados histricos deste atributo e em caso afirmativo, observar o perodo de tempo que devemos conservar este
histrico, ou atravs de quantas alteraes foram realizadas neste atributo.
Dependncia Funcional
Para descrevermos as prximas formas normais, se faz necessria a introduo do conceito de
dependncia funcional, sobre o qual a maior parte da teoria de normalizao foi baseada.
Dada uma entidade qualquer, dizemos que um atributo ou conjunto de atributos A dependente
funcional de um outro atributo B contido na mesma entidade, se a cada valor de B existir nas linhas da entidade
em que aparece, um nico valor de A. Em outras palavras, A depende funcionalmente de B.
Ex.: Na entidade PEDIDO, o atributo PRAZO-DE-ENTREGA depende funcionalmente de NMERO-DOPEDIDO.
O exame das relaes existentes entre os atributos de uma entidade deve ser feito a partir do
conhecimento (conceitual) que se tem sobre a realidade a ser modelada.
Dependncia Funcional Total (Completa) e Parcial
Na ocorrncia de uma chave primria concatenada, dizemos que um atributo ou conjunto de atributos
depende de forma completa ou total desta chave primria concatenada, se e somente se, a cada valor da chave (e
no parte dela), est associado um valor para cada atributo, ou seja, um atributo no (dependncia parcial) se
apresenta com dependncia completa ou total quando s dependente de parte da chave primria concatenada e
no dela como um todo.
Ex.: dependncia total na entidade ITEM-DO-PEDIDO, o atributo QUANTIDADE-DO-PRODUTO depende
de forma total ou completa da chave primria concatenada (NMERO-DO-PEDIDO+CODIGO-DO-PRODUTO).
A dependncia total ou completa s ocorre quando a chave primria for composta por vrios
(concatenados) atributos, ou seja, em uma entidade chave primria composta de um nico atributo no ocorre
este tipo de dependncia.
Dependncia Funcional Transitiva
Quando um atributo ou conjunto de atributos A depende de outro atributo B que no pertence chave
primria, mas dependente funcional desta, dizemos que A dependente transitivo de B.
Ex.: dependncia transitiva na entidade PEDIDO, os atributos ENDEREO, CIDADE, UF, CGC e INSCRIOESTATUAL so dependentes transitivos do atributo CLIENTE. Nesta mesma entidade, o atributo NOME-DOVENDEDOR dependente transitivo do atributo CODIGO-DO-VENDEDOR.
Com base na teoria sobre as dependncias funcionais entre atributos de uma entidade, podemos
continuar com a apresentao das outras formas normais.
Segunda Forma Normal (2FN)
Devemos observar se alguma entidade possui chave primria concatenada, e para aqueles que
satisfizerem esta condio, analisar se existe algum atributo ou conjunto de atributos que dependem desta chave
parcial, ou seja, uma entidade para estar na 2FN no pode ter atributos com dependncia parcial em relao
chave primria.
Ex.: A entidade ITEM-DO-PEDIDO apresenta uma chave primria concatenada e por observao, notamos
que os atributos UNIDADE-DO-PRODUTO, DESCRIO-DO-PRODUTO e VALOR-UNITARIO depende de forma
parcial do atributo CODIGO-DO-PRODUTO, que faz parte da chave primria. Logo devemos aplicar a 2FN sobre
esta entidade. Quando aplicamos a 2FN sobre ITEM-DO-PEDIDO, ser criada a entidade PRODUTO que herdar os
atributos UNIDADE-DO-PRODUTO, DESCRIO-DO-PRODUTO e VALOR-UNITRIO e ter como chave primria o
CODIGO-DO-PRODUTO.
150

Um PRODUTO participa de no mnimo 1 e no mximo N elementos de ITEM-DE-PEDIDO e um ITEM-DEPRODUTO s pode conter 1 e somente 1 PRODUTO. Logo, o novo relacionamento criado do tipo N:1.
Terceira Forma Normal (3FN)
Uma entidade est na 3FN se nenhum de seus atributos possui dependncia transitiva em relao a outro
atributo da entidade que no participe da chave primria, ou seja, no exista nenhum atributo intermedirio
entre a chave primria e o prprio atributo observado.
Terceira Forma Normal (3FN)
Uma entidade est na 3FN se nenhum de seus atributos possui dependncia transitiva em relao a outro
atributo da entidade que no participe da chave primria, ou seja, no exista nenhum atributo intermedirio
entre a chave primria e o prprio atributo observado.

151

Ao retirarmos a dependncia transitiva, devemos criar uma nova entidade que contenha os atributos que
contenha os atributos que dependem transitivamente de outro e sua chave primria o atributo que causou esta
dependncia.
Alm de no conter atributos com dependncia transitiva, entidades na 3FN no devem conter atributos
que sejam o resultado de algum clculo sobre outro atributo, que de certa forma pode ser encarada como uma
dependncia funcional.
Ex.: Na entidade PEDIDO, podemos observar que o atributo NOME-DO-VENDEDOR depende
transitivamente do atributo CODIGO-DO-VENDEDOR que no pertence chave primria. Para eliminarmos esta
anomalia devemos criar a entidade VENDEDOR, com o atributo NOME-DO-VENDEDOR e tendo como chave
primria o atributo CODIGO-DO-VENDEDOR.
Encontramos ainda o conjunto de atributos formados por ENDEREO, CIDADE, UF, CGC e INSCRIOESTADUAL que dependem transitivamente do atributo CLIENTE. Neste caso, devemos criar a entidade
VENDEDOR, com o atributo NOME-DO-VENDEDOR e tendo como chave primria o atributo CODIGO-DOVENDEDOR.
Encontramos ainda o conjunto de atributos formados por ENDEREO, CIDADE, UF, CGC e INSCRIOESTADUAL que dependem transitivamente do atributo CLIENTE. Neste caso, devemos criar a entidade CLIENTE
que conter os atributos ENDEREO, CIDADE, UF, CGC e INSCRIO-ESTADUAL. Para chave primria desta
entidade vamos criar um atributo chamado CODIGO-DO-CLIENTE que funcionar melhor como chave primria do
que NOME-DO-CLIENTE, deixa este ltimo como simples atributo da entidade CLIENTE.

152

Um PEDIDO s feito por um e somente um CLIENTE e um CLIENTE pode fazer de zero (clientes que
devem ser contatados mais frequentemente pelos vendedores) at N elementos de PEDIDO. Um PEDIDO s
tirado por um e somente um VENDEDOR e um VENDEDOR pode tirar de zero (vendedores que devem ser
reciclados em termos de treinamento, para aumentar o poder de venda) a N elementos de PEDIDO.
Forma Normal de BOYCE/CODD (FNBC)
As definies da 2FN e 3FN, desenvolvidas por Codd, no cobriam certos casos. Esta inadequao foi
apontada por Raymond Boyce em 1974. Os casos no cobertos pelas definies de Codd somente ocorrem
quando trs condies aparecem juntas:
a entidade tenha vrias chaves candidatas;
estas chaves candidatas sejam concatenadas (mais de um atributo);
as chaves concatenadas compartilham pelo menos um atributo comum.
Na verdade, a FNBC uma extenso da 3FN, que no resolvia certas anomalias presentes na informao contida
em uma entidade. O problema foi observado porque a 2FN e a 3FN s tratavam dos casos de dependncia parcial
e transitiva de atributos fora de qualquer chave, porm quando o atributo observado estiver contido em uma
chave (primria ou candidata), ele no captado pelo verificao da 2FN e 3FN.
A definio da FNBC a seguinte: uma entidade est na FNBC se e somente se todos os determinantes
forem chaves candidatas. Notem que esta definio em termos de chaves candidatas e no sobre chaves
primrias.
Considere a seguinte entidade FILHO:

153

Por hiptese, vamos assumir que um professor possa estar associado a mais de uma escola e uma sala.
Sob esta suposio, tanto a chave (candidata) concatenada NOME-DA-ESCOLA+SALA-DA-ESCOLA bem como
NOME-DA-ESCOLA+NOME-DO-PROFESSOR podem ser determinantes. Logo esta entidade atende s trs
condies relacionadas anteriormente:
as chaves candidatas para a entidade FILHO so: NOME-DO-FILHO+ENDEREO-DO-FILHO+NMERO-DASALA e NOME-DO-FILHO+NOME-DO-PROFESSOR;
todas as trs chaves apresentam mais de um atributo (concatenados);
todas as trs chaves compartilham um mesmo atributo: NOME-DO-FILHO.
Neste exemplo, NOME-DO-PROFESSOR no completamente dependente funcional do NMERO-DASALA, nem NMERO-DA-SALA completamente dependente funcional do NOME-DO-PROFESSOR. Neste caso,
NOME-DO-PROFESSOR realmente completamente dependente funcional da chave candidata concatenada
NOME-DO-FILHO+NOME-DO-PROFESSOR.
Ao se aplicar FNBC, a entidade FILHO deve ser dividida em duas entidades, uma que contm todos os
atributos que descrevem o FILHO, e uma segunda que contm os atributos que designam um professor em uma
particular escola e nmero de sala.

Quarta Forma Normal (4FN)


Na grande maioria dos casos, as entidades normalizadas at a 3FN so fceis de entender, atualizar e de
se recuperar dados. Mas s vezes podem surgir problemas com relao a algum atributo no chave, que recebe
valores mltiplos para um mesmo valor de chave. Esta nova dependncia recebe o nome de dependncia
multivalorada que existe somente se a entidade contiver no mnimo trs atributos.
Uma entidade que esteja na 3FN tambm est na 4FN, se ela no contiver mais do que um fato
multivalorado a respeito da entidade descrita. Esta dependncia no o mesmo que uma associao M:N entre
atributos, geralmente descrita desta forma em algumas literaturas.
154

Ex.: Dada a entidade hipottica a seguir:

Como podemos observar, esta entidade tenta conter dois fatos multivalorados: as diversas peas
compradas e os diversos compradores. Com isso apresenta uma dependncia multivalorada entre CODIGOFORNECEDOR e o CODIGO-PEA e entre CDIGO-FORNECEDOR e o CODIGO-COMPRADOR. Embora esteja na 3FN,
ao conter mais de um fato multivalor, torna sua atualizao muito difcil, bem como a possibilidade de problemas
relativos ao espao fsico de armazenamento poderem ocorrer, causados pela ocupao desnecessria de rea de
memria (primria ou secundria), podendo acarretar situaes crticas em termos de necessidade de mais
espao para outras aplicaes.
Para passarmos a entidade acima para a 4FN, necessria a realizao de uma diviso da entidade
original, em duas outras, ambas herdando a chave CODIGO-FORNECEDOR e concatenado, em cada nova entidade,
com os atributos CODIGO-PEA e CODIGO-COMPRADOR.

Quinta Forma Normal (5FN)


Esta ltima forma normal trata do conceito de dependncia de juno, quando a noo de normalizao
aplicada decomposio, devido a uma operao de projeo, e aplicada na reconstruo devido a uma juno.
A 5FN trata de casos bastantes particulares, que ocorrem na modelagem de dados, que so os
relacionamentos mltiplos (ternrios, quaternrios, ..., n-rios). Ela fala que um registro est na sua 5FN, quando
o contedo deste mesmo registro no puder ser reconstrudo (juno) a partir de outros registros menores,
extrados deste registro principal. Ou seja, se ao particionar um registro, e sua juno posterior no conseguir
recuperar as informaes contidas no registro original, ento este registro est na 5FN.
Vamos ilustrar o uso da 5FN utilizando um exemplo de relacionamento ternrio:
Ex.: Uma empresa constri equipamentos complexos. A partir de desenhos de projeto desses
equipamentos, so feitos documentos de requisies de materiais, necessrios para a construo do
equipamento; toda a requisio de um material d origem a um ou mais pedidos de compra. A modelagem deste
exemplo, ir mostrar quais materiais de que requisies geraram quais pedidos. Na fig. 12.2 apresentado este
relacionamento ternrio.

155

A tabela 2, representante do relacionamento ternrio M-R-P, poderia conter os seguintes dados:

Utilizando uma soma de visualizao da dependncia de juno, obtemos o seguinte grfico de


dependncia de juno, mostrado na fig. 12.3.

Uma pergunta surge sobre este problema: possvel substituir o relacionamento ternrio por
relacionamentos binrios, como os apresentados na fig. 12.4.

Como resposta, podemos dizer que geralmente no possvel criar esta decomposio sem perda de
informao, armazenada no relacionamento ternrio.
Realizando uma projeo na tabela anterior, chegamos s entidades apresentadas na fig. 12.5.

156

Se realizarmos, agora, um processo de juno destas trs entidades, teremos:


Inicialmente, vamos juntar a entidade 1 com a entidade 2, atravs do campo pedido de compra. Obtemos
ento a entidade 4, mostrada na fig. 12.6:

Podemos observar que o registro apontado pela seta no existia na tabela original, ou seja, foi criado pela
juno das tabelas parciais. Devemos juntar a entidade 4, resultante da primeira juno, com a entidade
3, atravs dos campos material e requisio. Aps esta ltima operao de juno, obtemos a entidade 5,
mostrada na fig. 12.7.

157

Como se pode notar, ao se juntar as trs entidades, fruto da decomposio da entidade original, as
informaes destas foram preservadas. Isto significa que o relacionamento M-R-P no est na 5FN, sendo
necessrio decomp-lo em relacionamento binrios, os quais estaro na 5FN.
A definio da 5FN diz que: uma relao de 4FN estar em 5FN, quando seu contedo no puder ser
reconstrudo (existir perda de informao) a partir das diversas relaes menores que no possuam a mesma
chave primria. Esta forma normal trata especificamente dos casos de perda de informao, quando da
decomposio de relacionamentos mltiplos.
Com a 5FN, algumas redundncias podem ser retiradas, como a informao de que o ROTOR 1BW est
presente na requisio R3192, ser armazenada uma nica vez, a qual na forma no normalizada pode ser
repetida inmeras vezes.
Roteiro de Aplicao da Normalizao
Entidade ou documento no normalizado, apresentando grupos repetitivo e certas anomalias de
atualizao.
Aplicao da 1FN
- Decompor a entidade em uma ou mais entidades, sem grupos repetitivos;
- Destacar um ou mais atributos como chave primria da(s) nova(s) entidade(s), e este ser concatenado com a
chave primria da entidade original;
- Estabelecer o relacionamento e a cardinalidade entre a(s) nova(s) entidade(s) gerada(s) e a entidade geradora;
- Verificar a questo da variao temporal de certos atributos e criar relacionamentos 1:N entre a entidade
original e a entidade criada por questes de histrico.
Entidades na 1FN
Aplicao da 2FN
- Para entidades que contenham chaves primrias concatenadas, destacar os atributos que tenham dependncia
parcial em relao chave primria concatenada;
- Criar uma nova entidade que conter estes atributos, e que ter como chave primria o(s) atributo(s) do(s)
qual(quais) se tenha dependncia parcial;
- Sero criadas tantas entidades quanto forem os atributos da chave primria concatenada, que gerem
dependncia parcial;
- Estabelecer o relacionamento e a cardinalidade entre a(s) nova(s) entidade(s) gerada(s) e a entidade geradora.
Entidades na 2FN
- Verificar se existem atributos que sejam dependentes transitivos de outros que no pertencem chave
primria, sendo ela concatenada ou no, bem como atributos que sejam dependentes de clculo realizado a
partir de outros atributos;
- Destacar os atributos com dependncia transitiva, gerando uma nova entidade com este atributo e cuja chave
primria o atributo que originou a dependncia;
158

- Eliminar os atributos obtidos atravs de clculos realizados a partir de outros atributos.


Entidades na 3FN
aplicao da FNBC
- S aplicvel em entidades que possuam chaves primrias e candidatas concatenadas;
- Verificar se alguma chave candidata concatenada um determinante, e em caso afirmativo, criar uma entidade
com os que dependam funcionalmente deste determinante e cuja chave primria o prpria determinante.
Entidades na FNBC
- Aplicao da 4FN
- Para se normalizar em 4FN, a entidade tem que estar (obrigatoriamente) na 3FN;
- Verificar se a entidade possui atributos que no sejam participantes da chave primria e que sejam
multivalorados e independentes em relao a um mesmo valor da chave primria;
- Retirar estes atributos no chaves e multivalorados, criando novas entidades individuais para cada um deles,
herdando a chave primria da entidade desmembrada.
Entidades na 4FN
- aplicao da 5FN
- Aplicada em elemento que estejam na 4FN;
- A ocorrncia deste tipo de forma normal est vinculada aos relacionamentos mltiplos (ternrios, etc.) ou
entidades que possuam chave primria concatenada com trs ou mais atributos;
- Verificar se possvel reconstruir o contedo do elemento original a partir de elementos decompostos desta;
- Se no for possvel, o elemento observado no est na 5FN, caso contrrio os elementos decompostos
representam um elemento na 5FN.
Entidades na forma normal final
O processo de normalizao leva ao refinamento das entidades, retirando delas grande parte das redundncias e
inconsistncias. Naturalmente, para que haja uma associao entre entidades preciso que ocorram
redundncias mnimas de atributos que evidenciam estes relacionamentos entre entidades.
Desnormalizao
Parece um tanto quanto incoerente apresentar um item falando sobre desnormalizao. Porm os
processos de sntese de entidades vistos at aqui levam criao de novas entidades e relacionamentos.
Os novos elementos criados podem trazer prejuzos na hora de serem implementados em um SGBD.
Devido as caractersticas de construo fsica de certos banco de dados, algumas entidades e relacionamentos
devem ser desnormalizados para que o SGBD tenha um melhor desempenho.
Hoje em dia, existe um grande debate sobre as chamadas semnticas da normalizao, sua utilidade e
facilidade em relao implementao fsica em um sistema operacional.
Vrios estudos e algumas consideraes esto sendo realizados, e se chega at a utilizao de banco de
dados relacionais no normalizados, por apresentarem maior ligao com a realidade e por terem vnculos
matemticos mais amenizados.
Outro aspecto da normalizao que todas as definies sobre as formas normais aps a 1FN, ainda no
foram exaustivamente examinadas, propiciando assim grandes controvrsias. A reduo das anomalias de
atualizao devido s formas normais de alta ordem sofre os ataques bvios dos grandes problemas (fsicos) de
atualizao, pois as relaes esto excessivamente normalizadas e com isso uma simples alterao pode encadear
um efeito cascata bastante profundo no banco de dados, ocasionando um aumento bastante significativo no
tempo.

159

Infelizmente, os argumentos que podem viabilizar o processo de desmoralizao sofrem de uma


deficincia e aderncia matemtica.
Pesquisas recentes indicam que as estruturas desnormalizadas (apelidadas de forma normal no primeira)
tm um atrativo matemtico similar ao que foi o da normalizao. Estas pesquisas esto provendo recentes
definies sobre lgebra relacional desnormalizada e extenses linguagem SQL para a manipulao de relaes
desnormalizadas.
Ao se optar pela desnormalizao, deve-se levar em conta o custo da redundncia de dados e as
anomalias de atualizao decorrentes.
Chegou-se concluso tambm que o esprito da normalizao contradiz vrios princpios importantes,
relativos modelagem semntica e construo de bases de dados em SGBD orientados por objeto.
Consideraes Finais sobre Normalizao
Antes de qualquer concluso, podemos observar que as formas normais nada mais so do que restries
de integridade, e medida que se alimenta este grau de normalizao, torna-se cada vez mais restritivas.
Dependendo do SGBD relacional utilizado, essas restries podem se tornar benficas ou no.
A forma de atuao da normalizao no ciclo de vida de um projeto de banco de dados pode ser mais
satisfatria no desenvolvimento (botton-up) de modelos preliminares, a partir da normalizao da documentao
existente no ambiente analisado, bem como de arquivos utilizados em alguns processos automatizados neste
ambiente.
No caso do desenvolvimento top-down, no qual um modelo de dados criado a partir da visualizao da
realidade, a normalizao serve para realizar um aprimoramento deste modelo, tornando-o menos redundante e
inconsistente. No caso desta viso, a normalizao torna-se um poderoso aliado da implementao fsica do
modelo.
Por experincia, podemos afirmar que a construo de um modelo de dados j leva naturalmente ao
desenvolvimento de entidades e relacionamentos na 3FN, ficando as demais (FNBC, 4FN, e 5FN) para melhorias e
otimizaes.
A criao de modelos de dados, partindo-se da normalizao de documentos e arquivos pura e
simplesmente, no o mais indicado, pois na verdade estaremos observando o problema e no dando uma
soluo para ele. Neste caso, estaremos projetando estruturas de dados que se baseiam na situao atual (muitas
vezes catica) e que certamente no vo atender s necessidades reais do ambiente em anlise. Ao passo que, se
partimos para a criao do modelo de dados com entidades e relacionamentos aderentes realidade em estudo
(mundo real), vamos naturalmente desenvolver uma base de dados ligada viso da realidade e como
consequncia iremos solucionar o problema de informao.
A aplicao da modelagem de dados, ao longo da nossa vida profissional, tem sido bastante gratificante,
mostrando principalmente, que a tcnica de normalizao uma ferramenta muito til como apoio ao
desenvolvimento do modelo de dados. Seja ela aplicada como levantamento inicial (documentos e arquivos) bem
como otimizador do modelo de dados, tendo em vista certas restries quanto implementao fsica nos banco
de dados conhecidos.
Todas as ideias sobre eficincia da normalizao passam necessariamente sobre tempo e espao fsico,
em funo, principalmente, das consultas efetuadas pelos usurios bem como a quantidade de bytes necessrios
para guardar as informaes.
Nota-se, atravs da observao, que o projeto do modelo conceitual nem sempre pode ser derivado para
o modelo fsico final. Com isso, de grande importncia que o responsvel pela modelagem (analista, AD, etc.)
no conhea s a teoria iniciada por Peter Chen, mas tambm tenha bons conhecimentos a respeito do ambiente
do banco de dados utilizado pelo local em anlise.

160

Regras de Integridade
As regras de integridade fornecem a garantia de que mudanas feitas no banco de dados por usurios
autorizados no resultem em perda de consistncia de dados. Assim, as regras de integridade protegem o banco
de dados de danos acidentais.
J vimos regras de integridade para o modelo E-R. Essas regras possuem a seguinte forma:
Declarao de variveis a determinao de certos atributos, como chave candidata, para um dado
conjunto de entidades. O conjunto de inseres e atualizaes vlidas restrito quelas que no criem
duas entidades com o mesmo valor de chave candidata.
Forma de um relacionamento muitos para muitos, um para muitos, um para um. O conjunto de
relacionamentos um para um ou um para muitos restringe o conjunto de relacionamentos vlidos entre
os diversos conjuntos de entidades.
Em geral, uma regra de integridade constitui um predicado arbitrrio pertencente ao banco de dados. Entretanto,
predicados arbitrrios podem representar altos custos para serem testados. Assim, normalmente, as regras de
integridade so limitadas s que podem ser verificadas com o mnimo tempo de processamento.
Restries de Domnios
Vimos que um domnio de valores vlidos pode ser associado a qualquer atributo. Vimos tais restries
so especificadas em SQL DDL. Restries de domnio so as mais elementares formas de restries de
integridade. Elas so facilmente verificadas pelo sistema sempre que um novo item de dado incorporado ao
banco de dados.
possvel que diversos atributos tenham um mesmo domnio. Por exemplo, os atributos nome_cliente e
nome_empregado podem ter o mesmo domnio: o conjunto de todos os nomes de pessoas. Entretanto, os
domnios de saldo e nome_agncia certamente sero distintos. Ser, talvez, menos claro o caso nome_cliente e
nome_agncia que podem ter o mesmo domnio. No nvel de implementao, os nomes de agncia e clientes so
strings de caracteres. No entanto, essas linguagens inibem os quebra-galhos, que so frequentemente
necessrios na programao de sistemas. Uma vez que os sistemas de banco de dados so projetados para
atender a diversos usurios que no so especialistas em banco de dados, os benefcios de tipos fortemente
definidos geralmente apresentam mais desvantagens do que vantagens. Apesar disso, muito dos sistemas
existentes permitem apenas um reduzido nmero de domnios de tipos. Poucos sistemas, particularmente os
sistemas de banco de dados orientado a objeto, oferecem um conjunto rico de tipos de domnios que podem ser
facilmente ampliados.
A clusula check da SQL-92 permite modos poderosos de restries de domnios que a maioria dos
sistemas de tipos das linguagens de programao no permite. Especificamente, a clusula check permite ao
projeto do esquema determinar um predicado que deva ser satisfeito por qualquer valor designado a uma
varivel cujo tipo seja o domnio. Por exemplo, uma clusula check pode garantir que o domnio relativo ao turno
de trabalho de um operrio contenha somente valores maiores que um dado valor (turno mnimo), como
ilustrado aqui:
create domain turno_trabalho numeric (5,2)
o domnio de turno_trabalho declarado como um nmero decimal com um total de cinco dgitos, dois
dos quais colocados aps o ponto decimal, e o domnio possui uma restrio que assegura que o turno de
trabalho no seja inferior a 4,00. A clusula constraint valor_teste_turno opcional e usada para dar o nome
valor_teste_turno restrio. O nome usado para indicar quais restries foram violadas em determinada
atualizao.
A clusula check pode tambm ser usada para restringir os valores nulos em um domnio, como ilustrado
a seguir:

161

Como outro exemplo, o domnio pode ser restrito a determinado conjunto de valores por meio do uso da
clusula in:

Integridade Referencial
Frequentemente, desejamos garantir que um valor que aparece em uma relao para um dado conjunto
de atributos tambm aparea para um certo conjunto de atributos de outra relao. Essa condio chamada
integridade referencial
Conceitos Bsicos
Considere um par de relaes r(R) e s(S) e a juno natural
. Pode existir uma tupla tr em r que no
possa ser combinada a nenhuma tupla em s. Isto , no existe nenhum tS em s tal que
. Tais
tuplas so chamadas de tuplas pendentes. Dependendo do conjunto de entidades ou relacionamentos que est
sendo modelado, tuplas pendentes podem ou no ser aceitveis.
Sabemos que existe um tipo diferente de juno a juno externa para operar relaes contendo
tuplas pendentes. No estamos abordando consultas aqui, mas o modo de tratar a existncia, quando desejada,
de tuplas pendentes no banco de dados.
Suponha que exista a tupla t1 na relao conta, com t1[nome_agncia] = Lunartown, mas que no haja
nenhuma tupla na relao agncia para Lunartown. Essa situao pode ser indesejvel.
Esperamos que a relao agncia possua todas as agncias do banco. Portanto, a tupla t1 faz referncia a
uma conta de uma agncia inexistente. Obviamente, gostaramos de implementar uma regra de integridade que
proba tuplas pendentes desse tipo.
No entanto, nem todos os tipos de tuplas pendentes so indesejveis. Suponha que exista uma tupla t2 na
relao agncia, com t2[nome_agncia]= Mokan, mas no h nenhuma tupla da relao conta com referncia
agncia Mokan. Nesse caso, existe uma agncia que no possui nenhum conta.
Embora essa seja uma situao incomum, pode ocorrer quando uma agncia est sendo aberta ou
fechada. Assim, no devemos proibir esse tipo de situao.
A diferena entre esses dois exemplos tem origem em dois fatos:
O atributo nome_agncia do Esquema_conta uma chave estrangeira (foreign key) cuja referncia a
chave primria do Esquema_agncia.
O atributo nome_agncia do Esquema_agncia no uma chave estrangeira.
No exemplo de Lunartown, a tupla t1 de conta tem um valor para a chave estrangeira nome_agncia que
no aparece em agncia. No exemplo da agncia Mokan, a tupla t2 de agncia tem um valor nome_agncia que
no aparece em conta, mas nome_agncia no uma chave estrangeira. Assim, a diferena entre nossos dois
exemplos de tuplas pendentes a existncia de uma chave estrangeira.
Seja r1(R1) e r2(R2) relaes com chaves primrias K1 e K2, respectivamente. Dizemos que um subconjunto
de R2 uma chave estrangeira associada a K1 em relao a r1 se garantido que, para todo t2 em r2, existe uma
tupla t1 em r1, tal que t1[K1] = t2[]. Exigncias desse tipo so chamadas de regras de integridade referencial ou
subconjunto dependente. O ltimo termo advm do fato de ser possvel escrever a regra de integridade
referencial anterior como
deve ser igual a K1.

(r1). Note que, para a regra de integridade referencial ter sentido, cada

Integridade Referencial no Modelo E-R


Regras de integridade referencial aparecem com frequncia. Se derivarmos nosso esquema de bancos de
dados relacional em tabelas originadas de diagramas E-R, ento toda relao resultante de um conjunto de
relacionamentos possui regras de integridade referencial. A fig. 6.1 mostra um conjunto de relacionamentos R de
162

n elementos, relacionando os conjuntos de entidades E1, E2, ..., En. Seja Ki a chave primria de Ei. Os atributos para
o esquema da relao referente ao conjunto de relacionamentos R incluem K1K2... Kn. Cada Ki do esquema de
R uma chave estrangeira que leva a uma regra de integridade referencial.

Outra fonte de regras de integridade referencial so os conjuntos de entidades fracas. Vimos que o
esquema da relao para um conjunto de entidades fracas precisa incluir a chave primria do conjunto de
entidades do qual ele dependente. Assim, o esquema da relao para cada conjunto de entidades fracas inclui
uma chave estrangeira que leva a uma regra de integridade referencial.
Modificaes no Banco de Dados
As modificaes no banco de dados podem originar violao das regras de integridade referencial.
Colocamos aqui a verificao necessria a cada tipo de modificao no banco de dados para que se possa
preservar a seguinte regra de integridade referencial:

Insero. Se uma tupla t2 inserida em r2, o sistema deve garantir que exista uma tupla t1 em r1 tal que

t1[K]=t2[]. Isto :
Remoo. Se uma tupla t1 removida de r1, o sistema deve tratar tambm no conjunto de tuplas em r2

que so referidos por t1:


.
Se esse conjunto vazio, o comando de remoo foi rejeitado devido a algum erro ou a tupla que faz
referncia a t1 deve ser removida. Esta ltima alternativa pode levar a uma remoo em cascata se
algumas tuplas fizerem referncia a tuplas que se referem a t1 e assim por diante.
Atualizao. Precisamos considerar duas situaes de atualizaes: as que se referem relao (r2) e as
referidas pela relao (r1).
o Se uma tupla t2 da relao r2 atualizada e a atualizao modifica os valores da chave estrangeira
, ento feita uma verificao similar insero. Seja t2 o novo valor da tupla t2. O sistema
o

dever assegurar que:


Se uma tupla t1 da relao r1 atualizada e a atualizao modifica os valores de uma chave
primria (K), ento dever ser feito um teste similar ao realizado para a remoo. O sistema
dever computar
usando o valor antigo de t1 (o valor existente antes da aplicao
da atualizao). Se esse conjunto no for vazio, a atualizao ser rejeitada como uma ocorrncia
de erro ou as atualizaes sero realizadas em cascata, de modo similar ao que ocorre na
remoo.

Integridade Referencial em SQL


possvel definir chaves primrias, secundrias e estrangeiras como parte do comando create table da
SQL:
163

A clusula primary key do comando create table inclui a lista dos atributos que constituem a chave
primria.
A clusula unique do comando create table inclui a lista dos atributos que constituem uma chave
candidata.
A clusula foreign key do comando create table inclui a lista dos atributos que constituem a chave
estrangeira quanto o nome da relao qual a chave estrangeira faz referncia.

Ilustramos as declaraes de chaves estrangeiras e primrias usando definies de parte de nosso banco em SQL
DDL, mostrado na fig. 6.2. Note que no nos detivemos em modelar de modo preciso o mundo real no exemplo
do banco de dados de uma empresa da rea bancria. No mundo real, diversas pessoas podem ter o mesmo
nome, assim nome_cliente no pode ser chave primria para cliente. No mundo real, alguns outros atributos,
como o nmero do seguro social, ou uma combinao de atributos como nome e endereo, poderiam ser usados
como chave primria. Usamos nome_cliente como chave primria para conferir simplicidade e conciso a nosso
esquema de banco de dados.
Podemos usar a forma simplificada para declarar que uma nica coluna uma chave estrangeira:
A SQL tambm d suporte a uma outra maneira de formular a clusula chave estrangeira, em que uma
lista de atributos da relao por ela referida pode ser explicitamente especificada, e esses atributos so usados no
lugar da chave primria; essa lista de atributos precisa ser declarada como chave candidata de uma relao
referida.

Quando uma regra de integridade referencial violada, o procedimento normal rejeitar a ao que
ocasionou essa violao. Entretanto, a clusula relativa a foreign key em SQL-92 pode especificar que, se uma
remoo ou atualizao na relao a que ela faz referncia violar uma regra de integridade, ento, em vez de
rejeitar a ao, executam-se passos para modificao da tupla na relao que contm a referncia, de modo a
garantir a regra de integridade. Considere a seguinte definio de regra de integridade para a relao conta:
164

Devido clusula on delete cascade associada declarao da chave estrangeira, se a remoo de uma
tupla de agncia resultar na violao da regra de integridade anterior, a remoo no ser rejeitada. Ao contrrio,
a remoo feita em cascata na relao conta, de modo que as tuplas que se referirem a uma agncia
removida sejam tambm removidas. De modo similar, a atualizao de um campo referido por uma regra de
integridade no ser rejeitada se ela violar uma regra de integridade; pelo contrrio, o campo nome_agncia das
tuplas da relao conta ser tambm atualizado. A SQL-92 permite, tambm, que a clusula foreign key
especifique outros tipos de aes alm de cascata, como alterar o campo em questo (no caso, nome_agncia)
com nulos, ou um valor-padro, caso a regra seja violada.
Se houver uma cadeia de dependncias entre chaves estrangeiras de diversas relaes, uma remoo ou
uma atualizao em uma das extremidades poder propagar-se ao longo de toda a cadeia. Se uma atualizao ou
remoo em cascata provoca a violao de uma regra de integridade que no pode ser tratada por uma operao
de cascata seguinte, o sistema aborta a transao. Como resultado, todas as mudanas causadas pela transao,
assim como as aes em cascata decorrentes, sero desfeitas.
A semntica de chaves em SQL torna-se mais complexa pelo fato da SQL permitir valores nulos. As
seguintes regras, algumas das quais arbitrrias, so usadas para tratar esses valores nulos.
Todos os atributos de uma chave primria so declarados implicitamente como not null.
Atributos de uma declarao unique (isto , atributos de uma chave candidata) podem ser nulos,
contanto que no sejam declarados no-nulos de outro modo. A restrio para garantia da unicidade em
uma relao violada somente se duas tuplas da relao tm o mesmo valor para todos os atributos da
regra unique e todos os valores forem no-nulos. Assim, qualquer nmero de tuplas pode ser igual em
todas as colunas declaradas como nicas, sem que haja violao da regra de integridade, contanto que ao
menos uma das colunas tenha um valor nulo.
Atributos nulos em chaves estrangeiras so permitidos, contanto que no tenha sido declarados como
no-nulos de outro modelo. Se todas as colunas de uma chave estrangeira so no-nulas em uma
determinada tupla, a definio usual de regra de integridade em chave estrangeira ser empregada
naquela tupla. Se qualquer uma das colunas da chave nula, a tupla automaticamente aprovada na
regra de integridade. Essa definio arbitrria e nem sempre uma boa opo, assim a SQL fornece,
tambm, construtores que possibilitam mudana de comportamento em relao aos valores nulos.
Dada a complexidade e arbitrariedade natural das formas e comportamentos de restries (ou regras) de
integridade SQL em relao a valores nulos, melhor assegurar que todas as colunas especificadas em unique e
foreign key sejam declaradas, no permitindo nulos.
Asseres
Uma assero um predicado que expressa uma condio que desejamos que seja sempre satisfeita no
banco de dados. Restries de domnio e regras de integridade referencial so formas especiais de asseres.
Dispensamos substancial ateno a essas formas de asseres, porque so facilmente verificadas e aplicadas em
grande parte das aplicaes em banco de dados. Entretanto, existem muitas restries que no podem ser
expressas usando somente essas formas especiais. Exemplos dessas restries compreendem:
A soma de todos os totais em conta emprstimo de cada uma das agncias deve ser menor que a soma
de todos os saldos da contas dessa agncia.
165

Todo emprstimo deve ter ao menos um cliente que mantenha uma conta com saldo mnimo de mil
dlares.
Uma assero em SQL-92 toma a seguinte forma:

As duas regras mencionadas podem ser escritas como mostrado a seguir. J que a SQL no oferece um
construtor para todo X, P(X) (em que P um predicado), somos forados a implementar o construtor usando o
construtor no existe X tal que nenhum P(X), pode ser escrito em SQL.

Quando uma assero criada, o sistema verifica sua validade. Se as asseres so vlidas ento qualquer
modificao posterior no banco de dados ser permitida somente quando a assero no for violada. Quando as
asseres so complexas, a verificao pode gerar um aumento significativo em tempo de processamento. Por
isso, as asseres so usadas com muito cuidado.
Esse grande overhead para teste e manuteno de asseres tem levado alguns profissionais ligados ao
desenvolvimento de sistemas de banco de dados a excluir as asseres gerais ou a fornecer apenas formas
especiais de asseres, que possam ser verificadas facilmente.
Gatilhos (Triggers)
Um gatilho um comando que executado pelo sistema automaticamente, em consequncia de uma
modificao no banco de dados. Duas exigncias devem ser satisfeitas para a projeo de um mecanismo de
gatilho:
1. Especificar as condies sob as quais o gatilho deve ser executado.
2. Especificar as aes que sero tomadas quando um gatilho for disparado.
Os gatilhos so mecanismos teis para avisos a usurios ou para executar automaticamente determinadas
tarefas quando as condies para isso so criadas. Como ilustrao, suponha que, em vez de permitir saldos
negativos em conta, o banco crie condies para que a conta corrente seja zerada e o saldo negativo seja
transferido para uma conta emprstimo. Essa conta emprstimo ter o mesmo nmero da conta corrente em
questo. Para esse exemplo, a condio para o disparo de um gatilho uma atualizao na relao conta que
resulta em um valor negativo para saldo.
Suponha que Jones tenha feito um resgate em uma conta que gerou um saldo negativo. Suponha que t
denote a tupla de conta com um valor negativo para saldo. As aes a tomar so as seguintes:
Inserir uma nova tupla s na relao emprstimo com:

166

(Note que, se t[saldo] for negativo, impedimos que t[saldo] receba um valor positivo em um total de
emprstimo.)
Inserir uma nova tupla u na relao devedor com:

Tornar t[saldo] igual a 0.

O padro SQL-92 no dispe de gatilhos, embora a proposta original da SQL do Sistema R proponha
alguns recursos para gatilhos. Alguns sistemas existentes possuem seus prprios recursos de gatilho no
padronizados. Ilustraremos, aqui, como um gatilho para saldo negativo poderia ser escrito na verso original de
SQL.

167

A palavra-chave new usada antes de T.saldo indica que o valor de T.saldo aps a atualizao dever ser
usado; se ele for omitido, o valor existente antes da atualizao ser, ento, usado.
Os gatilhos so chamados, algumas vezes, de regras (rules), ou regras ativas (active rules), mas no devem
ser confundidos com as regras da Datalog, que tratam realmente de definies de vises.
Dependncia Funcional
A noo de dependncia funcional uma generalizao da noo de chave. Dependncias funcionais
representam um papel importante no projeto de banco de dados.
Conceitos Bsicos
Dependncias funcionais so restries ao conjunto de relaes vlidas. Elas permitem expressar
determinados fatos em nosso banco de dados relativos empresa que desejamos modelar.
Eis o conceito de superchave como segue. Seja R o esquema de uma relao. Um subconjunto K de R
uma superchave de R em qualquer relao vlida r(R) para todos os pares de t1 e t2 de tuplas em r tal que t1t2,
ento t1[K]t2[K]. isto , nenhum par de tuplas em qualquer relao validade r(R) deve ter o mesmo valor no
conjunto de atributos K.
A noo de dependncia funcional generaliza a noo de superchave. Seja R e R. A dependncia
funcional:  realiza-se em R se, em qualquer relao validade r(R), para todos os pares de tuplas t1 e t2 em r,
tal que t1[] = t2[], t1[] = t2[] tambm ser verdade.
Usando a notao de dependncia funcional, dizemos que K uma superchave de R se KR. isto , K
uma superchave se, para todo t1[K]=t2[K], t1[R]=t2[R] (isto , t1=t2).
A dependncia funcional permite-nos expressar restries que as superchaves no expressam. Considere
o esquema:
esquema_info_emprstimo=(nome_agncia, nmero_emprstimo, nome_cliente, total)
O conjunto de dependncias funcionais que queremos garantir para esse esquema relao :

Entretanto, no esperamos realizar dependncia funcional para:


j que, em geral, um emprstimo pode ser contrado por mais de um cliente (por exemplo, para ambos os
membros de um casal, marido-mulher).
Podemos usar dependncia funcional de dois modos:
1. Usando-as para o estabelecimento de restries sobre um conjunto de relaes vlidas. Devemos, assim,
concentr-las somente quelas relaes que devem satisfazer um dado conjunto de dependncias
funcionais. Se desejarmos restringi-las a relaes do esquema R que satisfaam um conjunto F de
dependncias funcionais, dizemos que F realiza-se em R.
2. Usando-as para verificao de relaes, de modo a saber se as ltimas so vlidas sob um dado conjunto
de dependncias funcionais. Se desejarmos restringi-las a relaes do esquema R que satisfaam um
conjunto F de dependncias funcionais, dizemos que r satisfaz F.
Consideremos a relao r da fig. 6.3 para verificar quais dependncias funcionais so satisfeitas. Observe que
AC satisfeita. Duas tuplas tm valor a1 em A. essas tuplas tm um mesmo valor de C denominado cI. de
modo similar, duas tuplas com valor a2 em A tm mesmo valor c2 em C, mas eles possuem valor diferentes em A,
a2 e a3, respectivamente. Assim, encontramos um par de tuplas t1 e t2 tal que t1[C]=t2[C], mas t1[A]t2[A].

168

Diversas outras dependncias funcionais so satisfeitas por r, incluindo, por exemplo, a dependncia
funcional AB  D. Note que usamos AB como notao simplificada para [A,B], reduzindo-se a um padro mais
prtico. Observe que no existe nenhum par de tuplas distintas t1 e t2 tal que t1[AB]=t2[AB]. Portanto, se
t1[AB]=t2[AB], entoa necessrio que t1=t2 e, assim, t1[D]=t2[D]. Logo, r satisfaz AB  D.
Algumas dependncias funcionais so consideradas triviais porque so satisfeitas por todas as relaes.
Por exemplo, AA satisfeita por todas as relaes que contm o atributo A. Na leitura literal da definio de
dependncia funcional, podemos notar que, para todos os atributos t1 e t2 tal que t1[A]=t2[A] ser tambm
verdade. De modo similar, AB  A satisfeita para todas as relaes envolvendo o atributo A. Em geral, uma
dependncia funcional da forma  trivial se .
Para distinguir os conceitos de uma relao que satisfaz uma dependncia e de uma dependncia
realizando-se em um esquema, retornaremos ao exemplo do banco. Se considerarmos a relao cliente (com o
esquema_cliente), como mostrado na fig. 6.4, notamos que rua_cliente  cidade_cliente satisfeita. Entretanto,
acreditamos que, no mundo real, duas cidades podem possuir duas ou mais ruas com o mesmo nome. Assim,
possvel, em algum tempo, haver uma instncia da relao cliente na qual rua_cliente  cidade_cliente no
satisfeita. Logo, no incluiremos rua_cliente  cidade_cliente no conjunto das dependncias funcionais que so
realizadas no Esquema_cliente.

Na relao emprstimo (do esquema_emprstimo) na fig. 6.5, vemos que nmero_emprstimo  total
satisfeita. Ao contrrio do que ocorre em cidade_cliente e rua_cliente no esquema_cliente, acreditamos que, em
empresas reais, eles so modelados de modo a garantir que cada conta tenha somente um total. Portanto,
queremos que a condio nmero_emprstimo total seja sempre satisfeita para a relao emprstimo. Em
outras palavras, necessitamos da restrio nmero_emprstimototal para o esquema_emprstimo.

169

Na relao agncia da fig. 6.6, vemos que nome_agnciafundos satisfeita, assim como
fundosnome_agncia. Gostaramos de garantir que nome_agnciafundos fosse realizada em
esquema_agncia. Entretanto, no queremos que fundosnome_agncia seja realiza, uma vez que possvel
haver diversas agncias com o mesmo valor de fundos.
Embora a SQL no fornea um modo simples para especificao de dependncia funcional podemos
escrever consultas para verificao de dependncias funcionais, assim como criar asseres para garantia de
dependncias funcionais.

Conforme segue, consideramos que, quando projetamos um banco de dados relacional, primeiro
relacionamos as dependncias funcionais que sempre precisam ser realizadas. No exemplo do banco, nossa
relao de dependncias funcionais engloba as seguintes:
No esquema_agncia:
nome_agncia  cidade_agncia
nome_agncia  fundos
No esquema_cliente:
nome_cliente  cidade_cliente
nome_cliente  rua_cliente
No esquema_emprstimo:
nmero_emprstimo  total
nmero_emprstimo  nome_agncia
No esquema_devedor:
nenhuma dependncia funcional

170

No esquema_conta:
nmero_conta  nome_agncia
nmero_conta  saldo
No esquema_depositante:
nenhuma dependncia funcional

Clausura de um Conjunto de Dependncias Funcionais


No basta considerar um dado conjunto de dependncias funcionais. preciso considerar todos os
conjuntos de dependncias funcionais que so realizados. Podemos mostrar que, dado um conjunto F de
dependncias funcionais, prova-se que outras dependncias funcionais realizam-se. Dizemos que esse tipo de
dependncia funcional logicamente implcito em F.
Suponha um dado esquema de relao R = (A, B, C, G, H, I) o conjunto de dependncias funcionais:
AB
AC
CG H
CG  I
BH
A dependncia funcional:
AH
logicamente implcita. Isto , podemos mostrar que, sempre que um dado conjunto de dependncias
funcionais se realiza, AH tambm se realiza. Suponha que t1 e t2 so duas tuplas, tais que:
t1[A] = t2[A]
J que dado que AB, dessa definio de dependncia funcional decorre que:
t1[B] = t2[B]
Ento, desde que BH seja dada, decorre desta definio de dependncia funcional que:
t1[H]=t2[H]
Portanto, mostramos que, sempre que t1 e t2 forem tuplas, tais que t1[A]=t2[A], necessariamente t1[H] =
t2[H]. Mas essa exatamente a definio de AH.
Seja F um conjunto de dependncias funcionais. A clausura de F o conjunto de todas as dependncias
funcionais logicamente implcitas em F. Denotamos a clausura de F por F+. Dado F, podemos computar F+
diretamente da definio formal de dependncia funcional. Se F for grande, esse processo pode tornar-se lento e
difcil. Tal qual a computao de F+, exige argumentos do tipo dado anteriormente para mostrar que AH est
em clausura em nosso conjunto de exemplo de dependncias. Existem tcnicas mais simples para o raciocnio da
dependncia funcional.
A primeira tcnica tem por base trs axiomas ou regras para inferncia da dependncia funcional. Para
aplicao dessas regras, precisamos encontrar todos os F+ de um dado F. Nas regras a seguir, adotamos a
conveno do uso de letras gregas para conjuntos de atributos e de letras maisculas do alfabeto romano para
atributos individuais. Usamos para denotar
.
Regra de reflexividade. Se um conjunto de atributos e
, ento  realiza-se.
Regra de incremento. Se  realiza-se e um conjunto de atributos, ento  tambm realizase.
Regra de transitividade. Se  realiza-se e  realiza-se, ento  realiza-se.

171

Essas regras so slidas, porque elas no geram nenhuma dependncia funcional incorreta. As regras so
completas, porque, para um dado conjunto F de dependncias funcionais, elas nos permitem criar todo F+. Para
simplificar, relacionamentos regras adicionais:
Regra de unio. Se  e , ento  tambm realiza-se.
Regra de decomposio. Se  realiza-se, ento  e  tambm realizam-se.
Regra pseudotransitiva. Se  e , ento  tambm realiza-se.
Apliquemos nossas regras ao esquema do exemplo apresentado anteriormente R=(A, B, C, G, H, I) e ao conjunto F
de dependncias funcionais {AB, AC, CGH, CGI, BH}. Relacionamos diversos membros de F+ aqui:
AH. Desde que AB e BH realizam-se, aplicamos a regra da transitividade. Observe que foi mais fcil
aplicar os axiomas de Armstrong para mostrar que AH se realiza do que raciocinando diretamente
sobre as definies, como fizemos anteriormente.
CGHI. J que CGH e CGI, a regra da pseudotransitividade implica a realizao de AGI.
Clausura de Conjunto de Atributos
Para verificar se um conjunto uma superchave, precisamos conceber um algoritmo para computar o
conjunto de atributos determinados funcionalmente por . Podemos deduzir que esse algoritmo tambm til
como parte do processamento da clausura de um conjunto de dependncias funcionais F.
Seja um conjunto de atributos. Chamamos o conjunto dos atributos funcionalmente determinados por
, sob um conjunto de dependncias funcionais F, de clausura de sob F, denotada por +. A fig. 6.7 mostra um
algoritmo, escrito em pseudo-Pascal, para computar +. O conjunto de dependncias funcionais F e o conjunto
de atributos funcionam como entrada. A sada armazenada na varivel resultado.
Para ilustrao de como o algoritmo da fig. 6.7 funciona, iremos us-lo para processar (AG)+ com as
dependncias funcionais definidas anteriormente. Comearemos com resultado = AG. A primeira execuo do
lao while para verificao da dependncia funcional ir chegar a:
AB obriga-nos a incluir B no resultado. Para perceber esse fato, observemos que AB est em F, A
resultado (o que AG), assim, resultado := resultado B.
AC obriga que resultado se torne ABCG.
CGH obriga que resultado se torne ABCGH.
CGI obriga que resultado se torne ABCGHI.
Na segunda vez em que executamos o lao while, no ser adicionado nenhum outro atributo a
resultado, e o algoritmo terminar.

Vejamos por que o algoritmo da fig. 6.7 est correto. J que  sempre se realiza (pela regra da
reflexidade), o primeiro passo correto. Exigimos que, para qualquer subconjunto de resultado, . J que
comeamos o lao while com resultado sendo verdadeiro, podemos adicionar ao resultado somente se
resultado e . Mas, ento, pela regra reflexiva, resultado e, pela transitividade, . Outra aplicao
da transitividade mostra que  (usando  e ). A regra da unio implica que resultado
, assim
determina, funcionalmente, qualquer resultado novo gerado pelo lao while. Dessa forma, qualquer atributo
obtido pelo algoritmo est em +.

172

fcil perceber que o algoritmo encontra todos os atributos de +. Se h um atributo de + que no esteja
ainda em resultado, ento preciso que haja uma dependncia funcional , para a qual
resultado, e que
ao menos um atributo em no esteja em resultado.
Por outro lado, no pior caso, esse algoritmo pode tomar tempo proporcional ao quadrado do tamanho de
F. H um algoritmo mais rpido (embora ligeiramente mais complexo) que consome tempo proporcionalmente
linear ao tamanho de F.
Cobertura Cannica
Suponha que tenhamos um conjunto de dependncias funcionais F sobre o esquema de uma relao.
Sempre que uma atualizao realizada na relao, o sistema de banco de dados deve garantir que todas as
dependncias funcionais em F sejam satisfeitas no novo estado do banco de dados, ou dever reverter as
alteraes caso no o sejam.
Podemos reduzir os esforos exigidos para o teste por meio da simplificao de um dado conjunto de
dependncias funcionais, com ou sem a alterao daquele conjunto de clausura. Qualquer banco de dados que
satisfaa um conjunto simplificado de dependncias funcionais deve tambm satisfazer o conjunto original e viceversa, uma vez que os dois conjuntos tm a mesma clausura. Entretanto, o conjunto simplificado mais
facilmente verificado. O conjunto simplificado pode ser construdo com descrevemos a seguir. Primeiro,
precisamos de algumas definies.
Um atributo de uma dependncia funcional extrnseco se podemos remov-lo sem alterar a clausura do
conjunto de dependncias funcionais. Formalmente, atributos extrnsecos so definidos conforme segue.
Considere um conjunto de dependncias funcionais F e a dependncia funcional  em F.
O atributo A extrnseco a se A , e F implica logicamente (F {}) {( A)}.
O atributo A extrnseco a se A , e o conjunto de dependncias funcionais (F {}) {( A)}
implica logicamente F.
Uma cobertura cannica Fc para F o conjunto de dependncias tal que F implique logicamente todas as
dependncias de FC e FC implique logicamente todas as dependncias em F. Alm disso, FC deve apresentar as
seguintes propriedades:
Nenhuma dependncia funcional em FC contm um atributo extrnseco.
Cada lado esquerdo da dependncia funcional em FC nico. Isto , no h duas dependncias 1 1 e
2 2 em Fc tal que 1= 2.
Uma cobertura cannica para um conjunto de dependncias funcionais F pode ser computada como:

Pode-se mostrar que a cobertura cannica de F, FC, possui a mesma clausura de F; ento, verificar se F
satisfeita. Entretanto, Fc mnima em certo sentido ela no contm atributos extrnsecos e as dependncias
funcionais, com mesmo lado esquerdo, foram combinadas. mais econmico verificar FC que testar o prprio F.
Considere o seguinte conjunto de dependncias funcionais F do esquema (A, B, C):
ABC
BC
AB
ABC
Vejamos como computar a cobertura cannica para F.
173

H duas dependncias funcionais com o mesmo conjunto de atributos do lado esquerdo da seta:
ABC
AB
Combinamos essas dependncias funcionais em ABC.
A extrnseco em ABC porque F implica logicamente (F {ABC}) {BC}. Essa assero verdadeira
porque BC j est em nosso conjunto de dependncias funcionais.
C extrnseco em ABC, uma vez que ABC est implcita logicamente por AB e BC.
Assim, nossa cobertura cannica :
AB
BC

Dado um conjunto F de dependncias funcionais, pode ser que uma dependncia funcional total no
conjunto seja extrnseca, no sentido de que, tirando-as, no h mudana na clausura de F. podemos mostrar que
uma cobertura cannica FC de F no contm nenhuma dependncia funcional extrnseca. Suponha que, de modo
contrrio, houvesse tal dependncia funcional extrnseca em FC. O lado direito dos atributos da dependncia
poderia ser extrnseco, o que no possvel na definio da cobertura cannica.

174

Projeto e implementao de um banco de dados relacional


Genericamente, o objetivo do projeto de um banco de dados relacional gerar um conjunto de esquemas
de relaes que nos permita armazenar informaes sem redundncia desnecessria e, ainda, nos permita
recuperar informaes facilmente. Uma das abordagens possveis seria projetar esquemas na forma normal
apropriada. Para determinar se um esquema de relao atende a uma das formas normais, precisamos de
informaes adicionais sobre a empresa real cujo banco de dados estamos modelando. J vimos como podemos
usar dependncias funcionais para expressar fatos acerca dos dados.
Armadilhas no Projeto de banco de dados Relacional
Antes de prosseguir com nossa discusso sobre formas normais e dependncias de dados, vejamos o que
determina a qualidade de um projeto de banco de dados. Entre as propriedades indesejveis em um bom projeto
de banco de dados de banco de dados temos:
Informaes repetidas.
Inabilidade para representao de certas informaes.
Podemos discutir esses problemas usando uma modificao no projeto de banco de dados. Entre as
propriedades indesejveis em um bom projeto de banco de dados temos:
Informaes repetidas.
Inabilidade para representao de certas informaes.
Podemos discutir esses problemas usando uma modificao no projeto de banco de dados no exemplo que temos
usado de uma empresa de rea bancria; diferente do usado anterior, a informao acerca de emprstimos ser
agora representada em uma nica relao, linha_de_crdito, que ser definido pelo esquema de relao:
esquema_linha_de_crdito=(nome_agncia, cidade_agncia, fundos, nome_cliente, nmero_emprstimo, total)
A fig. 7.1 mostra uma instncia da relao linha_de_crdito (esquema_linha_de_crdito). Uma tupla t da
relao linha_de_crdito tem o seguinte significado intuitivo:
t[fundos] so os fundos totais de uma determinada agncia cujo nome t[nome_agncia].
t[cidade_agncia] a cidade onde determinada agncia de nome t[nome_agncia] est localizada.
t[nmero_emprstimo] o nmero atribudo ao emprstimo feito na agncia denominada
t[nome_agncia] para o cliente de nome t[nome_cliente].
t[total] o montante da dvida do emprstimo cujo nmero t[nmero_emprstimo].

Suponha que desejamos adicionar um novo emprstimo ao nosso banco de dados. Digamos que o
175

emprstimo, no valor de 1,5 mil dlares, foi contrado na agncia Perryridge para o cliente Adams. O
nmero_emprstimo ser L-31. Em nosso projeto, precisamos de uma tupla com valores em todos os atributos do
esquema_linha_de_crdito. Assim, necessrio repetir os dados sobre fundos e cidade referentes agncia
Perryridge na adio da tupla
(Perryridge, Horseneck, 1700000, Adams, L-31, 1500)
na relao linha_de_crdito. De modo geral, dados sobre fundos e localizao da agncia devem aparecer toda
vez que um emprstimo contrado naquela agncia.
A necessidade de repetio de informaes imposta pelo nosso projeto alternativo indesejvel.
Repeties desperdiam espao. Alm disso, dificulta atualizaes no banco de dados. Suponha, por exemplo,
que a agncia Perryridge se mude de Horseneck para Newtown. Em nosso projeto original, uma tupla da relao
agncia ser alterada. Nesse projeto alternativo, diversas tuplas da relao linha_de_crdito devero sofrer
alteraes. Assim, as atualizaes sero mais custosas no novo projeto que no original. Quando realizarmos a
alterao no projeto alternativo, precisamos ter certeza de que todas as tuplas pertencentes agncia Perryridge
sero alteradas, seno nosso banco de dados ir apresentar duas cidades para a agncia Perryridge.
Essa observao fundamental para entender por que o projeto considerado ruim. Sabemos que uma
agncia bancria est localizada em apenas uma cidade, naturalmente. Por outro lado, sabemos que uma agncia
pode
conceder
diversos
emprstimos.
Em
outras
palavras,
a
dependncia
funcional
nome_agnciacidade_agncia se realiza no esquema_linha_de_crdito, mas no esperamos que a dependncia
funcional pode ser usada para especificao formal quando o projeto de banco de dados bom.
Outro problema com o projeto esquema_linha_de_crdito que no podemos representar diretamente a
informao relativa a uma agncia (nome_agncia, cidade_agncia, fundos), salvo se houver ao menos um
emprstimo concedido pela agncia. O problema que as tuplas da relao linha_de_crdito exigem valores para
nmero_emprstimo, total e nome_cliente.
Uma soluo para esse problema introduzir valores nulos para tratar as atualizaes por meio de vises.
Recorde-se, entretanto, de que difcil trabalhar com valores nulos. Se no estamos dispostos a tratar com
valores nulos, ento s poderemos criar informaes sobre as agncias quando o primeiro emprstimo na
agncia for realizado. Pior, poderemos perder essa informao quando todos os emprstimos da agncia forem
pagos. Logicamente, essa situao impensvel, j que, em nosso projeto original, as informaes a respeito das
agncias esto disponveis independente de existirem ou no emprstimos mantidos pela agncia, e sem a
necessidade de usar valores nulos.
Decomposio
O exemplo de um maus projeto sugere que poderamos decompor um esquema de relao com diversos
atributos em vrios esquemas com diversos atributos em vrios esquemas com menor nmero de atributos.
Decomposies descuidadas, entretanto, podem gerar outro tipo de projeto de m qualidade.
Considere uma alternativa de projeto, em que esquema_linha_de_crdito decomposto nos dois
esquemas que se seguem:
esquema_agncia_cliente = (nome_agncia, cidade_agncia, fundos, nome_cliente)
esquema_cliente_emprstimo = (nome_cliente, nmero_emprstimo, total)
Usando a relao linha_de_crdito da fig. 7.1, construmos nossas novas relaes cliente_agncia
(esquema_agncia_cliente) e cliente_emprstimo (esquema_cliente_emprstimo), como se segue:

Mostramos as relaes resultados agncia_cliente e nome_cliente nas fig. 7.2 e 7.3, respectivamente.
Naturalmente, h casos em que precisamos reconstruir a relao emprstimo. Por exemplo, suponha que
desejamos encontrar todas as agncias que tenham emprstimos cujos totais sejam inferiores a mil dlares.
176

Nenhuma relao em nosso banco de dados alternativo contm esses dados. Precisamos reconstruir a relao
linha_de_crdito. Parece que podemos faz-lo escrevendo:

A fig. 7.4 mostra o resultado do processamento de agncia_cliente


cliente_emprstimo. Quando
comparamos essa relao e a primeira relao linha_de_crdito (fig. 7.1), notamos algumas diferenas. Embora
todas as tuplas que aparecem em linha_de_crdito apaream em agncia_cliente
h tuplas em agncia_cliente
exemplo, agncia_cliente

cliente_emprstimo,

cliente_emprstimo que no esto em linha_de_crdito. Em nosso


cliente_emprstimo tem as seguintes tuplas adicionais:

177

Considere a consulta encontre todas as agncias que tenham feito um emprstimo com totais menores
que mil dlares. Se olharmos a fig. 7.1, veremos que somente as agncias Mianus e Round Hill possuem totais de
emprstimo menores que mil dlares. Entretanto, quando aplicamos a expresso
obtemos trs nomes de agncias: Mianus, Round Hill e Downtown.
Examinaremos esse exemplo mais de perto. Se acontecer de um cliente contrariar vrios emprstimo em
diferentes agncias, no poderemos identificar a qual agncia pertence qual emprstimo. Assim, da juno de
agncia_cliente e cliente_emprstimo, no obtemos somente as tuplas que tnhamos originalmente em
linha_de_crdito, mas tambm diversas tuplas adicionais. Embora haja mais tuplas em agncia_cliente
cliente_emprstimo, temos, na verdade, menos informao. De qualquer modo, no poderemos representar nas
informaes do banco de dados quais clientes so devedores de quais agncias. Devido a essa perda de
informao, chamamos a decomposio do esquema_linha_de_crdito em esquema_agncia_cliente e
esquema_cliente_emprstimo de decomposio com perda (lossy decomposition), ou uma decomposio com
perda na juno (lossy-join decomposition). Quando a decomposio no implica perda de informao, ela
chamada decomposio sem perda na juno (lossless-join decomposition). Deve estar claro diante de nosso
exemplo que uma decomposio com perda na juno , em geral, uma m opo de projeto de banco de dados.
Examinaremos essa decomposio mais atentamente para descobrir por que ela representa perda. H um
atributo comum entre esquema_agncia_cliente e esquema_cliente_emprstimo:
O nico modo de representarmos um relacionamento entre, por exemplo, nmero_emprstimo e
nome_agncia por meio de nome_cliente. Essa representao no adequada, porque um cliente pode
contrair diversos emprstimos e, ainda, esses emprstimos no so necessariamente obtidos na mesma agncia.
Consideremos outra alternativa de projeto, na qual esquema_linha_de_crdito decomposta nos dois
esquemas seguintes:

H um atributo em comum entre os dois esquemas:

178

Assim, o nico modo de representar um relacionamento entre, por exemplo, nome_cliente e fundos por
meio de nome_agncia. A diferena entre esse exemplo e o precedente que o valor dos fundos de uma agncia
o mesmo, qualquer que seja o cliente em questo, enquanto a linha de crdito oferecida pela agncia,
especialmente no montante envolvido, depende do cliente em questo. Para um dado nome_agncia, h
exatamente um valor de fundos e exatamente uma cidade_agncia; j um tratamento similar no pode ser
oferecido para nome_cliente. Isto , a dependncia funcional:
nome_agncia  fundos cidade_agncia
realiza-se, mas nome_cliente no determina funcionalmente nmero_emprstimo.
A noo de juno sem perda fundamental para a maioria dos projetos de banco de dados. Portanto,
refaremos o exemplo anterior de modo mais precisa e mais formal. Seja R um esquema de relao. Um conjunto
de esquemas de relaes {R1, R2, ..., Rn} uma decomposio de R se:
Isto , {R1, R2, ..., Rn} uma decomposio de R se, para i = 1, 2, ..., n, cada Ri um subconjunto de R e
todo atributo de R aparece ao menos uma vez em Ri.
Seja r uma relao do esquema R, e seja ri =
para i=1,2,..., n. Isto , {r1, r2, ..., rn} o banco de dados
que resulta da decomposio de R em {R1, R2, ..., Rn}. Neste caso, sempre vlido:
Para verificar se essa declarao verdadeira, considere uma tupla t da relao r. quando computamos as
relaes r1, r2, ..., rn, a tupla t origina uma tupla ti em cada ri, i=1, 2, ..., n. Essas n tuplas podem ser combinadas
.
para reconstruir t quando computamos r1 r2 ... rn. Portanto, toda tupla em r aparece em

De modo geral, r
. Como ilustrao, considere nosso exemplo anterior, no qual:
n=2
R = esquema_linha_de_crdito
R1 = esquema_agncia_cliente
R2 = esquema_cliente_emprstimo
r = a relao mostrada na fig. 7.1.
r1 = a relao mostrada na fig. 7.2.
r2 = a relao mostrada na fig. 7.3.
r1
r2 = a relao mostrada na fig. 7.4.

Note que as relaes das fig. 7.1 a 7.4 no so as mesmas.


Para decomposies sem perda, precisamos impor restries ao conjunto das relaes possveis.
Conclumos
que
a
decomposio
do
esquema_linha_de_crdito
em
esquema_agncia
e
esquema_info_emprstimos ocorre sem perdas porque a dependncia funcional
nome_agncia  cidade_agncia fundos
realiza-se em esquema_agncia.
Seja C a representao de um conjunto de restries do banco de dados. Uma decomposio {R1, R2, ...,
Rn} do esquema de relao R uma decomposio sem perda na juno de R se para todas as relaes r no
esquema R vlido sob C:

Normalizao usando dependncias funcionais


Podemos usar um dado conjunto de dependncias funcionais para projetar um banco de dados relacional,
evitando a maior das propriedades no desejadas, j discutidas. Quando projetamos tais sistemas, pode tornar-se
desnecessrio decompor uma relao em diversas relaes menores. Usando a dependncia funcional, podemos
definir algumas formas normais que representam bons projetos de banco de dados.
179

Propriedades Desejveis da Decomposio


Podemos ilustrar nossos conceitos por meio do esquema_linha_de_crdito:

O conjunto de dependncias funcionais F que desejamos que se realizem para o


esquema_linha_de_crdito so:
nome_agncia  fundos cidade_agncia
nmero_emprstimo  total nome_agncia
O esquema_linha_de_crdito um exemplo de projeto ruim de banco de dados. Suponha que tenhamos
decomposto esse esquema nas trs relaes a seguir:
esquema_agncia= (nome_agncia, fundos, cidade_agncia)
esquema_emprstimo= (nome_agncia, nmero_emprstimo, total)
esquema_devedor= (nome_cliente, nmero_emprstimo)
Afirmamos que essa decomposio apresenta diversas propriedades desejveis.
Decomposio sem Perda na Juno
J sustentamos que, quando decompomos uma relao em outras relaes menores, crucial que a
decomposio no resulte em perda de informao. Afirmamos que a decomposio crucial que a
decomposio no resulte em perda de informao.
Seja R um esquema de relao e F um conjunto de dependncias funcionais sobre R. Sejam R1 e R2 formas
de decomposio de R. Essa decomposio uma decomposio sem perda na juno de R se ao menos uma das
seguintes dependncias funcionais est em F+:

Mostraremos agora que nossa decomposio para o esquema_linha_de_crdito uma decomposio


sem perda na juno mostrando uma sequncia de passos que geraram essa decomposio. Comecemos pela
decomposio do esquema_linha_de_crdito em dois esquemas:
esquema_agncia = (nome_agncia, cidade_agncia, fundos)
esquema_info_emprstimo = (nome_agncia, nome_cliente, nmero_emprstimo, total)
Uma vez que nome_agnciacidade_agncia fundos, a regra incremental (augmentation) para a
dependncia funcional implica:
nome_agncia  nome_agncia cidade_agncia fundos
J que esquema_agncia
esquema_info_emprstimo = {nome_agncia}, ento nossa decomposio
inicial uma decomposio sem perda na juno.
A seguir, decomporemos esquema_info_emprstimo em:

Esse passo resulta em uma decomposio sem perda na juno, desde que nmero_emprstimo seja um
atributo comum e nmero_emprstimototal nome_agncia.
Preservao da dependncia
Outra meta do projeto de um banco de dados relacional a preservao da dependncia. Quando ocorre
uma atualizao no banco de dados, o sistema deve checar se ele criar uma relao ilegal isto , uma relao
que no que no satisfaa todas as dependncias funcionais. Se checarmos de modo eficiente essas atualizaes,
180

poderemos projetar esquemas de banco de dados relacionais capazes de validar atualizaes sem necessidade de
junes.
Para decidir se uma juno ou no necessria, precisamos determinar quais dependncias funcionais
devem ser testadas, verificando cada uma das relaes individualmente. Seja F um conjunto de dependncias
funcionais de um esquema R e seja R1, R2, ..., Rn uma decomposio de R. A restrio de F para Ri o conjunto Fi
de todas as dependncias funcionais em F+ que contenha somente os atributos de Ri. J que todas as
dependncias funcionais em uma restrio contm atributos de apenas um esquema de relao, possvel testar
se tais dependncias so satisfeitas checando somente uma relao.
O conjunto de restries F1, F2, ..., Fn o conjunto das dependncias que podem ser checadas
eficientemente. Agora precisamos nos certificar de que suficiente testar somente as restries. Seja F =
. F um conjunto de dependncias funcionais do esquema R, mas, em geral, FF. Entretanto,
mesmo que FF, pode ser que F+=F+. Se o ltimo verdadeiro, ento toda a dependncia de F est
compreendida logicamente em F, e, se verificarmos que F satisfeita, podemos verificar que F tambm o .
Dizemos que uma decomposio decomposio com preservao da dependncia se possui a propriedade
F+=F+. A fig. 7.5 mostra um algoritmo para o teste da preservao da dependncia. A entrada o conjunto dos
esquemas das relaes decompostas D = {R1, R2, ..., Rn} e um conjunto de dependncias funcionais F.
Podemos agora mostrar que nossa decomposio do esquema_linha_de_crdito uma decomposio
com preservao de dependncia. Consideramos cada membro do conjunto F das dependncias funcionais que
desejamos impostas sobre esquema_linha_de_crdito e mostraremos que cada uma pode ser testada em ao
menos uma relao da decomposio.
Podemos testar a dependncia funcional: nome_agnciacidade_agncia fundos usando
esquema_agncia= (nome_agncia, cidade_agncia, fundos).
Podemos testar a dependncia funcional: nmero_emprstimototal nome_agncia usando
esquema_emprstimo= (nome_agncia, nmero_emprstimo, total).
Como no exemplo mostrado anteriormente, frequentemente mais fcil no aplicar o algoritmo da fig.
7.5 para o teste da preservao da dependncia, j que o primeiro passo, o processamento de F+, toma tempo
exponencial.

Redundncia de Informaes
A decomposio do esquema_linha_de_crdito no sofre o problema da repetio da informao que foi
discutido anteriormente. No esquema_linha_de_crdito necessrio repetir, em cada emprstimo, a cidade e os
fundos relativos agncia.

181

A decomposio separa os dados a respeito da agncia e do emprstimo em relaes distintas


eliminando, desse modo, a redundncia. Similarmente, observe que, se um nico emprstimo feito para
diversos clientes, repetiremos o total do emprstimo para cada um dos clientes (assim como a cidade e os fundos
da agncia). Na decomposio, a relao do esquema esquema_devedor contm o relacionamento
nmero_do_emprstimo e nome_do_cliente que nenhum outro esquema contm.
Temos, portanto, somente na relao do esquema esquema_devedor contm o relacionamento
nmero_do_emprstimo e nome_do_cliente que nenhum outro esquema contm.
Temos, portanto, somente na relao do esquema esquema_devedor, uma tupla para cada cliente com
um emprstimo. Nas outras relaes que contm o atributo nmero_emprstimo (as dos esquemas
esquema_emprstimo, e esquema_devedor) aparece somente uma tupla por emprstimo.
Evidentemente, desejvel a ausncia de redundncia mostrada nessa decomposio. O grau alcanado
por essa ausncia de redundncia representado pelas diversas formas normais.
Forma Normal de Boyce-Codd
Uma das mais procuradas formas normais a forma normal de Boyce-Codd (FNBC). Uma relao do
esquema R est na FNBC com respeito a um conjunto F de dependncias funcionais se para todas as
dependncias funcionais em F+ da forma , em que R e R, ao menos uma das seguintes realiza-se:
 uma dependncia funcional trivial (isto , ).
uma superchave para o esquema R.
Um projeto de banco de dados est na FNBC se cada membro do conjunto de relaes dos esquemas que
constituem o projeto est na FNBC.
Como exemplo, consideremos os seguintes esquemas de relaes e suas respectivas dependncias
funcionais:

Afirmamos que o esquema_cliente est na FNBC. Notamos que uma chave candidata para o esquema
nome_cliente. A nica dependncia funcional no trivial no que se realiza no esquema_cliente tem nome_cliente
chave candidata, dependncias funcionais com nome_cliente do lado esquerdo da seta no violam a definio
da FNBC. Analogamente, pode-se mostrar facilmente que a relao do esquema esquema_agncia est na FNBC.
O esquema esquema_info_emprstimo, entretanto, no est na FNBC. Primeiro, note que
nmero_emprstimo no superchave do esquema_info_emprstimo, j que poderia haver um par de tuplas
representando um nico emprstimo adquirido por duas pessoas por exemplo:

Como no fizemos a lista das dependncias funcionais que no so admitidas no caso precedente,
nmero_emprstimo no uma chave candidata. Entretanto, a dependncia funcional
nmero_emprstimototal no trivial. Portanto, esquema_info_esquema no satisfaz a definio FNBC.
Afirmamos que o esquema_info_emprstimo no conveniente, uma vez que est sujeito ao problema
de informaes redundantes j descrito. Observemos que, se existir diversos nomes de clientes associados a um
emprstimo, em uma relao do esquema_info_emprstimo, ento somos foradas a repetir o nome da agncia
e o total do emprstimo a cada cliente.
182

Podemos eliminar essa redundncia redesenhando nosso banco de dados de modo que todos os
esquemas estejam em FNBC. Uma abordagem para esse problema tomar um projeto que no est na FNBC
como ponto de partida e decompor os esquemas necessrios. Considere a decomposio do
esquema_info_emprstimo em dois outros esquemas:

Essa decomposio uma decomposio sem perda na juno.


Para determinar se esses esquemas esto na FNBC, precisamos determinar quais dependncias funcionais
se aplicam a elas. Nesse exemplo, fcil perceber que:
nmero_emprstimo total nome_agncia
aplica-se a esquema_emprstimo e que somente dependncias funcionais aplicam-se a esquema_devedor.
Embora nmero_emprstimo no seja uma superchave para esquema_info_emprstimo, ele chave candidata
para esquema_emprstimo. Assim, ambos os esquemas de nossa decomposio esto em FNBC.
Assim, possvel evitar redundncia quando h diversos clientes associados a um nico emprstimo. H
exatamente uma tupla para cada emprstimo na relao do esquema_emprstimo e uma tupla para cada
emprstimo de cada cliente na relao do esquema_devedor. Logo, no precisamos repetir o nome da agncia e
o total para cada cliente associado a um emprstimo.
Podemos agora determinar um mtodo geral para criar uma coleo de esquemas na FNBC. Se R no est
na FNBC, podemos decompor R em um grupo de esquemas R1, R2, ..., Rn na FNBC usando o algoritmo da fig. 7.6,
que no s gera decomposies na FNBC, como todas as decomposies sem perda na juno. Para perceber por
que nosso algoritmo gera somente decomposies sem perda na juno, note que, quando substitumos um
esquema Ri por (Ri ) e (,), a dependncia  realiza-se e

Vejamos a aplicao do algoritmo de decomposio FNBC no esquema_linha_de_crdito que usamos


anteriormente como exemplo de um projeto deficiente de banco de dados:
esquema_linha_de_crdito = (nome_agncia, cidade_agncia, fundos, nome_cliente, nmero_emprstimo, total)
O conjunto de dependncias funcionais que exigimos que se realizem so:

Uma chave candidata para esse esquema {nmero_emprstimo, nome_cliente}.


Aplicamos o algoritmo da fig. 7.6 para o exemplo com esquema_linha_de_crdito, conforme segue:
A dependncia funcional nome_agncia  fundos cidade_agncia
realiza-se no esquema_linha_de_crdito, mas nome_agncia no uma superchave.
Assim, esquema_linha_de_crdito no est na FNBC. Substitumos o esquema_linha_de_crdito por:

183

A nica dependncia funcional no trivial que se realiza no esquema_agncia contm nome_agncia no


lado esquerdo da seta. Uma vez que nome_agncia uma chave para o esquema_agncia, a relao
esquema_agncia est na FNBC.
A dependncia funcional
nmero_emprstimo  total nome_agncia
realiza-se no esquema_info_emprstimo, mas nmero_emprstimo no chave para o
esquema_info_emprstimo. Substitumos esquema_info_emprstimo por:

esquema_emprstimo e esquema_devedor esto na FNBC.

Assim, a decomposio do esquema_linha_de_crdito resulta nos trs esquemas de relaes


esquema_agncia, esquema_emprstimo, e esquema_devedor, cada um dos quais na FNBC. Esses esquemas de
relao so os mesmos j usados anteriormente.
Nem toda decomposio na forma FNBC tem dependncia preservada. Considere a seguinte relao:
esquema_bancrio= (agncia_nome, nome_cliente, nome_bancrio)
que informa que um cliente possui atendimento personalizado, de responsabilidade de um bancrio
determinado, em uma dada agncia. O conjunto F de dependncias funcionais necessrias ao esquema_bancrio
so:

Naturalmente, esquema_bancrio no est na FNBC, uma vez que nome_bancrio no uma superchave.
Se aplicarmos o algoritmo da fig. 7.6, obtemos a seguinte decomposio em FNBC:

A decomposio dos esquemas preserva somente nome_bancrionome_agncia (e as dependncias


triviais), mas a clausura {nome_bancrionome_agncia} no engloba nome_cliente nome_agncia 
nome_bancrio. Uma violao dessa dependncia pode ser detectada somente por meio de uma juno.
Para verificar se a decomposio de esquema_bancrio nos esquemas esquema_bancrio_agncia e
esquema_cliente_bancrio no acontece com preservao da dependncia, aplicamos o algoritmo da fig. 7.5.
Consideremos que as restries F1 e F2 de F para cada um dos esquemas so:

Assim, uma cobertura cannica para o conjunto F F1.


fcil perceber que a dependncia funcional nome_cliente nome_agncia  nome_bancrio no est
+
em F mesmo que esteja em F+. Portanto, F+F+ e a decomposio no preserva a dependncia.
O exemplo precedente demostra que nem toda decomposio FNBC preserva a dependncia. Alm disso,
ela demonstra que nem sempre as trs metas de projeto podem ser satisfeitas:
1. FNBC
2. Sem perda na juno
3. Preservao da dependncia
No podemos realiza-las neste exemplo porque toda decomposio FNBC do esquema_bancrio falha na
preservao de nome_cliente nome_agncia  nome_bancrio.
184

Terceira Forma Normal


Nos caos em que no conseguimos alcanar todos os trs critrios de projeto, abandonamos FNBC e
aceitamos uma forma normal mais fraca chamada terceira forma normal (3FN). Vemos que sempre possvel
alcanar decomposio sem perda na juno, decomposio com preservao da dependncia que est na 3FN.
A FNBC exige que todas as dependncias no triviais sejam da forma , em que uma superchave. A
3FN suaviza essa restrio permitindo dependncias funcionais no-triviais cujo lado esquerdo da seta no seja
superchave.
Um esquema de relao R est na 3FN com respeito a um conjunto de dependncias funcionais F se, para
todas as dependncias funcionais F+ da forma , em que R e R, ao menos uma das seguintes
condies for realizada:
 uma dependncia funcional trivial.
uma superchave de R.
Cada atributo de A em est contido em uma chave candidata de R.
A definio da 3FN permite algumas dependncias funcionais que no so permitidas na FNBC. A
dependncia , que satisfaz apenas a terceira condio da definio da 3FN, no permitida na FNBC, mas
permitida na 3FN. Essas dependncias so um exemplo de dependncias transitivas.
Observe que, se um esquema de relao est na FNBC, ento todas as dependncias funcionais so da
forma superchave determina um conjunto de atributos, ou a dependncia trivial. Assim, um esquema FNBC
no pode conter nenhuma dependncia transitiva. Como resultado, todo esquema FNBC tambm da 3FN, e a
FNBC, portanto, mantm regras mais restritivas que a 3FN.
Retornemos ao nosso exemplo do esquema_bancrio. Mostramos que esse esquema de relao no tem
a dependncia preservada, com decomposio sem perda da juno em FNBC. Esse esquema, entretanto, sai da
3FN. Para essa verificao, notamos que {nome_cliente, nome_agncia} uma chave candidata para
esquema_bancrio, assim o nico atributo no contido em chave candidata de esquema_bancrio
nome_bancrio. As nicas dependncias funcionais no-triviais da forma nome_bancrio incluem
{nome_cliente, nome_agncia} como parte de . J que {nome_cliente, nome_agncia} chave candidata, essas
dependncias no violam a definio da 3FN.
A fig. 7.7 mostra um algoritmo para chegar preservao de dependncia, com decomposio sem perda
na juno em 3FN. O fato de cada esquema de relao Ri estar na 3FN decorre diretamente de nossa exigncia de
que o conjunto de dependncias funcionais F seja da forma cannica. O algoritmo assegura a preservao das
dependncias explicitando um esquema para cada dependncia. Ele assegura que a decomposio sem perda
na juno por meio da garantia de que ao menos um esquema contm uma chave candidata para o esquema que
est sendo decomposto.
Para ilustrar o algoritmo da fig. 7.7 consideramos a seguinte extenso do esquema_bancrio:
esquema_info_bancrio= (nome_agncia, nome_cliente, nome_bancrio, nmero_seo)
A principal diferena aqui que inclumos o nmero da seo do bancrio como parte da informao. As
dependncias funcionais para esse esquema de relao so:

Uma vez que esquema_bancrio contm uma chave candidata para o esquema_info_bancrio,
terminamos o processo de decomposio.

185

Comparao entre FNBC e 3FN


Vimos duas formas normais de esquemas de banco de dados relacionais: 3FN e FNBC. Uma vantagem de
um projeto na 3FN saber que sempre possvel obt-la sem sacrificar uma decomposio sem perda na juno
ou preservao da dependncia. Apesar disso, h uma desvantagem na 3FN. Se no a eliminarmos todas as
dependncias transitivas, teremos de usar valores nulos para representao de alguns dos possveis
relacionamentos significativos entre itens de dados, e h ainda o problema da repetio da informao.
Como ilustrao, considere novamente o esquema_bancrio e suas dependncias funcionais associadas.
Dado nome_bancrionome_agncia, podemos desejar representar em nosso banco de dados relacionamentos
entre valores de nome_bancrio e valores de nome_agncia. No entanto, se fizermos isso, ser preciso ter um
valor correspondente para nome_cliente ou usar valores nulos para o atributo nome_cliente.
Outra dificuldade com esquema_bancrio a repetio da informao. Como ilustrao, considere uma
instncia de esquema_bancrio mostrada na fig. 7.8. Note que a informao de que Johnson est trabalhando na
agncia Perryridge repetida.

Se formos forados a escolher entre FNBC e preservao da dependncia com 3FN, geralmente
prefervel optar pela 3FN. Se no pudermos verificar eficientemente a preservao da dependncia, termos de
pagar alto custo em desempenho do sistema ou corremos riscos em relao integridade de dados de nosso
banco de dados. Nenhuma dessas opes atraente. Com tais alternativas, o limite redundncia imposto pelas
dependncias transitivas sob a 3FN o menos pior. Assim, normalmente optamos por manter a preservao da
dependncia e sacrificar a FNBC.
Em resumo, repetimos que as trs metas de projeto para um banco de dados relacional so:
1. FNBC
186

2. Juno sem perda


3. Preservao da dependncia
Se no pudermos alcanar as trs, aceitamos:
1. 3FN
2. Juno sem perda
3. Preservao da dependncia
Normalizao usando Dependncias Multivaloradas
H esquemas de relao na FNBC que no esto normalizados o bastante, no sentido de que eles ainda
sofrem de problemas de repetio de informao. Considere novamente nosso exemplo relativo ao banco.
Assuma que, como alternativa de projeto para o esquema de um banco de dados de uma empresa na rea
bancria, tenhamos o esquema:
esquema_BC = (nmero_emprstimo, nome_cliente, rua_cliente, cidade_cliente)
Podemos perceber que esse esquema no est na FNBC por causa da dependncia funcional
nome_cliente  rua_cliente cidade_cliente
que afirmamos anteriormente, e porque nome_cliente no uma chave do esquema_BC. Entretanto,
consideremos que nosso banco est atraindo clientes ricos que possuem diversos endereos (digamos, casa de
inverno e casa de vero). Ento, no desejaremos mais a dependncia funcional nome_clienterua_cliente
cidade_cliente. Se retirarmos essa dependncia funcional, concluiremos que o esquema_BC est na FNBC com
respeito ao nosso conjunto de dependncias funcionais modificadas. Ainda, mesmo que o esquema_BC esteja na
FNBC com respeito ao nosso conjunto de dependncias funcionais modificadas. Ainda, mesmo que o
esquema_BC esteja na FNBC, ns teremos o problema da repetio de informaes que tnhamos anteriormente.
Para tratar esse problema, precisamos definir uma nova forma de restrio, chamada dependncia
multivalorada. Como fizemos com as dependncias funcionais, usaremos as dependncias funcionais
multivaloradas para definir uma forma normal para os esquemas das relaes. Essa forma normal, chamada
quarta forma normal (4FN), mais restritiva que a FNBC. Podemos ver que todo esquema na 4FN est tambm na
FNBC, mas h esquemas na FNBC que no esto na 4FN.
Dependncias Multivaloradas
As dependncias funcionais rejeitam certas tuplas como participantes de uma relao. Se AB, ento
no podemos ter duas tuplas com os mesmos valores de A, mas diferentes valores de B. Dependncias
multivaloradas no rejeitam a existncia de certas tuplas. Pelo contrrio, elas exigem que outras tuplas, de uma
certa forma, estejam presentes na relao. Por essa razo, por vezes, as dependncias funcionais so chamadas
dependncias geradas por igualdade (equality-generating dependencies) e dependncias multivaloradas so
referidas como dependncias geradas por tuplas (tuple-generating dependencies).
Seja R um esquema de relao e seja R e R. A dependncia multivalorada  realiza-se em R
se, para qualquer relao r(R), para todos os pares de tuplas t1 e t2 de r, tal que t1[] =t2 [], existem tuplas t3 e t4
em r tal que

Essa definio menos complexa do que parece. Na fig. 7.9, damos uma apresentao tabular para t1, t2,
t3 e t4. Intuitivamente, a dependncia multivalorada  diz que um relacionamento entre e
independente do relacionamento entre e R . Se uma dependncia multivalorada  satisfeita para
todas as relaes do esquema R, ento  uma dependncia multivalorada trivial do esquema R. Assim,
 trivial se =R.
187

Para ilustrar as diferenas entre dependncia funcional e multivalorada, consideremos novamente o


esquema_BC e a relao bc (esquema_BC) da fig. 7.10. Precisamos repetir o nmero do emprstimo de um
mesmo cliente. Essa repetio desnecessria, j que o relacionamento entre o cliente e seu endereo
independente do relacionamento entre o cliente e um emprstimo. Se um cliente (digamos, Smith) tem um
emprstimo (digamos, o de nmero L-23), queremos que o emprstimo seja associado a todos os endereos de
Smith. Assim, a relao da fig. 7.11 no validade. Para tornar essa relao vlida, precisamos adicionar as tuplas
(L-23, Smith, Main, Manchester) e (L-27, Smith, North, Rye) relao bc da fig. 7.11.

Comparando o exemplo anterior com nossa definio de dependncia multivalorada, percebemos que
desejamos que a dependncia multivalorada nome_cliente  rua_cliente cidade_cliente se realize (a
dependncia multivalorada nome_cliente nmero_emprstimo faz a mesma coisa. Assim, verificamos que
so equivalentes).
Como fizemos para as dependncias funcionais, podemos usar a dependncia multivalorada de dois
modos:
1. Para testar relaes para determinar se elas so validades sob um dado conjunto de dependncias
funcionais e multivaloradas.
2. Para especificar restries sobre um conjunto de relaes vlidas; devemos, assim, nos restringir somente
quelas relaes que satisfazem um dado conjunto de dependncias funcionais e multivaloradas.
Note que, se uma relao r no satisfaz uma dada dependncia multivalorada, podemos criar uma relao r que
satisfaa a dependncia multivalorada adicionando tuplas a r.
Teoria das Dependncias Multivaloradas
Como foi feito para a dependncia funcional, para 3FN e para FNBC, precisamos determinar todas as
dependncias multivaloradas que esto logicamente implcitas em um dado conjunto de dependncias
multivaloradas.
Adotamos o mesmo enfoque tomado anteriormente para as dependncias funcionais. Seja D um
conjunto de dependncias funcionais e multivaloradas. A clausura D+ de D o conjunto de todas as dependncias
188

funcionais e multivaloradas logicamente implcitas em D. Como fizemos para as dependncias funcionais,


podemos computar D+ por meio de D, usando a definio formal de dependncias funcionais e dependncias
multivaloradas. Entretanto, normalmente mais fcil ponderar acerca de conjuntos de dependncias
multivaloradas. Entretanto, normalmente mais fcil ponderar acerca de conjuntos de dependncias usando um
sistema de regras de inferncias.
A seguinte lista de regras de inferncias para dependncias funcionais e dependncias multivaloradas
slida e completa. Recorde que as regras para solidez no criam qualquer dependncia que no esteja
logicamente implcita em D e regras completas permite-nos criar todas as dependncias em D+.

Seja R= (A, B, C, G, H, I) um esquema de relao. Suponha que ABC realiza-se. A definio de


dependncia multivalorada implica que, se t1[A] = t2[A], ento existem as tuplas t3 e t4 tal que:

A regra de complementao coloca que, se ABC, ento AGHI. Observe que t3 e t4 satisfazem a
definio de que AGHI simplesmente mudando os subescritos.
Podemos proporcionar uma justificativa similar para as regras 5 e 6 usando a definio de dependncia
multivalorada.
Regra 7, a regra da replicao, envolve dependncias funcionais e multivaloradas. Suponha que ABC
realiza-se em R. Se t1[A] =t2[A] e t1[BC] =t2[BC], ento as prprias t1 e t2 podem ser as tuplas t3 e t4 exigidas na
definio da dependncia multivalorada ABC.
Regra 8, a regra da coalescncia, a mais difcil de se verificar entre as oito regras.
Podemos simplificar a computao da clausura de D usando as seguintes regras, as quais podemos provar
usando as regras 1 a 8.
Regra da unio multivalorada. Se  e  realizam-se, ento  tambm realiza-se.
Regra da interseo. Se  e  realizam-se, ento  realiza-se.
Regra da diferena. Se  e  realizam-se, ento  realiza-se e  realiza-se.
Apliquemos nossas regras no seguinte exemplo. Seja R = (A, B, C, G, H, I) com o seguinte conjunto de
dependncias D dado:

Relacionamos alguns membros de D+ aqui:


189

ACGHI: desde que AB, a regra da complementao (regra 4) implica que AR B A, R B
A = CGHI, assim ACGHI.
AHI: desde que AB e BHI, a regra da transitividade multivalorada (regra 6) implica que
AHI B. Desde que HI B = HI, AHI.
BH: para mostrar isso, precisamos aplicar a regra da transitividade multivalorada (regra 6) implica que
AHI B. Desde que HI B = HI, AHI.
BH: para mostrar isso, precisamos aplicar a regra da coalescncia (regra 8). BHI realiza-se. Desde que
H HI e CGH e CG HI = , satisfazemos a regra da coalescncia, com estando em B, estando em
HI, estando em CG e estando em H. Conclumos que BH.
ACG: tambm sabemos que ACGHI e AHI. Pela regra da diferena, ACGHI. Desde que
CGHI HI = CG. ACG.

Quarta Forma Normal


Retornemos a nosso exemplo esquema_BC no qual a dependncia multivalorada nome_cliente 
rua_cliente cidade_cliente realiza-se, mas nenhuma dependncia funcional no-trivial realiza-se. Vimos
anteriormente que, embora esquema_BC esteja na FNBC, o projeto no adequado, uma vez que precisamos
repetir as informaes acerca do endereo do cliente a cada emprstimo. Podemos ver que possvel usar a
dependncia multivalorada dada para melhorar o projeto do banco de dados, por meio da decomposio
esquema_BC em uma decomposio na quarta forma normal (4FN).
Um esquema de relao R est na 4FN com respeito a um conjunto D de dependncias funcionais e
multivaloradas se, para todas as dependncias multivaloradas em D+ da forma , em que R e R, ao
menos uma das seguintes condies se realize:
 uma dependncia multivalorada trivial.
uma superchave para o esquema R.
Um projeto de banco de dados est na 4FN se cada membro do conjunto dos esquemas de relaes que
constituem o projeto estiver na 4FN.
Note que a definio da 4FN difere da definio da FNBC somente no uso de dependncias multivaloradas
em vez de dependncias funcionais. Todo esquema na 4FN est na FNBC.
Para constatar esse fato, notamos que, se um esquema R no est na FNBC, ento h uma dependncia
funcional no-trivial  realizando-se em R, na qual no superchave. Desde que  implica que 
(pela regra da replicao), R no poder estar na 4FN.
A analogia entre 4FN e FNBC aplica-se ao algoritmo para a decomposio de um esquema para a 4FN. A
fig. 7.12 mostra o algoritmo para a decomposio na 4FN. Ele idntico ao algoritmo de decomposio para FNBC
mostrado na fig. 7.6, exceto pelo fato de usar dependncia multivalorada em vez da dependncia funcional.
Se aplicarmos o algoritmo da fig. 7.12 para o esquema_BC, conclumos que nome_cliente  
nmero_emprstimo uma dependncia multivalorada no-trivial e nome_cliente no uma superchave para o
esquema_BC pelos dois esquemas:
esquema_devedor = (nome_cliente, nmero_emprstimo)
esquema_cliente = (nome_cliente, rua_cliente, cidade_cliente)
Esse par de esquemas, que esto na 4FN, eliminam o problema encontrado anteriormente em relao
redundncia do esquema_BC.
Como no caso em que tratamos somente das dependncias funcionais, estamos interessados em
decomposies sem perda na juno e com preservao das dependncias. Os fatos seguintes sobre
dependncias multivaloradas e sem perda na juno mostram que o algoritmo da fig. 7.12 cria somente
decomposies sem perda na juno:

190

Seja o esquema de relao R e seja D um conjunto de dependncias funcionais e multivaloradas de R. Seja


R1 e R2 decomposies de R. Esta decomposio sem perda na juno de R se e somente se ao menos
uma das seguintes dependncias multivaloradas estiver em D+:

Lembre-se de que estabelecemos anteriormente que, se R1 R2R1 ou R1 R2R2, ento R1 e R2 so


decomposies sem perda na juno de R. O fato precedente ressalta que as dependncias multivaloradas
constituem uma forma mais genrica de juno sem perda. Ele indica que, para toda decomposio sem perda na
juno de R em dois esquemas R1 e R2, uma das duas dependncia R1 R2 R1 ou R1 R2R2 deve se realizar.
A questo da preservao da dependncia quando temos dependncia multivalorada no to simples
quanto quando temos somente dependncias funcionais. Seja R um esquema de relao e sejam R1, R2, ..., Rn
decomposies de R. Lembre-se de que, para um conjunto de dependncias funcionais F, a restrio F1 de F para
Ri so todas as dependncias funcionais em F+ que incluem somente atributos de Ri. Agora, consideremos um
conjunto D, tanto de dependncias funcionais quanto de dependncias multivalorados. A restrio de D para R1
o conjunto Di, consistindo:
Todas as dependncias funcionais em D+ que incluem somente atributos de Ri.
Todas as dependncias multivaloradas da forma.


Ri em que

Ri e  est em D+.

Uma decomposio do esquema R nos esquemas R1, R2, ..., Rn uma decomposio com preservao da
dependncia com respeito ao conjunto D de dependncias funcionais e multivaloradas se, para todo conjunto de
relaes r1(R1), r2(R2), ..., rn (Rn), tal que, para todo i, ri satisfaa Di, l houver uma relao r(R) que satisfaa D e
para qual ri= Ri(r) para todo i.
Apliquemos o algoritmo para decomposio na 4FN da fig. 7.12 em nosso exemplo de R = (A, B, C, G, H, I)
com D = {AB, BHI, CG H}. Podemos, ento, testar a decomposio resultante em relao preservao
da dependncia.
R no est na 4FN. Observe que AB no trivial, ainda A no uma superchave. Usando AB na
primeira iterao do while, substitumos R por dois esquemas, (A, B) e (A, C, G, H, I). fcil perceber que (A,B)
est na 4FN desde que todas as dependncias multivaloradas que valem em (A, B) sejam triviais. Entretanto, o
esquema (A, C, G, H, I) no est na 4FN. Aplicando a dependncia multivalorada CGH (que decorre na
dependncia funcional dada CGH pela regra da replicao), substitumos (A, C, G, H, I) pelos dois esquemas,
(C, G, H) e (A, C, G, I). O esquema (C, G, H) est na 4FN, mas o esquema (A, C, G, I) no est. Para perceber que (A,
C, G, I) no est na 4FN, lembremos que foi mostrado anteriormente que AHI est em D+. Portanto, AI
est na restrio de D para (A, C, G, I). Assim, na terceira iterao do lao while, substitumos (A, C, G, I) pelos dois
esquemas (A, I) e (A, C, G). O algoritmo ento termina e a decomposio 4FN {(A, B), (C, G, H), (A, I), (A, C, G)}.
191

Essa decomposio para a 4FN no preserva a dependncia, uma vez que ela falha na preservao da
dependncia multivalorada BHI. Considere a fig. 7.13m que mostra as quatro relaes que poderiam resultar
da projeo de uma relao em (A, B, C, G, H, I) nos quatro esquemas de nossa decomposio. A restrio de D
para (A, B) AB e algumas dependncias triviais. fcil perceber que r1 satisfaz AB porque no h
nenhum par de tuplas com o mesmo valor de A. Observe que r2 tenha os mesmos valores em qualquer atributo.
Um comando similar pode ser feito para r3 e r4. Portanto, a verso decomposta de nosso banco de dados satisfaz
a todas as dependncias da restrio de D. Entretanto, no h nenhuma relao r em (A, B, C, G, H, I) que
. A relao
satisfaa D e possa ser decomposta em r1, r2, r3 e r4. A fig. 7.14 mostra a relao r =
r no satisfaz BHI. Qualquer relao s contendo r e satisfazendo BHI deve incluir a tupla (a2, b1, c2, g2, h1,
i1). Entretanto, CGH(s) inclui uma tupla (c2, g2, h1) que no est em r2. Assim, nossa decomposio falha da
deteco da violao de BHI.

Vimos que, se estamos definindo um conjunto de dependncias funcionais e multivaloradas, vantajoso


chegar a um projeto de banco de dados que tenha como critrios:
1. 4FN
2. Preservao de dependncia
3. Juno sem perda
Se tudo o que tivermos forem dependncias funcionais, ento o primeiro critrios ser apenas a FNBC.
Vimos tambm que nem sempre possvel alcanar todas as trs condies. Obtivemos sucesso na
decomposio do exemplo do banco, mas falhamos no exemplo do esquema R= (A, B, C, G, H, I).
Quando no conseguimos alcanar as trs metas, abrimos mo da 4FN aceitando FNBC ou mesmo 3FN, se
necessrio, assegurando a preservao da dependncia.
Normalizao usando dependncias na Juno

192

Vimos que a propriedade sem perda na juno uma das diversas propriedades para o projeto de um
banco de dados. De fato, essa propriedade essencial: sem ela, h perda de informao. Quando restringimos o
conjunto das relaes vlidas entre as que satisfazem um conjunto de dependncias funcionais e multivaloradas,
podemos usar essas dependncias para mostrar que certas decomposies so decomposies sem perda na
juno.
Por causa da importncia desse conceito de sem perda na juno, til conseguir restringir um
conjunto de relaes vlidas sobre uma esquema R para aquelas relaes para as quais uma dada decomposio
uma decomposio sem perda na juno. Vamos agora definir o que dependncia de juno. Apenas como
tipos de dependncias conduzidas por outras formas normais, dependncias de juno sero direcionadas a uma
forma normal chamada forma normal de projeo de juno Project-join normal form (FNPJ).
Dependncias de juno (Join Dependencies)
Seja R um esquema de relao e R1, R2, ..., Rn seja uma decomposio de R. A dependncia de juno *
(R1, R2, ..., Rn) usada para restringir o conjunto de relaes legais para aquelas para as quais R1, R2, ..., Rn uma
decomposio sem perda na juno de R. Formalmente, se R=
, dizemos que uma relao r(R)
satisfaz a dependncia de juno * (R1, R2,..., Rn) se:
Uma dependncia de juno trivial se um dos Ri for o prprio R.
Considere a dependncia de juno *(R1, R2) do esquema R. Essa dependncia exige que, para toda
r(R)vlida:
Seja r contendo duas tuplas t1 e t2, conforme segue:

Assim, t1[R1

R2]=t2[R1

R2], mas t1 e t2 tm diferentes valores em todos os outros atributos.

Computemos
. A fig. 7.15 mostra
e
. Quando computamos a juno, temos duas
tuplas, alm de t1 e t2, exigidas na fig. 7.16 por t3 e t4.
Se *(R1, R2) vale, ento, sempre que tivermos as tuplas t1 e t2, devemos tambm ter t3 e t4. Assim, a fig.
7.16 mostra uma representao tabular da dependncia de juno *(R1, R2). Compare a fig. 7.16 com a fig. 7.9, na
qual temos a representao tabular de . Se tivermos
e =R1, podemos ver que as duas
representaes tabulares nessas figuras so as mesmas. De fato, *(R1, R2) apenas um outra forma de determinar
. Usando as regras da complementao e do incremento para dependncias multivaloradas,
podemos mostrar que
R1 implica
R2. Assim, *(R1, R2) equivalente a
R2. Essa
observao no causa surpresa tendo em vista que, conforme observamos anteriormente, R1 e R2 formam uma
decomposio de R sem perda na juno se, e somente se,

193

R2 ou

R1.

Toda dependncia de juno da forma *(R1, R2) , portanto, equivalente a uma dependncia
multivalorada. No entanto, h dependncias de juno que no so equivalentes a nenhuma dependncia
multivalorada. O exemplo mais simples desse tipo de dependncia o esquema R=(A, B, C). A dependncia de
juno: *((A, B), (B, C), (A, C))
no equivalente a nenhuma coleo de dependncias multivaloradas. A fig. 7.17 mostra uma representao
tabular dessa dependncia de juno. Para notar que nenhum conjunto de dependncias multivaloradas
implicam logicamente *((A, B), (B, C), (A, C)), consideramos a fig. 7.17 como uma relao r(A, B, C), como mostra a
fig. 7.18.

A relao r satisfaz a dependncia de juno *((A, B), (B, C), (A, C)), como podemos verificar computando:
e mostrando que o resultado exatamente r. Entretanto, r no satisfaz qualquer dependncia multivalorada notrivial. Para percebemos isso, verificamos que r no satisfaz nenhuma das AB, AC, BA, BC,
CA, ou CB.

194

Da mesma forma que a dependncia multivalorada um modo de estabelecer a independncia de um


par de relacionamentos, uma dependncia de juno um modo de estabelecer que os membros de um conjunto
de relacionamentos so todos independentes. Essa noo de independncia de relacionamentos consequncia
natural do modo pelo qual geralmente definimos uma relao. Considere:
esquema_info_emprstimo=(nome_agncia, nome_cliente, nmero_emprstimo, total)
de nosso exemplo bancrio. Podemos definir uma relao info_emprstimo (esquema_info_emprstimo) com o
conjunto de todas as tuplas do esquema_info_emprstimo) com o conjunto de todas as tuplas do
esquema_info_emprstimo, tal que:
O emprstimo representado por nmero_emprstimo feito pela agncia de nome nome_agncia.
O emprstimo representado por nmero_emprstimo feito pelo cliente chamado nome_cliente.
O emprstimo representado por nmero_emprstimo est no total de nome total.
A definio anterior da relao info_emprstimo uma conjugao de trs predicados: um em
nmero_agncia e nome_agncia, um em nmero_emprstimo e nome_cliente e um em nmero_emprstimo e
total.
Supreendentemente, pode ser mostrado que a definio intuitiva anterior de info_emprstimo implica
logicamente a dependncia de juno *((nmero_emprstimo, nome_agncia), (nmero_emprstimo,
nome_cliente), (nmero_emprstimo, total)).
Assim, as dependncias de juno tm um aspecto intuitivo e correspondem a um dos trs critrios
apresentados para um bom projeto de banco de dados.
Para dependncias funcionais e multivaloradas, temos de fornecer um sistema de regras de inferncias
que devem ser vlidas e completas. Infelizmente, nenhum conjunto de regras conhecido para dependncias de
junes. Esse fato nos leva a considerar classes mais genricas de dependncias que as dependncias de junes
para construir um conjunto de regras de inferncias slido e completo.

Forma Normal de Projeo de Juno


Forma normal de projeo de juno (FNPJ) definida de maneira similar a FNBC e a 4FN, exceto pelo
fato das dependncias de junes serem usadas. Um esquema de relao r est em FNPJ com respeito a um
conjunto D de dependncias funcionais, multivaloradas e de juno se, para todas as dependncias de junes
ReR=
, ao menos uma das seguintes for
em D+ na forma *(R1, R2, ..., Rn), em que cada Ri
validade:
*(R1, R2, ..., Rn) uma dependncia de juno trivial.
Todo Ri superchave para R.
Um projeto de banco de dados est na FNPJ se cada membro de um conjunto de esquemas de relaes
que constituem o projeto estiver na FNPJ. A FNPJ chamada quinta forma normal (5FN) em parte da literatura
sobre normalizao de banco de dados.
Retornaremos ao nosso exemplo bancrio. Dada a dependncia de juno *((nmero_emprstimo,
nome_agncia), (nmero_emprstimo, nome_cliente), (nmero_emprstimo, total)), esquema_info_emprstimo
no est na FNPJ. Para colocar esquema_info_emprstimo na FNPJ, precisamos decomp-la em trs esquemas
especficos por meio da dependncia de juno: (nmero_emprstimo, nome_agncia), (nmero_emprstimo,
nome_cliente) e (nmero_emprstimo, total).
Como todas as dependncias multivaloradas so tambm dependncias de juno, fcil perceber que
todo esquema na FNPJ est tambm na 4FN. Assim, em geral, no precisamos chegar decomposio com
preservao de dependncia na FNPJ para um dado esquema.
Forma Normal Domnio-chave
195

A abordagem que utilizamos para a normalizao toma por base a definio de restries (funcional,
multivalorada ou dependncia de juno) e ento usa essa restrio para definir a forma normal. A forma normal
domnio-chave (FNDC) baseia-se em trs noes:
1. Declarao de domnio. Seja A um atributo e dom um conjunto de valores. A declarao de domnio A
dom exige que o valor de A em todas as tuplas seja um valor em dom.
2. Declarao de chaves. Seja R um esquema de relao com K
R. A declarao da chave key(K)
necessita que K seja uma superchave do esquema R isto , KR. Note que todas as declaraes de
chaves so dependncias funcionais, mas nem todas as dependncias funcionais so declaraes de
chaves.
3. Restries gerais. Uma restrio geral um predicado do conjunto de todas as relaes de um dado
esquema. As dependncias que estudamos nesse captulo so exemplos de restries gerais.
Normalmente, uma restrio geral um predicado expresso em uma forma agregada, como a lgica de
primeira ordem.
Damos agora um exemplo de uma restrio geral que no funcional, multivalorada ou dependente de
juno. Suponha que todas as contas que comecem com o dgito 9 sejam contas especiais com altas taxas de
juros, cujo saldo mnimo 2500 dlares. Ento inclumos como restrio geral: se o primeiro dgito de
t[nmero_conta] for 9, ento t[saldo]2500.
Declaraes de domnio e declaraes de chave so fceis de testar em um sistema de banco de dados
prtico. Restries gerais, entretanto, podem ser extremamente custosas (em termos de tempo de
processamento e espao) para testar. O proposito de um projeto de banco de dados na FNPJ permitir-nos o
teste de restries gerais usando somente restries de domnio e chaves.
Formalmente, seja D um conjunto de restries de domnio e K, um conjunto de restries por chaves
para o esquema de relao R. Suponha que G represente as restries gerais de R. O esquema R est na FNDC se
D K implica logicamente G.
Retornemos s restries gerais que demos para as contas. As restries implicam que nosso projeto de
banco de dados no est na FNDC. Para criar um projeto na FNDC, precisamos de dois esquemas no lugar do
esquema_conta:
esquema_conta_regular=(nome_agncia, nmero_conta, saldo)
esquema_conta_especial=(nome_agncia, nmero_conta, saldo)
Conservamos, como restries gerais, todas as dependncias que tnhamos no esquema_conta. As
restries de domnio para esquema_conta_especial exigem que, para cada conta:
O nmero da conta comece por 9.
O saldo da conta seja maior que 2500.
As restries de domnio para esquema_conta_regular exigem que o nmero da conta no comece por 9.
O projeto resultante est na FNDC.
Comparemos a FNDC com outras formas normais estudadas. Nas outras formas normais, no levamos em
considerao restries de domnio. Assumimos (de modo implcito) que o domnio de cada atributo possui
domnio infinito, como o conjunto de todos os inteiros ou conjunto de todas as cadeias de caracteres. Permitimos
restries por chaves (de fato, permitimos dependncias funcionais).
Para cada forma normal, permitimos uma forma especfica de restrio geral (um conjunto de
dependncias funcionais, multivaloradas ou de juno). Assim, podemos reescrever as definies de FNPJ, 4FN,
FNBC e 3FN de modo a mostra-las como casos especiais de FNDC.
A seguir reescreveremos nossa definio de FNPJ inspirada na FNDC. Seja o esquema da relao R = (A1,
A2, ..., An). Seja dom(Ai) o domnio do atributo Ai e sejam infinitos esses domnios. Ento, todas as restries de
domnio D so da forma Ai dom(Ai). Sejam as restries gerais um conjunto G de dependncias funcionais
196

multivaloradas ou de juno. Se F um conjunto de dependncias funcionais em G, seja o conjunto K de


restries por chave aquelas dependncias funcionais no triviais em F+ da forma R. O esquema R est na
FNPJ se e somente se ele estiver na FNDC com respeito a D, K e G.
Uma consequncia da FNDC que toda insero e remoo anmala eliminada.
A FNDC constitui a ltima forma normal porque permite restries arbitrrias, em vez de dependncias, e
permite ainda testes eficientes para essas restries. Naturalmente, se um esquema no est na FNDC, podemos
alcan-la por meio de decomposies, mas tais decomposies, como j foi visto, no so sempre
decomposies com preservao da dependncia. Assim, embora a FNDC seja a meta de um projetista de banco
de dados, poder ser sacrificada em projetos reais.
Abordagens Alternativas para Projeto de Banco de Dados
Vamos reexaminar a normalizao de esquemas de relao com nfase nos efeitos dessa normalizao no
projeto de um banco de dados real.
Adotamos como abordagem comear com um nico esquema de relao e, ento, decomp-lo. Uma de
nossas metas escolher uma decomposio que resulte em decomposio sem perda na juno. Para considerar
essa ausncia de perda na juno, assumimos ser vlido falar em juno de todas as relaes de um banco de
dados decomposto.
Considere o banco de dados da fig. 7.19, representamos a relao info_emprstimo decomposta na FNPJ.
Na fig. 7.19, representamos uma situao na qual ainda no determinamos o total do emprstimo L-58, mas
desejamos registrar a existncia do dado no emprstimo. Se computarmos uma juno natural dessas relaes,
notaremos que todas as tuplas referentes ao emprstimo L-58 desaparecero. Em outras palavras, no h
nenhuma relao info_emprstimo correspondente s relaes da fig. 7.19. Tuplas que desaparecem quando
computamos a juno so tuplas pendentes. Formalmente, seja r1(R1), r2(R2), ..., rn(Rn) um conjunto de relaes.
Uma tupla t de uma relao ri uma tupla pendente se t no est na relao:

As tuplas pendentes podem ocorrer em aplicaes de banco de dados reais. Representam informaes
incompletas, como ocorreu em nosso exemplo quando desejamos armazenar dados sobre um emprstimo que
estava ainda em processo de negociao. A relao r1 r2 ... rn chamada relao universal, uma vez que
envolve todos os atributos do universo definido por R1 R2 ... Rn.
O nico modo por meio do qual podemos escrever uma relao universal para o exemplo da fig. 7.19
incluindo valores nulos na relao universal. Vimos que valores nulos originam srias dificuldades. Pesquisas a
respeito de valores nulos e relaes so discutidos em notas bibliogrficas. Devido dificuldade de manuseio de
valores nulos, pode ser mais adequado tratar as relaes de um projeto decomposto como a representao do
banco de dados, em vez das relaes universais cujos esquemas foram decompostos durante o processo de
normalizao.

197

Note que no devemos introduzir informaes incompletas no banco de dados da fig. 7.19 sem recorrer
ao uso de valores nulos. Por exemplo, no podemos introduzir um nmero de emprstimo se no conhecermos
ao menos uma das seguintes informaes:
O nome do cliente.
O nome da agncia.
O total do emprstimo.
Assim, uma decomposio em particular define uma forma restritiva para uma informao incompleta
que aceitvel em nosso banco de dados.
A forma normal que definimos gera bons projetos de banco de dados do ponto de vista da representao
de informaes incompletas. Retornando novamente ao exemplo da fig. 7.19, poderamos desejar no permitir o
armazenamento do seguinte fato: h emprstimos (cujo nmero desconhecido) para Jones cujo montante
cem dlares. Uma vez que
nmero_emprstimo  nome_cliente total,
o nico modo de podermos relacionar nome_cliente e total por meio de nmero_emprstimo. Se desejarmos
saber o nmero do emprstimo, no poderemos diferenciar esse emprstimo de outros cujos nmeros so
desconhecidos.
Em outras palavras, no conseguimos armazenar dados cujos atributos-chave sejam desconhecidos.
Observe que as formas normais que definimos no nos permitem armazenar esse tipo de informao sem a
utilizao de valores nulos. Assim, nossas formas normais permitem a representao de informaes incompletas
no desejveis.
Se permitimos tuplas suspensas em nosso banco de dados, podemos preferir uma viso alternativa do
processo de projeto de banco de dados. Em vez de decompor uma relao universal, podemos sintetizar uma
coleo de esquemas na forma normal de um determinado conjunto de atributos. Estamos interessados nas
mesmas formas normais, independente de usar decomposio ou sntese. A abordagem da decomposio
melhor entendida e mais largamente utilizada.
Outra consequncia da abordagem usada no projeto de um banco de dados que os nomes dos atributos
devem ser nicos nas relaes universais. No podemos usar nome para referncia tanto para nome_cliente
quanto para nome_agncia. Geralmente, prefervel usar nomes nicos, como vnhamos fazendo. Ainda assim,
se definssemos nossos esquemas de relaes diretamente, em vez de usarmos relaes universais, obteramos
relaes com esquema tais como os que se seguem para nosso exemplo bancrio:
agncia_emprstimo (nome, nmero)
cliente_emprstimo (nmero, nome)
tot (nmero, total)
Observe que, com as relaes anteriores, expresses como agncia_emprstimo

cliente_emprstimo

no tm sentido. Na verdade, a expresso, agncia_emprstimo


cliente_emprstimo aponta os emprstimos
feitos para clientes cujos nomes sejam os mesmos do nome da agncia.
Em linguagens como SQL, entretanto, h operaes de juno no-naturais, ento, em uma consulta
envolvendo agncia_emprstimo e cliente_emprstimo, precisamos de referncias no ambguas para nome
usando, para isso, o nome da relao como prefixo. Nesses ambientes, os diversos papeis de nome (como nome
da agncia e nome do cliente), so menos problemticos e provavelmente de utilizao mais simples.
Acreditamos que usar o critrio do papel nico cada nome de atributo tem um nico significado no
banco de dados geralmente prefervel que a utilizao de um mesmo nome em diversos papeis. Quando o
critrio do papel nico no adotado, o projetista do banco de dados deve ser cuidadoso durante a construo
de um projeto de banco de dados relacional normalizado.

198

SQL 2003
Durante o desenvolvimento do sistema R, a IBM desenvolveu a linguagem SEQUEL, primeira linguagem de
acesso aos SGBDs relacionais. Com o desenvolvimento de um nmero cada vez maior de SGBDs, fez-se
necessrio especificar um padro da linguagem, chamada SQL, em 1986. Esse lanamento foi um esforo
particular da ANSI em conjunto com a ISO. A padronizao de uma linguagem de consulta foi responsvel pelo
sucesso dos SGBDs relacionais.
Em linhas gerais, os comandos da linguagem SQL podem ser divididos em sublinguagens, tais como a
Linguagem de Manipulao de Dados (DML) e a Linguagem de Definio de Dados (DDL). A DML trata dos
comandos ligados manipulao de Dados, definindo comandos para a seleo, incluso, alterao e excluso
dos dados das tabelas. J a DDL, rene os comandos para a criao e manuteno de estruturas e objetos do
banco de dados, tais como tabelas, vises e ndices.
Os fornecedores de Gerenciadores de Banco de Dados no hesitaram em adotar a SQL. Entretanto,
criaram variaes prprias da linguagem, adicionando funes ou comandos que, muitas vezes, em virtude de seu
sucesso, acabaram se incorporando em verses posteriores do padro. Contudo, a maior parte do padro
implementado de forma idntica nos principais SGBDs, possibilitando a portabilidade de aplicaes e maior
facilidade para os conhecedores da linguagem.
A linguagem passou por aperfeioamento em 1989 e, em 1992, foi lanada a SQL-92, ou SQL2. Embora
muitos dos conceitos especificados na SQL-92 somente tenham sido implementados por SGBDs relacionais
cresceu rapidamente.
A SQL:2003 a mais nova verso do padro SQL. Nesta verso foi feita uma grande reviso do padro
SQL3 e adicionada uma nova parte, ligada ao tratamento de XML.
Tipos de Dados
Em banco de dados relacionais e relacionais estendidos, as informaes ficam armazenadas em tabelas.
As tabelas so as materializaes das relaes do modelo relacional. Elas tm linhas e colunas, onde cada linha
representa a instncia de um item armazenado e cada coluna uma informao relativa ao item em questo. A
cada coluna de uma tabela est associado um tipo de dados, fazendo com que somente dados do tipo adequado
sejam armazenados na coluna.
A SQL define alguns tipos de dados que so implementados em alguns SGBDs. Ele define, tambm, os
comandos para criao, alterao e excluso de tabelas.
Tipos de dados bsicos
Em banco de dados relacionais e relacionais-estendidos, as informaes so armazenadas em tabelas.
Cada tabela poder conter vrias colunas, as quais esto armazenados dados. A cada coluna existir um tipo de
dados associado.
O tipo de dados de cada coluna definido durante a criao da tabela. O padro de SQL define vrios
tipos de dados simples. Permite, tambm, que o usurio defina tipos de dados prprios, a partir da composio
de tipos definidos pela linguagem.
A tabela 2.1 apresenta os principais tipos de dados definidos no padro da linguagem SQL. A partir desta,
podemos dividir os tipos de dados em cinco grupos: (i) relativos a cadeias de caracteres; (ii) relativos a dados
numricos; (iii) para armazenamento de objetos grandes; (iv) para armazenamento de informao booleana e
(v) tipos de dados relativos a datas e horas.

199

Os vrios fornecedores de SGBDs utilizam variaes prprias de dados definidos no SQL:2003.


Criando Tabelas
Uma tabela a materializao de um local para armazenamento de dados. Tais dados so agrupados em
linhas. Cada linha contm um conjunto de uma ou mais colunas. Todas as linhas tm o mesmo nmero de
colunas. Cada coluna possui seu tipo de dados prprio, que o mesmo para todas as linhas.
Ao criarmos uma tabela, devemos especificar o seu nome, quais colunas que a compe e quais os tipos de
dados das colunas em questo. Alm disso, podem ser definidas restries de integridade e regras de domnio,
entre outros. Assim, podemos especificar, durante a criao de uma tabela, por exemplo, que uma coluna referese chave primria da tabela ou que uma dada coluna somente poder conter determinados valores.
Quando uma tabela criada, ela no contm dados, ou seja, linhas. Somente depois os dados so
inseridos. Entretanto, algumas colunas da tabela podem no ter o seu preenchimento obrigatrio. Para estas,
quando nenhum dado for fornecido durante a incluso, includo o valor NULL (nulo).
A princpio, todas as colunas, independente de seus tipos de dados, podem apresentar o valor NULL no
seu contedo, em uma ou mais linhas. Ou seja, uma coluna definida como de tipo INTEGER pode suportar
nmeros inteiros ou o valor NULL. Da mesma forma, uma coluna CHAR suporta cadeia de caracteres ou o valor
NULL. Notamos que NULL indica ausncia de valor definido. diferente de zero ou de uma cadeia de caracteres
de comprimento zero. Ao criarmos uma tabela, podemos especificar que uma ou mais colunas no podem conter
o valor NULL. Ou seja, tais colunas tm o seu preenchimento obrigatrio. Quando nada informado para uma
coluna, ela aceita NULL no seu contedo.
Utilizamos o comando CREATE TABLE para criao de tabelas. A sintaxe bsica do comando a seguinte:
CREATE TABLE NOME_TABELA(
COL1
TIPO_COL1
[NOT NULL],
COL2
TIPO_COL2 [NOT NULL],
COLN
TIPO_COLN [NOT NULL]
200

)
Exemplo de criao de tabela no Oracle 10g:
CREATE TABLE EDITORA (
CODIGO
NUMBER(2) NOT NULL,
NOME VARCHAR2(80) NOT NULL
)
Podemos, na criao de tabelas, especificar vrios tipos de restries. Para uma dada coluna, a SQL:2003
nos permite que restries sejam especificadas aps o nome do tipo de dados da coluna em questo. As
principais restries so:
Chave primria: devemos posicionar a expresso PRIMARY KEY ao lado da definio do tipo de dados da
coluna em questo.
Chave estrangeira: posicionamos a expresso FOREIGN KEY REFERENCES NOME_TABELA ao lado da
definio do tipo da coluna. FOREIGN KEY opcional. NOME_TABELA deve ser substitudo pelo nome da
tabela que referenciada pela chave estrangeira. A tabela referenciada pela chave estrangeira deve ser
criada antes da criao da chave estrangeira.
Chave alternada: a expresso UNIQUE deve ser usada ao lado da definio do tipo de dados da coluna.
UNIQUE faz com que no seja possvel inserir valores repetidos na coluna.
Restrio de domnio: para verificar que o valor de uma coluna deve estar contido em uma lista ou faixa
de valores, utilizamos a palavra CHECK, seguida de uma expresso booleana delimitada por parnteses.
CONSTRAINT NOME_RESTRICAO TIPO_RESTRICAO
Onde:
Constraint indica a definio de uma restrio de integridade.
Nome_Restricao nome dada a restrio (CONSTRAINT) que est sendo criada.
Tipo_Restricao tipo da restrio que est sendo criada: PRIMARY KEY, FOREIGN KEY OU UNIQUE, por
exemplo. No caso de uma chave estrangeira, FOREIGN KEY opcional e o comando deve ser
complementado com a clusula REFERENCES.
A designao de um nome para cada restrio bastante til para o controle de erros que porventura
ocorram. Suponha que, por exemplo, durante a execuo de um programa que acessa um banco de dados, tentese incluir um valor repetido em linhas de uma coluna marcada como chave primria de uma tabela. Neste caso, o
SGBD no permite operao e um erro ocorre. O SGBD informa, na mensagem de erro, o nome da restrio que
foi violada. Isto permite que a aplicao trate o erro corretamente ou, ainda que seja mais facilmente detectado o
ponto onde a aplicao deve ser alterada de forma a no permitir que tal situao ocorra. Por isso, interessante
que o nome da CONSTRAINT indique o tipo de restrio, a tabela a que se refere e, quando possvel, a coluna que
sofre a restrio.
Consideremos a coluna CPF da tabela AUTOR. Esta coluna no deve aceitar valores repetidos. Para isso,
utilizamos a seguinte definio para a coluna:
CPF CHAR(11) NOT NULL UNIQUE
Por exemplo, para criar a tabela EDITORA no banco de dados Oracle 10g:
CREATE TABLE EDITORA (
CODIGO
NUMBER(2) NOT NULL PRIMARY KEY,
NOME VARCHAR2 (80) NOT NULL )
Para criar a tabela ASSUNTO, definindo PK_ASSUNTO como nome para a CONSTRAINT chave primria, utilizamos,
no Oracle 10g:
CREATE TABLE ASSUNTO(
SIGLA
CHAR(1) NOT NULL
CONSTRAINT PK_ASSUNTO PRIMARY KEY,
DESCRICAO
VARCHAR2(50)
201

)
Vejamos agora, um exemplo da definio de chave estrangeira, a partir da criao da tabela LIVRO.
Atribuiremos o nome PK_LIVRO para a restrio de chave primria, FK_LIVRO_ASSUNTO para a restrio de chave
estrangeira da coluna que referencia a tabela ASSUNTO e FK_LIVRO_EDITORA para a restrio de chave
estrangeira da coluna que referencia a tabela EDITORA.
CREATE TABLE LIVRO(
CODIGO
NUMBER(3) NOT NULL
CONSTRAINT PK_LIVRO PRIMARY KEY,
TITULO
VARCHAR2(80) NOT NULL,
PRECO
NUMBER(10,2),
LANCAMENTO DATE,
ASSUNTO
CHAR(1)
CONSTRAINT FK_LIVRO_ASSUNTO
REFERENCES ASSUNTO,
EDITORA
NUMBER(2)
CONSTRAINT FK_LIVRO_EDITORA
REFERENCES EDITORA
)
Restries de domnio podem ser implementadas atravs da clusula CHECK, seguida da expresso
booleana delimitada por parnteses. Para a montagem da expresso booleana podemos utilizar operadores de
comparao (<,>,>=,<=, =, <>) e predicados como LIKE e IN.
Exemplos:
Para definirmos a coluna SIGLA, que no admite valores nulos, somente possa aceitar os valores R, B
e F:
SIGLA CHAR(1) NOT NULL CHECK (SIGLA IN(R, B, F))
Para definirmos que a coluna MATRICULA somente aceitar valores maiores que 1000:
MATRICULA INTEGER CHECK (MATRICULA > 1000)
Podemos, tambm, atribuir um valor padro para as colunas de uma tabela. O valor padro ser
automaticamente atribudo coluna durante a criao de uma linha, caso nenhum valor tenha sido fornecido.
Sua definio d-se no momento da criao da tabela atravs da clusula DEFAULT, conforme apresentado a
seguir:
COL1
TIPO_COLUNA DEFAULT VALOR_PADRAO
Por exemplo: SEXO CHAR(1) DEFAULT M
A utilizao de restries de integridade no banco de dados pode ser bastante til para a manuteno da
correo das informaes. A definio de chaves primrias e restries UNIQUE impedem que sejam includos
valores repetidos em uma dada coluna. A definio de chaves estrangeiras faz com que somente sejam
permitidos valores que existam na tabela referenciada.
A tabela 2.6 apresenta um contedo da tabela EDITORA:

202

Na tabela LIVRO que criamos anteriormente, especificamos a coluna EDITORA como chave estrangeira
para a tabela EDITORA. Dessa forma, se considerarmos o contedo da tabela EDITORA apresentado na tabela
acima, ento a coluna EDITORA da tabela LVIRO somente poder conter os valores NULL, 1, 2, 3 e 4. Se tentarmos
incluir quaisquer outros valores, o SGBD gerar um erro e no permitir a incluso das informaes.
Considere, agora, que existe uma linha na tabela LIVRO onde a coluna EDITORA possua o valor 2.
Consideremos que um usurio tente excluir, da tabela EDITORA, a linha de cdigo 2. Se isto for possvel, teremos
uma inconsistncia nos dados, pois existir um valor na chave estrangeira da tabela LIVRO que no existe na
chave primria da tabela EDITORA. De acordo com o padro SQL possvel especificar, durante a definio da
restrio, trs diferentes aes a serem tomadas pelo SGBD, quando tal situao ocorrer:
Impedir a excluso da linha da tabela pai (EDITORA) caso existam outras tabelas que referenciem o valor a
ser excludo. A linha no excluda e um erro gerado. Esta a situao padro, a qual ocorrer sempre
que uma chave estrangeira for definida, a menos que declaremos o contrrio. especificada atraves da
opo ON DELETE RESTRICT;
ASSUNTO
CHAR(1)
CONSTRAINT FK_LIVRO_ASSUNTO
REFERENCES ASSUNTO
ON DELETE RESTRICT

Alterar o valor da coluna da chave estrangeira na tabela filho (LIVRO), tornando-o NULL para as linhas que
possuam o valor que est sendo apagado na tabela pai. A linha da tabela pai tambm apagada. Esta
ao especificada atraves da clusula ON DELETE SET NULL;
ASSUNTO
CHAR(1)
CONSTRAINT FK_LIVRO_ASSUNTO
REFERENCES ASSUNTO
ON DELETE SET NULL

Apagar as linhas da tabela filho onde existir, na coluna de chave estrangeira, o valor que est sendo
apagado na tabela pai. A linha da tabela pai tambm apagada. Esta ao definida atraves da clusula
ON DELETE CASCADE.
ASSUNTO
CHAR(1)
CONSTRAINT FK_LIVRO_ASSUNTO
REFERENCES ASSUNTO
ON DELETE CASCADE
Existe, ainda, um outro formato para a especificao de restries em tabelas. Podemos especificar
restries aps a declarao de todas as colunas. Neste caso, deveremos seguir o formato:
CONSTRAINT NOME_RESTRICAO TIPO_RESTRICAO
(COLUNA1_RESTRICAO, COLUNA2_RESTRICAO,...)

203

Eis a sintaxe do Oracle 10g:


CREATE TABLE LIVRO (
CODIGO
NUMBER(3),
TITULO
VARCHAR2(80) NOT NULL,
PRECO
NUMBER(10,2),
LANCAMENTO DATE,
ASSUNTO
CHAR(1),
EDITORA
NUMBER(2)
CONSTRAINT PK_LIVRO PRIMARY KEY (CODIGO),
CONSTRAINT FK_LIVRO_ASSUNTO FOREIGN KEY (ASSUNTO)
REFERENCES ASSUNTO,
CONSTRAINT FK_LIVRO_EDITORA
FOREIGN KEY (EDITORA)
REFERENCES EDITORA
)
Alterando tabelas
A SQL:2003 nos d a opo de alterar tabelas j existentes no banco de dados. Para isso, utilizamos o
comando ALTER TABLE. Este comando pode ser utilizado em conjunto com as clusulas adicionais para executar,
entre outras, uma das seguintes opes:
Incluir novas colunas em uma tabela existente;
Excluir colunas existentes em uma tabela;
Adicionar a definio de uma restrio a uma tabela existente;
Excluir a definio de uma restrio existente em uma tabela.
Incluindo novas colunas em uma tabela j existente
Para incluir novas colunas em uma tabela, utilizamos o comando ALTER TABLE, conforme a seguir:
ALTER TABLE NOME_TABELA
ADD [COLUMN] NOME_COLUNA TIPO_COLUNA RESTRICOES
Por exemplo, vamos adicionar a coluna IDENTIDADE tabela AUTOR, j criada no banco de dados.
ALTER TABLE AUTOR
ADD IDENTIDADE CHAR(10)
Excluindo colunas existentes em uma tabela
Para excluir colunas existentes em uma tabela, utilizamos o comando ALTER TABLE no formato
apresentado a seguir:
ALTER TABLE NOME_TABELA
DROP [COLUMN] NOME_COLUNA
Por exemplo, vamos remover a coluna IDENTIDADE da tabela AUTOR, j criada no banco de dados:
ALTER TABLE AUTOR
DROP COLUMN IDENTIDADE
Adicionando a definio de uma restrio a uma tabela existente
ALTER TABLE NOME_TABELA
ADD CONSTRAINT NOME_RESTRICAO TIPO_RESTRICAO
(COLUNA1_RESTRICAO, COLUNA2_RESTRICAO, ...)
204

Por exemplo, suponha que tenhamos criado a tabela LIVRO sem especificar nenhuma restrio. Vamos
agora adicionar essas restries atraves de trs comandos:
Adicionando a chave primria:
ALTER TABLE LIVRO
ADD CONSTRAINT PK_LIVRO PRIMARY KEY (CODIGO)
Adicionando a chave estrangeira a tabela ASSUNTO:
ALTER TABLE LIVRO
ADD CONSTRAINT FK_LIVRO_ASSUNTO FOREIGN KEY (ASSUNTO)
REFERENCES ASSUNTO
Adicionando a chave estrangeira para a tabela EDITORA:
ALTER TABLE LIVRO
ADD CONSTRAINT FK_LIVRO_EDITORA
FOREIGN KEY (EDITORA)
REFERENCES EDITORA
Excluindo a definio de uma restrio existente em uma tabela
Alterando tabelas
Podemos tambm alterar tabelas j definidas no banco de dados. Para isso utilizamos o comando ALTER
TABLE. Este comando pode ser utilizado em conjunto com as clusulas adicionais para executar, entre outras,
uma das seguintes opes:
Incluir novas colunas em uma tabela existente;
Excluir colunas existentes em uma tabela;
Adicionar a definio de uma restrio em uma tabela j existente;
Excluir a definio de uma restrio existente em uma tabela.
Incluir novas colunas em uma tabela existente
Para incluir novas colunas em uma tabela existente, utilizamos o comando ALTER TABLE conforme a
seguir:
ALTER TABLE NOME_TABELA
ADD [COLUMN] NOME_COLUNA TIPO_COLUNA RESTRICOES
Por exemplo: vamos adicionar a coluna IDENTIDADE tabela AUTOR, j criada no banco de dados.
ALTER TABLE AUTOR
ADD IDENTIDADE CHAR(10)
Excluindo colunas existentes em uma tabela, utilizamos o comando ALTER TABLE no formato apresentado a
seguir:
ALTER TABLE NOME_TABELA
DROP [COLUMN] NOME_COLUNA
Exemplo, vamos remover a coluna IDENTIDADE da tabela AUTOR, j criada no banco de dados:
ALTER TABLE AUTOR
DROP COLUMN IDENTIDADE
Adicionando a definio de uma restrio a uma tabela existente
Para incluir uma nova restrio a uma tabela existente, tambm utilizamos o comando ALTER TABLE. A
sintaxe bsica utilizada :
205

ALTER TABLE NOME_TABELA


ADD CONSTRAINT NOME_RESTRICAO TIPO_RESTRICAO
(COLUNA1_RESTRICAO, COLUNA2_RESTRICAO, ...)
Por exemplo: Suponha que tenhamos criado a tabela LIVRO sem especificar nenhuma restrio. Vamos,
agora, adicionar as restries a essa tabela, atravs de trs comandos.
Adicionando a chave primria:
ALTER TABLE LIVRO
ADD CONSTRAINT PK_LIVRO KEY(CODIGO)
Adicionando a chave estrangeira para a tabela ASSUNTO:
ALTER TABLE LIVRO
ADD CONSTRAINT FK_LIVRO_ASSUNTO FOREIGN KEY(ASSUNTO)
REFERENCES ASSUNTO
Adicionando a chave estrangeira para a tabela EDITORA:
ALTER TABLE EDITORA
ADD CONSTRAINT FK_LIVRO_EDITORA
FOREIGN KEY (EDITORA)
REFERENCES EDITORA
Excluindo a definio de uma restrio existente em uma tabela
O comando ALTER TABLE tambm pode ser utilizado para excluir uma restrio j existente em uma
tabela. Para isso, utilizamos o seguinte formato:
ALTER TABLE NOME_TABELA
DROP CONSTRAINT NOME_RESTRICAO
Por exemplo, desejamos excluir a chave primria da tabela LIVRO:
ALTER TABLE LIVRO
DROP CONSTRAINT PK_LIVRO
Desejamos destruir a chave estrangeira da tabela LIVRO que aponta para a tabela EDITORA.
ALTER TABLE LIVRO
DROP CONSTRAINT FK_LIVRO_EDITORA
Destruindo tabelas
Para destruir uma tabela utilizamos o comando DROP TABLE. Sua sintaxe bsica :
DROP NOME NOME_TABELA [CASCADE]
Exemplo: Para destruir a tabela LIVRO.
DROP TABLE LIVRO

206

Comandos Bsicos
Incluso de Dados
Para incluirmos dados em uma tabela, devemos utilizar o comando INSERT. Sua sintaxe bsica, segundo a
qual inserimos uma linha em uma tabela mostrada a seguir:
INSERT INTO NOME_TABELA (COL1, COL2, ..., COLN)
VALUES (VAL1, VAL2, ..., VALN)
Considere a tabela LIVRO j apresentada anteriormente. A tabela 3.1 apresenta um exemplo de instncia
da tabela LIVRO apresentado. Notamos que existe um livro com valor nulo para o campo LANCAMENTO. Isso
significa que ele ainda no foi lanado.

A descrio completa dos assuntos est na tabela ASSUNTO. Nesta existem vrios assuntos cadastrados,
independentemente se existe um livro do assunto em questo. Tomemos a tabela 3.2 como exemplo de instncia
da tabela EDITORA.

Para concluirmos as trs primeiras linhas na tabela LIVRO, devemos realizar os seguintes comandos
INSERT:
INSERT INTO LIVRO
(CODIGO, TITULO, PRECO, LANCAMENTO, ASSUNTO, EDITORA) VALUES
(1, BANCO DE DADOS PARA WEB, 31.2, 10/01/1999, B, 1)
INSERT INTO LIVRO
(TITULO, CODIGO, LANCAMENTO, PRECO, ASSUNTO, EDITORA) VALUES
(PROGRAMANDO EM LINUGAGEM C, 2, 01/10/1997, 30, P, 1)
Notamos que a diferena dos dois primeiros comandos anteriores est na diferena da ordem. Quando
especificamos o nome no h uma limitao na ordenao das mesmas.
A especificao dos nomes das colunas permite, ainda, que no sejam inseridos dados para todas as
colunas de uma tabela. Considere o caso do livro de cdigo 4, que no possui data de lanamento. Ao inseri-lo,
podemos omitir a coluna LANCAMENTO do comando INSERT a ser utilizado:
INSERT INTO LIVRO (CODIGO, TITULO, PRECO, ASSUNTO, EDITORA) VALUES
(4, BANCO DE DADOS PARA INFORMATICA, 48, B, 2)
207

Neste caso, ser inserido o valor NULL para LANCAMENTO. Note que, se essa coluna possuir uma
restrio para no aceitar valores nulos, e no estiver definido um valor padro, o comando no poder ser
executado.
Outra forma de executar o comando anterior, especificando todas as colunas da tabela, atravs da
utilizao da palavra NULL:
INSERT INTO LIVRO
(CODIGO, TITULO, PRECO, LANCAMENTO, ASSUNTO, EDITORA) VALUES
(4, BANCO DE DADOS PARA BIOINFORMATICA, 48, NULL, B, 21)
Caso estejamos inserindo valores para todas as colunas da tabela, podemos omitir seus nomes.
Entretanto, nesse caso, devemos especificar os valores a serem inseridos na mesma ordem em que as colunas da
tabela foram criadas:
Errado:
INSERT INTO LIVRO VALUES
(R, 42, 5, 01/09/1996, REDES DE COMPUTADORES, 2)
Correto:
INSERT INTO LIVRO
(CODIGO, TITULO, PRECO, LANCAMENTO, ASSUNTO, EDITORA) VALUES
(5, REDES DE COMPUTADORES, 42, 01/09/1996, R, 2)
Quando inclumos dados em tabelas que possuem chaves estrangeiras referenciando outras tabelas, os
valores que esto sendo inseridos nas colunas da chave estrangeira j devem constar na chave primria da tabela
referenciada.
Consulta simples
A consulta simples a dados armazenados , usualmente, a operao realizada com mais freqncia em
sistemas comerciais. medida que a quantidade de linhas em tabelas cresce e que utilizamos varias tabelas em
uma mesma consulta, no s a complexidade do comando SQL aumenta, como tambm o tempo de resposta da
consulta pode ser muito alto, exigindo, assim, mais ateno na montagem do comando.
Para a realizao de consulta ao banco de dados, utilizamos o comando SELECT. A sintaxe bsica do
comando SELECT :
SELECT COL1, COL2, ..., COLN
FROM NOME_TABELA
Considere a instncia da tabela LIVRO apresentado anteriromente. Se quisermos recuperar as colunas
TITULO e CODIGO dessa tabela, devemos executar o comando:
SELECT CODIGO, TITULO
FROM LIVRO
Se quisermos recuperar todas as colunas da tabela LIVRO podemos especific-la no comando SELECT ou
utilizar o caractere *.
As consultas:
SELECT CODIGO, TITULO, PRECO, LANCAMENTO, ASSUNTO, EDITORA
FROM LIVRO
e
SELECT * FROM LIVRO

208

Quando especificamos as colunas no comando SELECT, elas sero apresentadas no resultado, na ordem
especificada. Quando o caractere * utilizado, as colunas estaro ordenadas da mesma forma que o foram na
criao da tabela.
A clusula WHERE
Os resultados de comandos como apresentado anteriormente possuem todas as linhas da tabela. No
entanto, na maioria das consultas queremos consultar apenas as informaes referentes a algumas linhas. Essas
linhas devem atender a alguma condio.
A clusula WHERE permite que sejam especificadas linhas sobre as quais ser aplicada. A instruo pode
ser um comando SELECT ou comandos de atualizao e excluso de dados.
WHERE sempre usada com expresses lgicas, a qual pode ser operadores de comparao (>,<,>=,<=, =,
<>), operadores lgicos (AND, OR e NOT) e predicados prprios de linguagem SQL, tais como IS(NOT) NULL, IS
(NOT) LIKE, IN e EXISTS. Os operadores lgicos AND e OR so usados para conectar comparaes.
A expresso lgica ter um resultado que poder assumir os valores verdadeiro ou falso. A instruo
especificada ser executada para as linhas que tornarem o resultado da expresso lgica verdadeiro.
Por exemplo:
Preo superior a R$ 50,00
WHERE PRECO > 50
Preo igual a R$ 50,00 e de assunto p
WHERE PRECO > 50 AND ASSUNTO = P
Preo inferior a R$ 50,00 ou de assunto P
WHERE PRECO < 50 OR ASSUNTO = P
Lanamento nulo
WHERE LANCAMENTO IS NULL
Quando realizamos comparaes com colunas de tipos cadeias de caracteres, frequentemente queremos
encontrar valores que possuem determinados caracteres ou sequencias de caracteres. Para tal, usamos o
predicado LIKE em conjunto com um ou mais caracteres coringa.
O caractere coringa usado para substituir um ou mais caracteres que no conhecemos. Os caracteres
coringa so % e _. O caractere % utilizado para substituir uma cadeia ilimitada de caracteres onde ele
posicionado, enquanto _ substitui zero ou apenas um caractere.
Por exemplo: WHERE TITULO IS LIKE %BANCO_ DE DADOS%
Atualizao de informaes
Os dados inseridos em tabelas do banco de dados podem ser modificados. Para tal, utiliza-se o comando
UPDATE. Sua sintaxe :
UPDATE NOME_TABELA
SET COL1 = VAL1, COL2 = VAL2, ..., COLN = VALN
WHERE EXPRESSAO_LOGICA
Considerando a tabela LIVROS, temos os seguintes exemplos:
Atualizar o preo de todos os livros fornecendo um aumento de 10%.
UPDATE LIVRO
SET PRECO = PRECO * 1.1
Atualizar o preo do livro Programando em Linguagem C para R$ 32,00.
UPDATE LIVRO
SET PRECO = 32
WHERE TITULO = PROGRAMANDO EM LINGUAGEM C
209

Alterar o titulo e o preo do livro de cdigo 2 para Programao em Linguagem C e R$ 42,00,


respectivamente.
UPDATE LIVRO
SET PRECO = 42,
TITULO = PROGRAMACAO EM LINGUAGEM C
WHERE CODIGO = 2

Quando atualizamos os dados de uma ou mais colunas marcadas como chaves estrangeiras, os novos
valores j devem constar na chave primria da tabela referenciada.
Excluso de linhas
O comando DELETE utilizado para excluir linhas de uma tabela. Sua sintaxe a seguinte:
DELETE FROM NOME_TABELA
WHERE EXPRESSAO_LOGICA
Nos exemplos a seguir, utilizaremos novamente a tabela LIVROS:
Excluir todos os livros da tabela.
DELETE FROM LIVRO
Excluir os livros que tenham preo superior a R$ 100,00 e que no tenham sido lanados.
DELETE FROM LIVRO
WHERE LANCAMENTO IS NULL AND PRECO > 100
Excluir os livros que tenham R como assunto ou que ainda no tenham sido lanados.
DELETE FROM LIVRO
WHERE ASSUNTO = R OR LANCAMENTO IS NULL
Agrupamento Dados
Na linguagem SQL so definidas vrias funes que operam sobre grupos de dados. Tais funes,
usualmente, realizam operaes ou comparaes sobre um conjunto de dados e retornam, como resultado, uma
relao de apenas uma linha ou uma coluna. So chamadas Funes Agregadas.
Contagem
Muitas vezes necessrio contar uma quantidade de linhas que satisfaz uma determinada condio. Para
isso, utilizamos a funo COUNT. Assim como as outras funes que sero apresentadas mais adiante, a funo
COUNT recebe um parmetro e retorna um numero.
Como parmetro para a funo COUNT podemos utilizar o nome de uma coluna ou o caractere *. No caso
da utilizao do caractere * o resultado obtido a contagem do numero de linhas da tabela. No caso da utilizao
de uma coluna como parmetro, o reesultado obtido o numero de ocorrncias no nulas desta coluna na tabela
pesquisada.
Por exemplo:
Contar a quantidade de linhas da tabela LIVRO:
SELECT COUNT(*)
FROM LIVRO
Contar a quantidade de linha da tabela LIVRO com a coluna de cdigo preenchida:
SELECT COUNT(CODIGO)
FROM LIVRO
A funo COUNT retornar zero quando nenhuma linha atender ao critrio utilizado.
Soma
210

Outra operao comumente utilizada a soma. Para realizar a soma de valores de uma coluna para um
grupo de dados, utilizamos a funo SUM.
Exemplo:
Somatrio dos preos da tabela de livros:
SELECT SUM(PRECO)
FROM LIVRO
A funo SUM retornar o somatrio dos valores no-nulos da coluna utilizada como parmetro.
Retornar NULL se todos os valores desta coluna forem nulos ou se nenhum valor atender ao critrio de seleo.
Mdia
Para obter a mdia aritmtica dos valores de uma coluna utilizada como parmetro, utilizamos o
comando AVG, informando, como parmetro para a mesma, o nome da coluna para a qual desejamos obter a
mdia.
A funo AVG retornar a mdia considerando apenas os valores no-nulos da coluna especificada.
Exemplo:
SELECT AVG(PRECO)
FROM LIVRO
Valor Mximo
Para obter o valor mximo de uma coluna em um conjunto de dados, utilizamos a funo MAX. Assim
como a funo AVG, MAX recebe um parmetro e retorna o valor NULL se em todas as linhas da tabela
consultada o valor da coluna em questo for nulo, ou se nenhuma linha atender ao valor do critrio de seleo.
Exemplo:
SELECT MAX(PRECO)
FROM LIVRO
WHERE ASSUNTO = P
Valor mnimo
Em oposio funo MAX, temos a funo MIN, que retorna o menor valor de uma coluna para a tabela
especificada.
Menor preo da tabela de livros, para cujos livros o assunto seja B:
SELECT MIN(PRECO)
FROM LIVRO
WHERE ASSUNTO = B
Outras funes
Podemos destacar:
STDDEV_POP: desvio padro da populao;
STDDEV_SAMP: desvio padro da amostra;
VAR_POP: varincia calculada como o quadrado de STDDEV_POP;
VAR_SAMP: varincia calcula como o quadrado de STDDEV_SAMP.
Clusula GROUP BY
Para utilizarmos uma funo de agregao em conjunto com colunas da tabela na clusula SELECT,
devemos utilizar a clusula GROUP BY. A sintaxe de utilizao da clusula GROUP BY a seguinte:
SELECT COL1, COL2, ..., COLN, FUNCAO1, , FUNCAON
FROM NOME_TABELA
WHERE CONDICAO
211

GROUP BY COL1, COL2, ..., COLN


A utilizao da clusula GROUP BY faz com que os dados sejam sumarizados pelas colunas que so
especificadas na mesma. Assim, somente valores distintos destas colunas farao parte do resultado. Neste caso,
torna-se possvel utilizar funes agregadas, as quais iro operar sobre as linhas que foram utilizadas para montar
cada grupo (sumarizao) de dados. Vejamos alguns exemplos:
Qual o preo mdio dos livros de cada assunto?
SELECT ASSUNTO, AVG(PRECO)
FROM LIVRO
GROUP BY ASSUNTO
Quantos livros existem para cada assunto?
SELECT ASSUNTO, COUNT(*)
FROM LIVRO
GROUP BY ASSUNTO
Qual o preo do livro mais caro de cada assunto, dentre aqueles que j foram lanados?
SELECT ASSUNTO, MAX(PRECO)
FROM LIVRO
WHERE LANCAMENTO IS NOT NULL
GROUP BY ASSUNTO
Quantos livros j foram lanados para cada editora?
SELECT EDITORA, COUNT(*)
FROM LIVRO
WHERE LANCAMENTO IS NOT NULL
GROUP BY EDITORA
Clusula HAVING
A clusula WHERE no nos permite realizar no nos permite realizar restries com base nos resultados
das funes agregadas. Para isso, devemos utilizar a clusula HAVING.
A clusula HAVING ser seguida de uma expresso lgica que poder ser composta ou no, de forma
idntica ao que foi apresentado na clusula WHERE. Assim como a clusula WHERE, a clusula HAVING serve de
filtro para as linhas constantes do resultado do comando SQL.
A principal diferena entre essas clusulas se d no fato de que, no caso da clusula WHERE, o filtro
aplicado quando as linhas so recuperadas do banco de dados, fazendo com que estas nem cheguem a ser
consideradas quando da realizao de agrupamentos ou na execuo da funo de agregao. J as restries
descritas na clusula HAVING sero aplicadas somente aps a recuperao das linhas no banco de dados, da
montagem dos grupos e da execuo de funes agregadas. Por isso, possvel utilizar funes agregadas em
expresses lgicas da clusula HAVING.
Sintaxe bsica:
SELECT COL1, COL2, ..., COLN
FROM NOME_TABELA
WHERE EXPRESSAO_LOGICA_WHERE
GROUP BY COL1, COL2,..., COLN
HAVING EXPRESSAO_LOGICA_HAVING
Exemplo:
Quais os assuntos cujo preo mdio dos livros ultrapassa R$50,00?
212

SELECT ASSUNTO
FROM LIVRO
GROUP BY ASSUNTO
HAVING AVG(PRECO) > 50
Quais os assuntos que possuem mais de dois livros?
SELECT ASSUNTO, COUNT(*)
FROM LIVRO
GROUP BY ASSUNTO
HAVING COUNT(*) > 1
Quais os assuntos que possuem mais de dois livros j lanados?
SELECT ASSUNTO, COUNT(*)
FROM LIVRO
GROUP BY ASSUNTO
HAVING COUNT(*) > 1
Quantos livros j foram lanados por assunto?
SELECT ASSUNTO, COUNT(*)
FROM LIVRO
WHERE LANCAMENTO IS NULL
GROUP BY ASSUNTO

213

Operando, Ordenando e Formatando Resultados


Usando apelidos
No possvel atribuir apelidos tanto a colunas quanto a tabelas, e referenci-las atravs de seus apelidos.
Apelidos para colunas  atribuir um apelido a uma coluna resultante de uma consulta extremamente fcil. Veja
a sintaxe:
SELECT COL1 AS MINHA_COLUNA
FROM NOME_TABELA
Quaisquer construes particionadas na clusula SELECT, como as funes, podem receber apelidos. Por
exemplo:
Considere a consulta que retorna o maior preo da tabela de livros para livros cujo assunto seja P:
SELECT MAX(PRECO) AS PRECO_MAXIMO
FROM LIVRO
WHERE ASSUNTO = P
Apelidos para as tabelas  em nossas consultas ao banco de dados podemos fazer referncia a uma coluna
explicitando a sua tabela de origem como uma construo no formato: NOME_TABELA.NOME_COLUNA. Na
verdade, h situaes onde somos obrigados a utilizar esse tipo de construo.
Em alguns casos, as tabelas so representadas por nomes extensos e utilizar a construo anterior pode no
ser s cansativo quanto tornar o comando extenso e confuso. Nessas situaes, possuir um apelido menor e
expressivo para a tabela interessante. Na verdade, no se trata somente de questo de clareza de comando. H
situaes onde somos obrigados a utilizar apelidos para tabelas e relaes. Vejamos, ento, como fornecer
apelidos para tabelas:
SELECT COL1
FROM NOME_TABELA_ORIGINAL AS NOVO_NOME_TABELA
Abaixo, a tabela LIVRO substituda pelo apelido L:
SELECT MAX(L.PRECO) AS PRECO_MAXIMO
FROM LIVRO L
WHERE L.ASSUNTO = P
Constantes e concatenao
A SQL permite definir constantes que sero repetidas em todas as linhas do resultado de uma consulta, o que
atende ao caso anterior. Para isso, basta especificar a constante desejada na clusula SELECT do comando. Por
exemplo:
SELECT LIVRO: AS TEXTO, TITULO
FROM LIVRO
Neste exemplo, a cadeia de caracteres LIVRO: foi tratada como uma coluna independente. A linguagem SQL
define o operador de concatenao ||, e deve ser utilizado entre as colunas ou textos que desejamos
concatenar.
Vejamos o exemplo da utilizao de concatenao do exemplo anterior:
SELECT LIVRO: || TITULO AS TEXTO
FROM LIVRO
Realizando operaes aritmticas

214

Da mesma forma que utilizamos a clusula SELECT, podemos realizar operaes aritmticas sobre os
resultados de uma consulta. Os operadores +, -, *, e / podem ser utilizados em expresses matemticas. Alm
disso, parnteses tambm podem ser utilizados, para determinar prioridades na execuo das operaes. Por
exemplo:
Listar os novos preos dos livros se os valores fossem reajustados em 10%.
SELECT TITULO, PRECO*1.1 AS NOVO_PRECO
FROM LIVRO
Podemos reescrever a consulta para demonstrar a utilizao de outros operadores mas obtendo o mesmo
resultado.
SELECT TITULO, PRECO + (PRECO/10) AS NOVO_PRECO
FROM LIVRO
Notamos que as operaes realizadas modificam somente o resultado das consultas, no alterando os dados
das tabelas.
Aplicando Funes
Formatando os resultados de uma consulta atravs de funes do SGBD pode fornecer resultados mais
compreensveis e, tambm, fazer com que a consulta retorne informaes em formato adequado para exibio
ao usurio final. Alm disso, muitas vezes, podemos utilizar funes que manipulam os resultados de consultas
SQL formatando-os ou alterando-os.
Cadeia de caracteres  o padro SQL define vrias funes que manipulam e formatam cadeias de caracteres.
Nesta seo so apresentadas as principais: UPPER, LOWER, TRIM, SUBSTRING e LENGHT.
As funes UPPER, LOWER, TRIM e LENGHT recebem uma cadeia de caracteres (ou uma coluna de dados do
tipo cadeia de caracteres) como parmetro e retornam um resultado do mesmo tipo. J a funo SUBSTRING, que
tambm retorna uma cadeia de caracteres como resultado, recebe trs parmetros como entrada, sendo dois
numricos e uma cadeia de caracteres.
A funo UPPER retornam o seu parmetro de entrada com todos os caracteres convertidos para maisculas.
Em oposio funo UPPER, a funo LOWER retorna todos os caracteres convertidos para minsculos. Vejamos
um exemplo:
SELECT UPPER(LIVRO:) || LOWER(TITULO) AS TEXTO
FROM LIVRO
A funo TRIM retira os caracteres espao contidos nas margens da cadeia de caracteres que recebe como
parmetro. Exemplo:
Consulta:
SELECT TRIM( LIVRO: ) || TITULO AS TEXTO
FROM LIVRO
WHERE ASSUNTO = P
A funo SUBSTRING retorna o trecho da cadeia de caracteres que ela recebe como parmetro. O trecho a ser
retornado definido por outros dois parmetros de entrada: a posio de incio do trecho e o seu comprimento.
Exemplo:
Listar os dez primeiros caracteres dos ttulos dos livros:
SELECT SUBSTRING(TITULO, 1, 10) AS TRECHO
FROM LIVRO

215

LENGTH retorna o comprimento da cadeia de caracteres que recebe como parmetro. Retornar nulo, caso
receba NULL como parmetro. Exemplo:
SELECT LENGTH(TITULO) AS COMPRIMENTO
FROM LIVRO
WHERE ASSUNTO = R
Datas
A formatao de campos relacionados a datas e horrios uma das que apresenta o maior nmero de
variaes entre as implementaes dos SGBDs padres para SQL. Dentre as funes mais utilizadas, temos as
funes DAY, MONTH e YEAR. Estas funes recebem uma data como parmetro e retornam o dia, o ms e o ano
da data, respectivamente. Exemplo:
Selecionar o dia da publicao do livro de cdigo 1
SELECT DAY(LANCAMENTO) AS DIAS
FROM LIVRO
WHERE CODIGO = 1
Selecionar o ms e o ano da publicao dos livros cujo assunto R:
SELECT MONTH(LANCAMENTO) AS MS,
YEAR(LANCAMENTO) AS ANO
FROM LIVRO
WHERE ASSUNTO = R
Nmeros
A linguagem SQL e os SGBDs oferecem vrias funes predefinidas para a manipulao de nmeros.
Na tabela 5.1 so apresentadas as principais funes matemticas definidas pela SQL. A maioria das funes
da tabela 5.1 recebe apenas um parmetro de entrada numrico e retorna um nmero.

Tambm so comuns implementaes de funes trigonomtricas para a SQL. Dentre as principais funes
trigonomtricas, temos as apresentadas na tabela 5.2:

216

A utilizao das funes algbricas e trigonomtricas apresentadas semelhante das funes de cadeias de
caracteres apresentadas anteriormente. Veja o exemplo para a funo CEIL:
SELECT CEIL(PRECO)
FROM LIVRO
WHERE CODIGO = 3
Eliminando repeties
Quando utilizamos consultas sobre tabelas, podemos obter linhas repetidas. Para eliminar repeties, em
relaes resultantes de consultas, foi definido o predicado DISTINCT. Este predicado poder ser utilizado
isoladamente na clusula SELECT ou em conjunto com outras funes SQL.
Para eliminar resultados distintos de uma consulta, basta posicionar o predicado DISTINCT aps a clusula
SELECT e antes da especificao das colunas a serem recuperados. Vejamos um exemplo:
recuperar os assuntos distintos da tabela de livros:
SELECT DISTINCT ASUNTO AS ASSUNTO
FROM LIVRO
O predicado DISTINCT pode ainda ser utilizado com a funo COUNT, quando posicionado junto ao seu
parmetro de entrada. Neste caso, possvel contar os valores distintos de uma coluna, por exemplo.
SELECT COUNT(DISTINCT ASSUNTO)
FROM LIVRO
Ordenando os resultados
Ao realizarmos consultas SQL no sabemos, a priori, quais e em que ordem as linhas do resultado sero
apresentadas. No entanto, muitas vezes, desejamos obter os resultados ordenados por uma ou mais colunas.
Para isso, devemos utilizar a clusula ORDER BY.
A clusula ORDER BY sempre posicionada como a ltima de um comando SELECT. Vejamos um exemplo de
sintaxe:
SELECT COL1, COL2, ..., COLN
FROM NOME_TABELA
WHERE CONDICAO
GROUP BY COL1, COL2, ..., COLN
HAVING EXPRESSAO_LOGICA
ORDER BY COL1 [DESC,ASC], COL2 [DESC, ASC]
Consulta:
Gerar a listagem dos livros contendo assunto, ttulo, e preo. A listagem dever estar ordenada em ordem
crescente de assunto e decrescente de preo.
SELECT ASSUNTO, TITULO, PRECO
217

FROM LIVRO
ORDER BY ASSUNTO, PRECO DESC
Gerar listagem dos livros contendo assunto, ttulo e preo. A listagem dever estar ordenada em ordem
crescente de ttulo e descente de preo.
SELECT ASSUNTO, TITULO, PRECO
FROM LIVRO
ORDER BY 2, PRECO DESC

A SQL:2003 nos permite, ainda, utilizar funes, como SUBSTRING, na clusula ORDER BY.

218

Junes
Nos comandos apresentados anteriormente, somente uma tabela era acessada por vez. Entretanto, muitas
vezes precisamos acessar informaes de mais de uma tabela em uma mesma consulta.
Para acessar mais de uma tabela em um mesmo comando SELECT, devemos realizar operaes chamadas
junes. Existem vrios tipos de juntos, como a interna, a externa e a natural. As diferenas entre as junes se
do na forma como as tabelas da consulta so combinadas para a montagem dos resultados.
Para coletar informaes de mais de uma tabela, realizamos junes. As junes so ligaes entre tabelas,
realizadas atravs dos valores de uma ou mais colunas. Usualmente, essas ligaes ocorrem entre a chaveprimria de uma tabela e a chave estrangeira de outra.
No caso de nosso exemplo, temos que a coluna ASSUNTO da tabela LIVRO a chave estrangeira para a
coluna SIGLA, chave-primria da tabela ASSUNTO. Assim, neste caso, a ligao entre as informaes de uma
tabela com a outra se dar atravs das colunas ASSUNTO e SIGLA.
A juno entre tabelas faz com que seja gerada uma relao resultante contendo todas as colunas das
tabelas originais. Para a juno entre as tabelas anteriores ser gerada uma relao contendo as colunas CODIGO,
TITULO, PRECO, LANCAMENTO, ASSUNTO, EDITORA, SIGLA e DESCRICAO. Essa relao ser gerada somente para
a execuo da consulta e sobre ela podero ser aplicadas as operaes apresentadas anteriormente. As linhas
que participaro da relao resultante sero escolhidos com base no tipo de juno que est sendo realizada e
com o predicado de juno.
Juno Interna
A juno interna entre tabelas a modalidade de juno que faz com que somente participarem da relao
resultante as linhas das tabelas de origem que atenderem clusula de juno. A sintaxe bsica para a realizao
da juno interna :
SELECT COL1, COL2, ..., COLN, FUNCAO1, ..., FUNCAON
FROM NOME_TABELA
INNER JOIN NOME_TABELA2
ON NOME_TABELA.COL1 = NOME_TABELA2.COL1
WHERE CONDICAO
GROUP BY COL1, COL2, ..., COLN
HAVING EXPRESSAO_LOGICA
ORDER BY COL1, COL2, , COLN
Por exemplo:
Quais os ttulos dos livros j lanados e a descrio dos seus assuntos?
SELECT TITULO, DESCRICAO
FROM LIVRO
INNER JOIN ASSUNTO
ON SIGLA = ASSUNTO
WHERE LANCAMENTO IS NOT NULL
No exemplo anterior, nem todas as linhas da tabela ASSUNTO (cuja instncia est representada na tabela 3.2)
fazem parte do resultado da consulta. Isto ocorre porque estamos utilizando uma juno interna, onde somente
participam do resultado as linhas nas quais os valores das colunas de juno possuem correspondente em ambas
as tabelas. As junes externas, apresentadas a seguir, permitiro que linhas onde no existam valores
correspondentes em ambas as tabelas participam.
Os primeiros SGBDs possuram a clusula INNER JOIN. Mas as junes internas j eram utilizadas. Para tal, as
tabelas eram listadas na clusula FROM, separadas por virgulas, e as condies de juno eram descritas na

219

clusula WHERE. Nesta construo, as condies de juno so listadas juntamente com as condies de seleo.
Veja o exemplo da juno interna sem a clusula INNER JOIN:
SELECT TITULO, DESCRICAO
FROM LIVRO, ASSUNTO
WHERE ASSUNTO = SIGLA
AND LANCAMENTO IS NOT NULL
Em consultas complexas formuladas dessa forma, comum que alguma importante condio seja esquecida.
Embora bastante difundidas, aconselhvel que construes deste tipo sejam substitudas pela sintaxe contendo
a clusula INNER JOIN.
Suponha que, agora, busquemos gerar uma listagem contendo o ttulo do livro, o nome da editora que o
publicou e a descrio do assunto de que trata. Para isso, teremos que utilizar o acesso a trs tabelas. Por
exemplo:
SELECT TITULO, NOME, DESCRICAO
FROM LIVRO
INNER JOIN EDITORA E
ON EDITORA = E.CONTEUDO
INNER JOIN ASSUNTO
ON ASSUNTO = SIGLA
Em consultas onde ocorrem junes, todas as clusulas apresentadas anteriormente como (WHERE, GROUP
BY, HAVING e ORDER BY) continuam vlidas. Por exemplo:
Montar a listagem das editoras e dos ttulos dos livros que lanaram, ordenada pelo nome da editora e, em
seguida, pelo ttulo do livro. Apresentar somente os livros j lanados.
Consulta:
SELECT NOME, TITULO
FROM EDITORA E
INNER JOIN LIVRO
ON EDITORA = E.CODIGO
WHERE LANCAMENTO IS NOT NULL
ORDER BY NOME, TITULO
Junes Externas
Nas consultas onde se realizam junes internas, somente participam dos resultados as linhas cujas colunas
de juno possuem os mesmos valores em ambas as tabelas participantes da juno.
Nesta seo, sero apresentadas trs formas de executar a juno externa, modalidade de juno onde a no
inexistncia de valores correspondentes no limita a participao de linhas no resultado de uma consulta.
Juno externa esquerda
Suponha que desejamos obter uma listagem de todas as editoras cadastradas em nosso banco de dados e,
para aquelas que possuam livros publicados, o nome dos mesmos. Vamos ter que utilizar uma juno externa. Eis
a sintaxe da juno externa esquerda:
SELECT COL1, COL2, ..., COLN, FUNCAO1, FUNCAO2
FROM NOME_TABELA
LEFT OUTER JOIN NOME_TABELA2
ON NOME_TABELA.COL1 = NOME_TABELA2. COL1
WHERE CONDICAO
GROUP BY COL1, COL2, ..., COLN
HAVING EXPRESSAO_LOGICA
220

ORDER BY COL1, COL2, , COLN


A nica diferena para sintaxe da juno interna a substituio do termo INNER JOIN pelo termo LEFT
OUTER JOIN, indicador da juno externa esquerda.
Em uma juno externa esquerda, a juno ocorre de forma que todas as linhas pertencentes tabela
posicionada esquerda do termo LEFT OUTER JOIN no comando e que atendem aos critrios definidos na
clusula WHERE faro parte do resultado, independente se existem valores correspondentes na coluna de juno
da tabela posicionada direita do comando. Caso no existam valores correspondentes na tabela direita, as
colunas selecionadas desta tabela, nas linhas onde no existe correspondncia, tero valor NULL.
Montando a listagem de todas as editoras cadastradas em nossa base de dados e, para aquelas que possuam
livros publicados, relacionar, tambm, o ttulo dos mesmos. Vamos ordenar os resultados pelo nome da editora e
pelo ttulo do livro.
SELECT NOME, TITULO
FROM EDITORA E
LEFT OUTER JOIN LIVRO
ON EDITORA = E.CODIGO
ORDER BY NOME, TITULO
Outro exemplo: Mostrar a listagem completa de assuntos contendo, tambm, os ttulos dos livros e seus
respectivos assuntos. Resultados ordenados pela descrio do assunto.
Consulta:
SELECT DESCRICAO, TITULO
FROM ASSUNTO
LEFT OUTER JOIN LIVRO
ON SIGLA = ASSUNTO
ORDER BY DESCRICAO
Juno externa Direita
A juno externa direita extremamente parecida com a juno externa esquerda. A nica diferena
consta no fato de que a tabela da qual todas as linhas constaro do resultado est posicionada direita do termo
RIGHT OUTER JOIN no comando. Sua sintaxe :
SELECT COL1, COL2, ..., COLN, FUNCAO1, ..., FUNCAON
FROM NOME_TABELA
RIGHT OUTER JOIN NOME_TABELA2
ON NOME_TABELA.COL1 = NOME_TABELA2.COL1
WHERE CONDICAO
GROUP BY COL1, COL2, ..., COLN
HAVING EXPRESSAO_LOGICA
ORDER BY COL1, COL2, , COLN
Onde, a nica diferena em termos de sintaxe para a juno externa esquerda a substituio do termo
LEFT OUTER JOIN pelo termo RIGHT OUTER JOIN, indicador da juno externa direita.
Se reescrevermos a consulta do exemplo anterior de forma a obtermos o mesmo resultado e com a utilizao
da juno externa direita, teremos a seguinte consulta:
SELECT DESCRICAO, TITULO
FROM LIVRO
RIGHT OUTER JOIN ASSUNTO
ON SIGLA = ASSUNTO
221

ORDER BY DESCRICAO
Note que para que as consultas sejam equivalentes, temos que inverter a ordem das tabelas na clusula
FROM.
Juno Externa Completa
Podemos ainda querer montar as listagem de todas as linhas das tabelas participantes que atendam aos
critrios de seleo especificados na clusula WHERE participem do resultado, independente da correspondncia
de valores da clusula de juno. A clusula de juno atua de forma a montar a relao quando existir
correspondncia entre valores. Quando no existir, as colunas da tabela onde inexiste o valor devem apresentar o
valor nulo. Esta a juno externa completa.
A diferena da juno externa para as junes direita e esquerda se d no fato de que, naquelas, uma das
tabelas somente apresentava os valores com correspondncia outra, a qual apresentava todos os seus valores.
Na juno externa completa, as duas tabelas podero apresentar valores sem correspondentes. A sintaxe :
SELECT COL1, COL2, ..., COLN, FUNCAO1, ..., FUNCAON
FROM NOME_TABELA
FULL OUTER JOIN NOME_TABELA2
ON NOME_TABELA.COL1 = NOME_TABELA2.COL1
WHERE CONDICAO
GROUP BY COL1, COL2, ..., COLN
HAVING EXPRESSAO_LOGICA
ORDER BY COL1, COL2, , COLN
Onde a nica diferena para a sintaxe da juno externa esquerda a substituio do termo FULL OUTER
JOIN, em detrimento de LEFT OUTER JOIN e RIGHT OUTER JOIN, respectivamente.
Consideremos agora, a tabela de editoras, cujo exemplo apresentado na tabela 2.6, e a tabela de livros,
onde foram adicionados mais livros, ainda sem data prevista para o lanamento, sem editora definida e sem
preo. A nossa nova tabela de livros apresentada na tabela 6.1. Vejamos, ento um exemplo para a realizao
da juno externa completa.

Listagem com a exibio de todos os ttulos e de todas as editoras, relacionando a obra com a editora que a
publica, quando caso. A listagem dever estar ordenada pelo ttulo da obra.
Consulta:
SELECT TITULO, NOME
FROM LIVRO
FULL OUTER JOIN EDITORA
ON EDITORA.CODIGO = EDITORA
ORDER BY TITULO
Juno Cruzada
222

Algumas vezes queremos gerar todas as combinaes possveis entre elementos de duas tabelas. uma
operao idntica a um produto cartesiano dos elementos das tabelas. Para isso, podemos utilizar um tipo de
juno conhecida como CROSS JOIN. Sua sintaxe :
SELECT COL1, COL2, ..., COLN, FUNCAO1, , FUNCAON
FROM NOME_TABELA
CROSS JOIN NOME_TABELA2
WHERE CONDICAO
GROUP BY COL1, COL2, , COLN
HAVING EXPRESSAO_LOGICA
ORDER BY COL1, COL2, , COLN
Suponha um torneio onde selees so divididas em dois grupos, A e B, e onde todos os membros do grupo A
jogam contra todos os membros do grupo B. A tabela 6.2 representa as selees do Grupo A, euqunato a tabela
6.3, as do grupo B.

Consulta:
SELECT A.NOME AS TIME_A, B.NOME AS TIME_B
FROM GRUPO_A A CROSS JOIN GRUPO_B B
Resultado:

Juno Natural e Baseada em Nomes de Colunas


Anteriormente foram apresentadas as junes internas e externas. Agora vamos verificar a juno natural e a
juno baseada em nomes de colunas. Ambas so construes que podem ser aplicadas em conjunto com as
modalidades apresentadas anteriromente para substituir a utilizao da clusula ON.

223

Na verdade, como, em alguns casos, as tabelas sobre as quais queremos realizar a juno apresentam
colunas de mesmo nome e para que, nesses asos, no seja necessrio explicitar o nome das colunas, definida a
juno natural. Nesta modalidade de juno, todas as colunas de mesmo nome nas tabelas em questo
participam da condio de juno.
Para utilizar a juno natural, basta incluir a palavra reservada NATURAL antes das palavras INNER, LEFT,
OUTER ou FULL, de acordo com a situao. Ento, no ser necessrio utilizar a clusula ON.
Entretanto, realizar automaticamente a juno por todas as colunas de mesmo nome pode ser um problema.
Frequentemente encontramos tabelas com colunas de nomes intituladas nome e descrio. No entanto, no
comum realizar junes por tais colunas.
Para solucionar essa questo, foi elaborada a juno baseada em nomes de colunas. Assim, como no caso da
juno natural, neste caso, as colunas de mesmo nome nas diferentes tabelas sero utilizadas para a juno.
Entretanto, agora, as colunas no sero utilizadas automaticamente. Ser necessrio especificar quais colunas
sero utilizadas.
A sintaxe da juno baseada em nomes de coluna :
SELECT COL1, COL2, ..., COLN
FROM NOME_TABELA
[INNER, LEFT OUTER, RIGHT OUTER,
FULL OUTER] JOIN NAME_TABELA2
USING [NOME_COLUNA]
A principal diferena entre a juno natural e a baseada em nomes de colunas se d no fato de que, na
juno natural, todas as colunas de mesmo nome nas tabelas sero utilizadas para realizar a juno, enquanto a
juno baseada em nomes de colunas, somente sero utilizadas as colunas que forem listadas.
Formatando a Sada e as junes externas
Quando utilizamos as funes externas, podemos obter vrios valores nulos em uma ou mais coluna do
resultado. A funo COALESCE nos permite substituir os valores nulos por outros que desejamos. Ela recebe uma
lista de parmetros e retorna o primeiro que possuir um valor no-nulo. Frequentemente, exigido que todos os
parmetros sejam do mesmo tipo de dados.
Por exemplo:
Obter uma listagem com a descrio de todos os assuntos e os ttulos dos livros de cada um. Quando no
existir um assunto associado, deve ser escrita a frase SEM PUBLICAES.
Consulta:
SELECT DESCRICAO, COALESCE(TITULO, SEM PUBLICAES) AS TITULO
FROM ASSUNTO
LEFT OUTER JOIN LIVRO
ON SIGLA = ASSUNTO
ORDER BY DESCRICAO

224

Combinando Comandos
Todos os commandos de consulta da linguagem SQL atuam sobre uma relao, que pode ou no estar
materializada em formato de uma tabela. O resultado dos comandos de seleo tambm uma relao. Tanto as
relaes de entrada quanto as relaes de sada podem possuir diversos nmeros de colunas e linhas.
Este tipo de construo permite que utilizemos consultas embutidas na clusula FROM de uma consulta,
fazendo com que a sada de um comando SELECT seja utilizada como entrada para outro comando SELECT. Outras
formas de combinarmos os dois ou mais comandos SELECT para obter um nico resultado final so subconsultas
da clusula WHERE, correlacionadas ou no, e as operaes baseadas nas operaes de conjunto.
Subconsultas da clusula WHERE
A utilizao de subconsultas na clusula WHERE uma das formas de combinao de duas ou mais consultas
para um nico resultado final. Nestas construes, o resultado da subconsulta no apresentado ao usurio,
sendo construdo de forma temporria pelo SGBD, o qual utiliza os resultados temporrios em testes das
consultas mais externas. Existem dois tipos de subconsultas: correlacionadas e no-correlacionadas.
Subconsultas no-correlacionadas
Com a utilizao do predicado IN era possvel comparar o valor de uma coluna com uma lista de valores. Na
subconsulta no-correlacionada, substitumos a lista de valores do predicado IN por uma consulta.
A sintaxe bsica do comando para utilizao da subconsulta no-correlacionada :
SELECT COL1, COL2, ..., COLN
FROM NOME_TABELA
WHERE COLM [NOT] IN (SELECT COLX FROM NOME_TABELA2)
Note que, esquerda do predicado [NOT] IN continua posicionada uma coluna (a utilizao do operador NOT
opcional). A consulta interna ao predicado IN (aquela que substitui a lista de valores), no tem nenhuma ligao
com a consulta externa. Ambas as consultas podero possuir todas as construes apresentadas anteriormente,
sem nenhuma restrio adicional devido presena da subconsulta. A consulta interna dever, no entanto,
retornar uma coluna apenas.
Exemplos:
Considerando a base de dados de publicaes composta pelas tabelas ASSUNTO, LIVRO e EDITORA, conforme
anteriormente. Desejamos saber os nomes das editoras que possuem livros j lanados.
Consulta:
SELECT NOME
FROM EDITORA
WHERE CODIGO IN ( SELECT EDITORA
FROM LIVRO
WHERE LANCAMENTO IS NOT NULL)
Neste exemplo, a subconsulta gera uma relao temporria de uma nica coluna (no exibida ao usurio em
nenhum momento) contendo os cdigos de editoras que publicaram livros que j foram lanados. A consulta
externa procurar por nomes de editoras para as quais o cdigo consta na relao produzida para subconsulta.
Desejamos saber quais assuntos no foram lanados livros.
SELECT DESCRICAO
FROM ASSUNTO
WHERE SIGLA NOT IN (SELECT ASSUNTO FROM LIVRO WHERE LANCAMENTO IS NOT NULL)
Neste exemplo, a subconsulta gera uma listagem de assuntos dos livros que j foram lanados. A consulta
externa procurar, na tabela de assuntos, quais assuntos no constam na listagem gerada pela subconsulta.

225

Tambm podemos utilizar subconsultas combinadas com operaes de atualizao e excluso de dados. Por
exemplo:
Desejamos excluir as editoras que no publicaram os livros. O comando para tal operao :
DELETE FROM EDITORA
WHERE CODIGO NOT IN (SELECT EDITORA FROM LIVRO)
Subconsultas Correlacionadas
possivel utilizar o predicado IN em conjunto com um commando SQL em uma construo chamada de nocorrelacionada. Agora, veremos outro tipo de construo, chamado de subconsulta no-correlacionada. Agora,
veremos outro tipo de construo, chamada de subconsulta correlacionada, pois, neste caso, a subconsulta
possui dependncia direta da consulta externa.
Na subconsulta correlacionada utilizaremos o predicado EXISTS. O predicado IN permitia testar se valores de
uma coluna constavam em uma listagem de valores. O predicado EXISTS testa se uma condio verdadeira ou
falsa. Vejamos exemplo da sintaxe para sua utilizao:
SELECT COL1, COL2, ..., COLN
FROM NOME_TABELA TAB_EXTERNA
WHERE [NOT] EXISTS
(SELECT COLX
FROM NOME_TABELA2 TAB_EXTERNA
WHERE TAB_EXTERNA.COLA = TAB_INTERNA.COLA)
Na subconsulta do exemplo anterior, existe uma comparao entre uma coluna da tabela externa com uma
coluna da tabela interna (em negrito). Este tipo de teste possvel em subconsultas, onde a consulta mais interna
poder acessar uma coluna da coluna mais externa, usualmente utilizando o apelido (ou correlation name) da
tabela mencionada da coluna mais externa, usualmente utilizando o apelido da tabela mencionada da consulta
mais externa.
Esse comando comea a ser executado pela consulta mais externa. Ento, para cada linha de NOME_TABELA,
a subconsulta ser executada, substituindo-se o valor de TAB_EXTERNA.COLA por seu valor na linha em questo.
Se a subconsulta retornar algum valor a clusula EXISTS ser verdadeira e a linha recuperada na consulta mais
externa far parte do resultado final. Em caso contrrio, a consulta mais externa realiza o teste para a prxima
linha de TAB_EXTERNA.COLA.
Note que, na utilizao do predicado EXISTS, no posicionada nenhuma coluna esquerda do mesmo, pois
ele no compara valores, e, sim, testa uma condio booleana. Assim, a coluna posicionada na clusula SELECT da
subconsulta no influenciar no resultado do comando.
Devido existncia, na subconsulta, da utilizao de uma coluna da consulta mais externa em uma
comparao, esta construo chamada de consulta correlacionada.
Vejamos os exemplos anteriores reescritos para o formato de subconsultas correlacionadas:
Desejamos saber os nomes das editoras que possuem livros lanados.
SELECT NOME
FROM EDITORA ED
WHERE EXISTS (SELECT EDITORA
FROM LIVRO
WHERE LANCAMENTO IS NOT NULL
AND ED.CODIGO = EDITORA)
Desejamos saber sobre quais assuntos nao foram lanados livros.
SELECT DESCRICAO
FROM ASSUNTO ASS
WHERE NOT EXISTS (SELECT ASSUNTO
226

FROM LIVRO
WHERE LANCAMENTO IS NOT NULL
AND ASS.SIGLA = ASSUNTO)
Assim como no caso do predicado IN, poderemos utilizar EXISTS em commandos de atualizao e excluso de
dados. Vejamos a reescrita do comando para excluso das editoras que no possuem livros associados, com a
utilizao de EXISTS:
DELETE FROM EDITORA E
WHERE NOT EXISTS (
SELECT 1 FROM LIVRO WHERE EDITORA = E.CODIGO)
Subconsultas substituindo valores
Em uma consulta, para cada linha da relao resultante temos, em uma dada coluna, uma pequena relao
de uma linha e uma coluna que pode ser substituda por um comando SELECT que retorne apenas uma linha e
uma coluna. Tal comando SELECT pode ser formador tanto de uma consulta correlacionada quanto de uma
consulta no-correlacionada.
Considere que desejamos montar uma relao que contenha em uma coluna a descrio dos assuntos
existentes e, em outra, a quantidade de livros lanados de cada assunto.
Para obter a coluna ASSUNTOS basta realizar uma seleo sobre a coluna DESCRIO da tabela de assuntos e
utilizar o apelido ASSUNTOS para a coluna. Para obter a coluna LIVROS_LANCADOS devemos contar, para cada
assunto, quantos livros j lanados existem na tabela de livros do assunto em questo. O comando que monta o
resultado anterior o seguinte:
SELECT DESCRICAO AS ASSUNTOS,
(SELECT COUNT(*)
FROM LIVRO L
WHERE L.ASSUNTO = A.SIGLA
AND LANCAMENTO IS NOT NULL
) AS LIVROS_LANCADOS
FROM ASSUNTO A
Note que, no comando anterior, foi utilizada uma subconsulta correlacionada substituindo um valor em um
comando SELECT e, para a qual, foi dado um apelido (LIVROS_LANCADOS). A subconsulta utilizada possui
somente uma coluna onde foi usada a funo COUNT que retorna somente uma linha, de forma a atender ao
requisito apresentado anteriormente. Como a correlao desta com a tabela externa (L.ASSUNTO = A.SIGLA) faz
com que a contagem de livros seja feita para o assunto adequado.
Outro exemplo:
Listar o nome das editoras e o preo mdio das publicaes de cada uma.
SELECT NOME,
(SELECT AVG(PRECO)
FROM LIVRO V
WHERE V.EDITORA = E.CODIGO
AND LANCAMENTO IS NOT NULL) AS PRECO_MEDIO
FROM EDITORA E
ORDER BY NOME
Poderemos utilizar subconsultas que retornem uma relao de uma linha e uma coluna em vrios comandos
e locais como, por exemplo, substituindo o valor no comando UPDATE TABELA SET COLUNA = VALOR.

227

Tabelas aninhadas
Uma tabela a materializao de uma relao. Quando realizamos uma consulta e posicionamos uma tabela
na clusula FROM, estamos fazendo uma consulta sobre uma relao. Logo, podemos substituir uma tabela por
uma subconsulta que retorne uma relao. A esta construo chamamos de tabelas aninhadas.
Para utilizarmos o resultado de uma consulta como uma tabela, devemos posicionar a consulta delimitada
por parnteses em local destinado a uma tabela. Para que possamos acessar as colunas do resultado da
subconsulta como se acessssemos as colunas de uma tabela, pode ser necessrio atribuir um apelido para a
subconsulta. Vejamos um exemplo de sintaxe para a juno entre uma tabela aninhada e uma tabela:
SELECT COL1, COL2, COLN, COLX, COLY, COLZ
FROM
(SELECT COLX, COLY, COLZ FROM TAB_INTERNA) TAB_CONSULTA
INNER JOIN TAB_EXTERNA
ON TAB_CONSULTA.COLX = TAB_EXTERNA.COL1
Notamos que a expresso TAB_CONSULTA.COLX representa o acesso coluna COLX do resultado da
subconsulta. Qualquer coluna da tabela aninhada poder ser acessada como uma coluna de uma tabela.
Listar o nome das editoras e as publicaes das editoras que lanaram ao menos dois livros, ordenados
por nome da editora e pelo ttulo da publicao.
SELECT NOME, TITULO
FROM
(SELECT EDITORA, COUNT(*) AS QUANTIDADE
FROM LIVRO V
WHERE LANCAMENTO IS NOT NULL
GROUP BY EDITORA) EDITORA_QUANT
INNER JOIN LIVRO
ON EDITORA_QUANT.EDITORA = LIVRO.EDITORA
INNER JOIN EDITORA
ON EDITORA_QUANT.EDITORA = EDITORA.CODIGO
WHERE QUANTIDADE >= 2
ORDER BY NOME
Essa relao, que no exibida ao usurio, utilizada exatamente como uma tabela e referenciada pelo
nome EDITORA_QUANT.
Listar os ttulos dos livros dos assuntos para os quais o preo mdio das publicaes superior a R$ 40,00,
juntamente com os respectivos assuntos.
SELECT TITULO, DESCRICAO AS ASSUNTO
FROM ( SELECT ASSUNTO, AVG(PRECO) AS PRECO_MEDIO
FROM LIVRO V
GROUP BY SIGLA
HAVING AVG(PRECO) > 40) ASSUNTO_PRECO
INNER JOIN LIVRO
ON ASSUNTO_PRECO.ASSUNTO = LIVRO.ASSUNTO
INNNER JOIN ASSUNTO
ON ASSUNTO_PRECO.ASSUNTO = ASSUNTO.SIGLA
Operaes de Conjunto
Podemos realizar as operaes tradicionais sobre conjuntos: unio, interseo, e diferena.
Unio
228

Quando realizamos junes entre tabelas, formamos uma relao resultante com as colunas que contm as
colunas das tabelas originais. Por outro lado, podemos querer realizar um comando SQL que apresente, como
resultado, todas as linhas que foram recuperadas por outros dois comandos SQL realizados em separado. Para
unir as linhas resultantes de duas ou mais consultas, utilizamos o predicado UNION.
O predicado UNION utilizado posicionado entre dois comandos de consulta, da seguinte forma:
SELECT COL1, COL2
FROM TABELA1
UNION [ALL]
SELECT COL3, COL4
FROM TABELA2
Observamos que os comandos podero acessar tabelas diferentes e utilizar as mais diversas construes da
linguagem. Existem, somente, duas regras para utilizao do UNION: (i) os comandos devem retornar o mesmo
nmero de colunas e (ii) as colunas correspondentes em cada comando devem possuir os mesmo tipos de dados.
O UNION ir atuar fazendo com que o resultado das consultas participante seja combinado com o resultado
final. Quando utilizamos o UNION isoladamente, no resultado final no constaro linhas repetidas. Se desejarmos
que linhas repetidas apaream, devemos utilizar o predicado ALL logo aps UNION, conforme mostrado antes.
* Listar os ttulos dos livros que cujo assunto Banco de Dados ou que foram lanados por editoras que
contenham Mirandela no nome.
SELECT TITULO
FROM LIVRO
INNER JOIN ASSUNTO
ON ASSUNTO = SIGLA
WHERE DESCRICAO = BANCO DE DADOS
UNION [ALL]
SELECT TITULO
FROM LIVRO
INNER JOIN EDITORA E
ON EDITORA = E.CODIGO
WHERE NOME LIKE %MIRANDELA%
Interseo
Para obtermos a interseo entre os resultados do comando SELECT, utilizamos o comando INTERSECT.
O INTERSECT utilizado da mesma forma que o UNION, posicionado entre dois comandos SELECT, e atende
s mesmas regras: (i) os comandos devem retornar o mesmo nmero de colunas e (ii) as colunas correspondentes
em cada comando devem possuir os mesmos tipos de dados. Ento, o INTERSECT retornar as linhas que estejam
presente nos resultados de todas as consultas participantes.
Da mesma forma que o UNION, o INTERSECT utilizado isoladamente eliminar as linhas repetidas. Para que
as linhas repetidas constem no resultado final, o predicado ALL deve ser utilizado.
Listar os ttulos dos livros cujo assunto Programao e que foram lanados por uma editora que
contenha a palavra Mirandela no nome, sem repeties.
SELECT TITULO
FROM LIVRO
INNER JOIN ASSUNTO
ON ASSUNTO = SIGLA
WHERE DESCRICAO = PROGRAMACAO
INTERSECT
SELECT TITULO
FROM LIVRO
229

INNER JOIN EDITORA E


ON EDITORA = E.CODIGO
WHERE NOME LIKE %MIRANDELA%
Diferena
Tambm possvel realizar a diferena entre os resultados de comandos SELECT. Neste caso, o predicado
utilizado o EXCEPT.
O EXCEPT ser utilizado da mesma forma que o UNION e o INTERSECT (entre os comandos SELECT). Estar
sujeito s mesmas duas regras apresentadas nos casos anteriores sobre o nmero de colunas e os tipos de dados
das mesmas. Isoladamente, ele no permite linhas repetidas no resultado final. Da mesma forma que o UNION e
o INTERSECT, ele pode ser utilizado em conjunto com o predicado ALL.
Exemplo: Listar os ttulos dos livros cujo assunto Banco de Dados e que no foram lanados por uma editora
que contenha a palavra Mirandela no nome.
SELECT TITULO
FROM LIVRO
INNER JOIN ASSUNTO
ON ASSUNTO = SIGLA
WHERE DESCRICAO = BANCO DE DADOS
EXCEPT
SELECT TITULO
FROM LIVRO
INNER JOIN EDITORA E
ON EDITORA = E.CODIGO
WHERE NOME LIKE MIRANDELA
Como o EXCEPT realiza a diferena entre conjuntos, a ordem de declarao das consultas com relao ao
predicado EXCEPT altera o resultado final, diferentemente do que acontece com os predicados UNION e
INTERSECT.
Listar o ttulo dos livros que foram lanados por editora que contenham a palavra Mirandela em seu
nome e cujo assunto no Banco de Dados.
SELECT TITULO
FROM LIVRO
INNER JOIN EDITORA E
ON EDITORA = E.CODIGO
WHERE NOME LIKE %MIRANDELA%
EXCEPT
SELECT TITULO
FROM LIVRO
INNER JOIN ASSUNTO
ON ASSUNTO = SIGLA
WHERE DESCRICAO = BANCO DE DADOS
Comandos e Estruturas Avanadas
A seguir sero apresentadas construes da SQL:2003 que permitem a realizao de consultas bastante
poderosas, como as consultas recursivas, ou de grande utilidade, como o predicado CASE e os comandos para
criao e excluso de vises. Tambm apresentado o comando MERGE, para incluso e atualizao de
informaes em tabelas.
Vises e Vises Temporrias
230

Muitas vezes gostaramos de utilizar os dados contidos em nosso banco de dados como se estivessem em um
formato diferente daquele em que realmente esto.
Consideremos uma situao em que queremos constantemente queremos consultar o ttulo de um livro, seu
preo, o nome da editora que o publica e a descrio do assunto do livro. Estas informaes esto contidas em
nosso banco de dados, mas espalhada em trs tabelas. Para uni-las devemos realizar o comando SELECT com
junes entre as tabelas. Entretanto, como a consulta realizada constantemente, gostaramos de ter uma
diferente viso de nosso banco de dados: gostaramos de ter uma viso onde as informaes j aparecessem
unidas. A linguagem SQL nos permite isso atravs da criao de um objeto chamado viso.
Vises so tabelas artificiais cujo contedo provm de tabelas reais. Os dados que as compem so definidos
atravs de comandos SELECT realizados sobre tabelas dos bancos de dados. Na verdade, os dados continuam
armazenados na tabela original. Cada vez que realizamos uma consulta sobre a viso, o SGBD se encarrega de
coletar os dados nas tabelas de origem, a partir do comando SELECT que definem a viso como se ela fosse uma
tabela.
Para criamos vises, utilizamos o comando CREATE VIEW, cuja estrutura bsica apresentada a seguir.
CREATE VIEW NOME_VISO
AS COMANDO DE CONSULTA
Vejamos, a seguir o comando para criao da viso que contm o ttulo dos livros, seus preos, o nome da
editora que os publica e a descrio de seus assuntos.
CREATE VIEW LIVRO_EDITORA_ASSUNTO
AS
SELECT TITULO, PRECO, NOME AS EDITORA,
DESCRICAO AS ASSUNTO
FROM LIVRO
INNER JOIN EDITORA ED
ON EDITORA = ED.CODIGO
INNER JOIN ASSUNTO
ON ASSUNTO.SIGLA = LIVRO.ASSUNTO
Agora, poderemos consultar a viso como se consultssemos uma tabela de nosso banco de dados. Como
exemplo, vamos apresentar o comando para obtermos o ttulo, o nome da editora, e a descrio do assunto dos
livros que possuem preo superior a R$ 45,00. Queremos a listagem ordenada por ttulo do livro.
SELECT TITULO, EDITORA, ASSUNTO
FROM LIVRO_EDITORA_ASSUNTO
WHERE PRECO > 45
ORDER BY TITULO
A definio de uma viso permanece no banco de dados, de forma que a viso pode ser acessada a qualquer
momento. Para apagarmos uma viso, utilizamos o comando DROP VIEW, seguido do nome da viso. A seguir,
como exemplo, temos o comando para excluso da viso
LIVRO_EDITORA_ASSUNTO
DROP VIEW LIVRO_EDITORA_ASSUNTO
Na excluso da viso, somente sua definio excluda. Os dados permanecem nas tabelas originais.
Por outro lado, podemos querer criar uma viso para ser utilizada em um comando somente, sem que sua
definio fique armazenada no banco de dados. Para isto, utilizamos o comando WITH. Uma estrutura simples
para o comando WITH apresentada a seguir.
WITH NOME_VISO_TEMPORRIA [(NOME_COLUNAS_VISO)]
AS
(COMANDO_DEFINIO_VISO)
COMANDO_DE_CONSULTA
231

Vamos, agora, como exemplo, utilizar o mesmo comando que colocou a viso LIVRO_EDITORA_ASSUNTO na
definio de uma viso temporria. Usaremos, tambm, a mesma consulta sobre esta viso que utilizamos
anteriormente.
WITH CONSULTA_EDITORA_ASSUNTO AS (
SELECT TITULO, PRECO, NOME AS EDITORA, DESCRICAO AS ASSUNTO
FROM LIVRO
INNER JOIN EDITORA ED
ON EDITORA = ED.CODIGO
INNER JOIN ASSUNTO
ON ASSUNTO.SIGLA = LIVRO.ASSUNTO)
SELECT TITULO, EDITORA, ASSUNTO
FROM LIVRO_EDITORA_ASSUNTO
WHERE PRECO > 45
ORDER BY TITULO
Consultas recursivas
A incluso de consultas na linguagem SQL permitiu a realizao de comandos que antes deveriam ser
realizados somente atravs da utilizao de linguagens de programao.
Vamos considerar um frum de mensagens na Intenet. Neste frum, o usurio pode enviar uma mensagem
ou responder a outra enviada anteriormente. O usurio pode, inclusive, responder a uma resposta anterior. Um
exemplo dessa estrutura apresentado na figura 8.1. Notamos que essa estrutura pode ser visualizada em
formato de rvore.
Em termos de modelagem, consideremos que a mensagem seja representada por um auto-relacionamento,
conforme a figura 8.2. Todas as mensagens podero estar contidas em uma nica tabela do banco de dados, da
qual temos um exemplo na tabela 8.1. Nesta tabela, a coluna ID_MENSAGEM chave primria, identificando
univocamente cada mensagem da tabela. A coluna ASSUNTO representa o assunto da mensagem. No caso de
uma mensagem estar respondendo outra, na coluna ID_MENSAGEMPAI estar contido o identificador da
mensagem que est sendo respondida. Em caso contrrio, esta coluna estar vazia.

232

Se desejarmos obter quais as respostas para a mensagem de nmero 1, basta realizarmos uma consulta
procurando as linhas onde a coluna ID_MENSAGEMPAI possui o valor 1. Entretanto, podemos querer obter todas
as mensagens originadas a partir da pergunta de mensagem de nmero 1, ou seja, todas aquelas que esto
diretamente respondendo mensagem de nmero 1, aquelas que respondem a respostas da mensagem de
nmero 1 e assim por diante. Para obter todas essas mensagens, termos que utilizar uma consulta recursiva.
Consultas recursivas utilizam-se da clusula WITH combina com os comandos SELECT e UNION ALL.
A construo a ser utilizada semelhante apresentada anteriormente. A principal diferena reside na
construo da consulta que define a viso. Esta dever conter consultas, unidas via UNION ALL. A primeira, mais
bsica, define a semente do comando, acessando a linha a partir da qual iremos querer disparar a recurso. A
segunda conter uma segunda definio de tabela, ligada primeira, montando a clusula da recurso.
Assim, para o exemplo anterior, onde queremos obter todas as mensagens que foram originadas a partir da
mensagem de nmero 1, devemos utilizar o seguinte comando listado a seguir.
WITH JA_SELECIONADO
(ID_MENSAGEM, ASSUNTO, ID_MENSAGEM_PAI)
AS
(SELECT ID_MENSAGEM, ASSUNTO, ID_MENSAGEM_PAI
FROM MENSAGEM
WHERE ID_MENSAGEM = 1
UNION ALL
SELECT M.ID_MENSAGEM, M.ASSUNTO, M.ID_MENSAGEM_PAI
FROM JA_SELECIONADO J, MENSAGEM M
WHERE J.ID_MENSAGEM = M.ID_MENSAGEM_PAI)
SELECT * FROM JA_SELECIONADO
Note, no comando, que utilizamos a consulta
SELECT ID_MENSAGEM, ASSUNTO, ID_MENSAGEM_PAI
FROM MENSAGEM
WHERE ID_MENSAGEM = 1
233

Como semente da recurso, selecionando a primeira linha da tabela temporria J_SELECIONADO. O


comando SELECT, que se une a este, acessa as tabelas MENSAGEM e J_SELECIONADO, unindo-as pela chave
estrangeira e fazendo com que novas linhas sejam adicionadas viso temporria.
Embora as consultas recursivas tenham sido um grande avano, elas tambm criaram um novo problema a
ser tratado: o loop infinito. Assim, ao construirmos consultas recursivas, devemos estar atentos para mont-las de
forma a que tenham fim.
Predicado CASE
Algumas vezes queremos selecionar resultados diferentes em funo de uma ou mais condies. O predicado
CASE, que pode ser utilizado em conjunto com comandos SELECT, permite que realizemos tal tarefa.
Existem duas diferentes construes para o predicado CASE. A construo mais simples possui o seguinte
formato:
CASE COLUNA
WHEN VALOR THEN RESULTADO
WHEN VALOR2 THEN RESULTADO2
...
[ELSE RESULTADO_ELSE]
END
Para os livros cujo assunto B, retornar o ttulo concatenado com a expresso -MUITO INTERESSANTE.
Para aqueles cujo assunto P retornar o ttulo concatenado com a expresso -INTERESSANTE MDIO.
Para os outros retornar a expressao -SEM INTERESSE concatenada com seu ttulo. Consideremos a
Tabela 6.1 como a instncia para a tabela LIVRO.
SELECT CASE ASSUNTO
WHEN B THEN TITULO || -MUITO INTERESSANTE
WHEN P THEN TITULO || -INTERESSE MDIO
ELSE TITULO || -SEM INTERESSE
END AS IMPORTANCIA
FROM LIVRO

O segundo formato da expresso CASE permite que testes envolvendo diferentes colunas, variveis e
expresses sejam avaliados. Sua estrutura a seguinte:
CASE
WHEN EXPRESSAO_BOOLEANA THEN RESULTADO
WHEN EXPRESSAO_BOOLEANA2 THEN RESULTADO2
...
[ELSE RESULTADO_ELSE]
END
Consideremos, novamente, o exemplo de instncia para a tabela LIVRO apresentado na tabela 6.1. Para
os livros que possuem data de lanamento e o preo superior a R$ 45,00 retornar o ttulo concatenado
com a expresso -LIVRO CARO. Para aqueles que no possuem data de lanamento, mas possuem
editora, retornar o ttulo concatenado com a expresso - LANCAMENTO EM BREVE. Para aqueles que
no possuem editora, retornar o ttulo concatenado com a expressao -LIVRO BARATO.
SELECT CASE
WHEN LANCAMENTO IS NOT NULL AND PRECO > 40
THEN TITULO || LIVRO CARO
WHEN LANCAMENTO IS NOT NULL AND EDITORA IS NOT NULL
THEN TITULO || LANCAMENTO EM BREVE

234

WHEN EDITORA IS NULL


THEN TITULO || EM PREPARACAO
ELSE TITULO || LIVRO BARATO
END AS IMPORTANCIA
FROM LIVRO
CASE pode ser utilizado em consultas SELECT que tenham complexidade que desejemos. Pode, inclusive, ser
utilizado na clusula WHERE. Exemplo:
As vrias editoras esto estudando a aplicao de diferentes fatores a reajustes de preos. Queremos
saber quais os ttulos dos livros que custaro acima de R$50,00 caso a editora VIA-NORTE aplique um
reajuste de 10% nos preos de seus livros e a editora ILHAS TIJUCAS aplique um reajuste de 25%.
SELECT TITULO
FROM LIVRO
INNER JOIN EDITORA
ON EDITORA = EDITORA.CODIGO
WHERE 50 < (CASE WHEN NOME= EDITORA VIA-NORTE
THEN PRECO *1.1
WHEN NOME = EDITORA ILHAS TIJUCAS
THEN PRECO * 1.25
ELSE PRECO
END)
Comando MERGE
Suponhamos que tenhamos uma tabela de clientes. A descrio da tabela de clientes ser apresentada na
figura 8.3. Esta tabela possui vrias linhas, sendo que, algumas delas so referentes a pessoas que tambm atuam
como atores e que tambm esto cadastradas na tabela de autores.

Foi decidido que todos os autores sero


cadastrados como clientes. Para os autores que j se encontram cadastrados como clientes, deveremos atualizar
as informaes na tabela de clientes com base nos dados da tabela de autores.
Para realizar tais operaes utilizando os comandos INSERT e UPDATE, teramos que percorrer todas as linhas
da tabela de autores, verificando cada uma se o autor j est cadastrado como cliente. Caso no esteja, teramos
que realizar um comando INSERT para cadastr-lo. Caso o autor j estivesse cadastrado, teramos que fazer um
comando UPDATE, para atualizar essas informaes na tabela de clientes. Para simplificar situaes como essa,
foi criado o comando MERGE (algumas vezes conhecidos como UPSERT, devido s suas circunstncias).
MERGE faz, automaticamente, comparaes entre informaes de tabelas, inserindo as linhas que no existem e
atualizando as outras. Uma sintaxe simplificada para o comando MERGE apresentado a seguir:
MERGE INTO TABELA_DESTINO [AS APELIDO_DESTINO]
USING TABELA_ORIGEM [AS APELIDO_ORIGEM]
ON (EXPRESSAO_BOOLEANA)
WHEN MATCHED THEN OPERAO_VERDADEIRO
WHEN NOT MATCHED THEN OPERAO_FALSO
Vejamos, a seguir, como exemplo, a realizao da incluso e atualizao dos dados de autores como clientes,
conforme descrito anteriormente, atravs do comando MERGE.
MERGE INTO CLIENTE CLI
235

USING AUTOR AU
ON (AU.CPF = CLI.CPF)
WHEN MATCHED THEN
UPDATE SET CLI.NOME = AU.NOME
CLI.ENDERECO = AU.NOME,
CLI.DATA_NASCIMENTO = AU.DATA_NASCIMENTO
WHEN NOT MATCHED THEN
INSERT(CODIGO, NOME, CPF, ENDERECO, DATA_NASCIMENTO)
VALUES (AU.MATRICULA, AU.NOME, AU.CPF, AU.ENDERECO, AU.DATA_NASCIMENTO)
Transaes e Concorrncia
Uma transao formada por um conjunto de comandos SQL que so atmicos no que diz respeito sua
execuo e recuperao do banco de dados. Cada comando executado em um banco de dados faz parte de uma
transao, mesmo que unitria. As propriedades ACID (Atomicidade, Consistncia, Isolamento e Durabilidade) so
importantes propriedades em transaes. Para implement-las, os SGBDs utilizam mecanismos que podem
reduzir o nvel de concorrncia do sistema como um todo.
SGBDs so sistemas que, em situaes reais podem ser acessados por milhares de usurios
concorrentemente. So comuns situaes onde vrios usurios realizam consultas e atualizaes nos mesmos
dados. Na situao ideal, cada usurio de um banco de dados deveria executar os seus comandos como se ele
fosse o nico usurio. Esse o maior nvel de isolamento a ser obtido. Entretanto, muito baixo o nvel de
concorrncia correspondente a tal nvel de isolamento. Neste caso, usurios podero ficar aguardando por
informaes durante tempos relativamente longos, espera do trmino de outras transaes.
De forma a aumentar os nveis de concorrncia em detrimento do isolamento, a SQL define quatro nveis de
isolamento: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ e SERIAZABLE.
Iniciando, Alterando e Concluindo Transaes
Se uma transao for concluda com sucesso, as alteraes por ele realizadas no podero ser desfeitas.
Mesmo que ocorram falhas no sistema, o SGBD deve prover mecanismos para recuperao de informaes de
forma a manter o estado que as mesmas possuam quando da confirmao do trmino de uma transao.
De forma anloga, se uma transao concluda com fracasso, o SGBD deve desfazer todas as operaes de
atualizao dos dados contidas na transao em questo, retornando o banco de dados para o estado em que
estava ao incio da transao.
Iniciando uma Transao
O comando a seguir uma simplificao do comando de incio de uma transao no padro SQL:2003:
START TRANSACTION [NIVEL_DE_ISOLAMENTO]
Concluindo uma Transao
Uma transao pode ser concluda com sucesso ou com fracasso. Para concluirmos uma transao com
sucesso, utilizamos o comando:
COMMIT [WORK]
Para terminar uma transao com fracasso, ou seja, para desfazer todas as aes ocorridas durante a
transao, retornando ao seu estado inicial, utilizamos o comando:
ROLLBACK [WORK]
Por exemplo: Considere a instncia da tabela ASSUNTO representa na tabela 3.2. Considere que uma transao
foi iniciada e que os dois comandos a seguir foram executados:
236

INSERT INTO ASSUNTO (SIGLA, DESCRICAO)


VALUES (X, XML)
UPDATE ASSUNTO SET DESCRICAO = BIOINFORMATICA WHERE SIGLA = B
A nova instncia da tabela representada na tabela 9.1. No entanto, essa instncia est sendo vlida para a
transao em questo. Ento, consideremos que os comando a seguir foi realizado.
ROLLBACK
Neste caso, todas as alteraes foram desfeitas, ou seja, a tabela ASSUNTO voltou a ter o contedo da tabela
3.2.
Se, ao invs de desfazermos as alteraes, quisssemos mant-las, tomando a instncia representada pela
tabela 9.1 definitiva, bastaria realizar o comando COMMIT ao invs do comando ROLLBACK.
Inserindo figura da pgina 8.1
Marcando pontos de retorno
A SQL permitem que sejam definidos marcadores durante uma transao chamados de pontos de
salvamento (SAVEPOINT). A transao pode, ento, ser desfeita at um ponto de salvamento, tornando sem
efeito os comandos que foram executados aps o mesmo.
Os pontos de salvamento somente so validos dentro de transaes que foram definidos. No possvel
retornar um ponto de salvamento aps a concluso da transao, quer seja com sucesso ou com fracasso.
Um ponto de salvamento pode ser definido atravs do comando:
SAVEPOINT IDENTIFICADOR_DO_SAVEPOINT
Para retornar a um ponto de salvamento, devemos utilizar o comando ROLLBACK em conjunto com a clusula
TO SAVEPOINT, conforme mostrado a seguir:
ROLLBACK [WORK] TO SAVEPOINT IDENTIFICADOR_DO_SAVEPOINT
Consideremos a instncia da tabela ASSUNTO representada na tabela 3.2. Considere que uma transao
foi iniciada e que os trs comandos a seguir foram executados.
INSERT INTO ASSUNTO (SIGLA, DESCRICAO)
VALUES (X, XML)

SAVEPOINT PONTO1
UPDATE ASSUNTO SET DESCRICAO = BIOINFORMATICA
WHERE SIGLA = B
A nova instncia da tabela est representada na tabela 9.1. Ento, consideremos que o comando a seguir foi
realizado:
ROLLBACK TO SAVEPOINT PONTO1
Neste caso, o comando UPDATE foi desfeito. O contedo temporrio da tabela ASSUNTO est representado
na tabela 9.2, mas a transao continua ativa. Neste caso, novos comandos podem ser realizados antes da
finalizao da transao. Se, neste ponto, o comando COMMIT for executado, a tabela ASSUNTO ser confirmada
com contedo idntico ao da tabela 9.2. Se um comando ROLLBACK for executado, contedo da tabela ASSUNTO
voltar a ser da tabela 3.2.

237

Para destruir um ponto de salvamento, devemos utilizar o comando:


Concorrncia e Nveis de isolamento
Cada transao realizada em um SGBD tem um nvel de isolamento. So quatro os nveis de isolamento
definidos no padro SQL: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, e SERIAZABLE. O nvel de
isolamento mais alto, SERIAZABLE, faz com que as operaes sejam executadas como se a transao em questo
fosse a nica ocorrendo no sistema. Esse nvel de isolamento diminui o nvel de concorrncia. Por outro lado, os
nveis de isolamento mais baixos, que aumentam os nveis de concorrncia podem levar a aparentes problemas
de consistncia das informaes.
Consideremos um ambiente onde no existe isolamento entre as transaes. As alteraes realizadas por um
usurio so imediatamente vistas por todos. Neste caso, dentre os fenmenos possveis de ocorrer, temos:
Leitura Suja leitura de dados no confirmados. Suponha que ocorram os seguintes passos:
1. Duas transaes, T1 e T2 so iniciadas;
2. A transao T1 modifica a linha L1;
3. A transao T2 l a linha L1 antes que T1 termine;
4. T1 termina com fracasso e suas operaes so desfeitas;
Neste caso, T2 ter lido uma informao que nunca foi confirmada.

Leitura No-Repetida: duas leituras de dados da mesma transao no se repetem. Na segunda leitura,
dados antigos no existem ou foram modificados. Suponha que ocorram os seguintes passos:
1. Duas transaes T1 e T2 so iniciadas;
2. A transao T1 l a linha L1;
3. A transao T2 modifica a linha L1, atualizando seus dados ou apagando a linha;
4. A transao T2 concluda com sucesso e suas operaes so confirmadas;
5. A transao T1 l (ou tenta ler) a linha L1. T1 nunca modificou os dados da linha L2, mas no obteve a
mesma leitura duas vezes dentro da mesma transao.

Leitura Fantasma: na leitura de um conjunto de dados, surgem novas informaes no conjunto. Suponha
que ocorram os seguintes passos:
1. Duas transaes T1 e T2 so iniciadas;
2. A transao T1 l um conjunto de linhas que atendem a uma condio C1;
3. A transao T2 executa uma operao de atualizao que cria uma ou mais que atendem condio
C1;
4. A transao T1 l, novamente, um conjunto de linhas que atendem a uma condio C1. Embora T1
no tenha criado linhas que atendam condio C1, novas linhas participaro do resultado da
consulta;
Perda de atualizao: duas transaes que ocorrem simultaneamente atualizam o mesmo dado no banco
de dados. Isto pode ocorrer em uma sequencia segundo a qual uma das atualizaes perdida:
1. Duas transaes, T1 e T2, so iniciadas;
2. A transao T1 l o dado D1 e armazena seu valor na varivel X;
3. A transao T2 l o dado D1 e armazena seu valor na varivel Y;
4. A transao T1 atualiza D1 com o valor de 6*X;
5. A transao T2 atualiza D1 com o valor de 0.5*Y;
238

6. A transao T1 termina com sucesso;


7. A transao T2 termina com sucesso.
Para a transao T1, ao seu final, o valor de D1 deveria ter sido multiplicado por seis. J para T2, ao seu final,
o valor de D1 deveria ser a metade do seu valor original. Se as transaes T1 e T2 fossem executadas em srie,
independente da ordem, o valor final de D1 deveria ser a metade do valor original. Entretanto, na ordenao de
comandos demonstrada antes, o valor final de D1 a metade do original, como se a atualizao realizada por T1
nunca tivesse sido realizada.
Os quatros nveis de isolamento da SQL podem ser definidos de acordo com sua relao com os quatro
fenmenos listados. Essa relao mostrada na tabela 9.3.

O nvel de
isolamento a ser utilizado pode ser definido atravs de uma clusula nos comandos de incio de uma transao,
conforme foi apresentado. Pode, tambm, ser definido em um comando de alterao das propriedades da
transao, o comando:
SET TRANSACTION ISOLATION LEVEL NIVEL_DE_ISOLAMENTO
Por exemplo, alterar o nvel de isolamento de uma transao para SERIAZABLE:
SET TRANSACTION ISOLATION LEVEL SERIAZABLE
Programas e Gatilhos Armazenados
A linguagem SQL uma linguagem diferente das linguagens tradicionais, como C e Pascal. Ao contrrio de
linguagens como estas, no SQL especificamos o resultado que queremos obter, sem nos preocuparmos com a
sequencia de passos a serem para obteno do resultado. Por isso, a SQL classificada como uma linguagem
declarativa.
Por outro lado, SGBDs se tornaram pontos cruciais em ambientes coorporativos, sendo acessos por diversos
sistemas. A partir da, surgiram, em algumas situaes, duas necessidades: (i) mover a especificao e execuo
de rotinas que verificam e implementam regras de negcio para o prprio SGBD, centralizando, assim, tais
operaes e as disponibilizando para toda a empresa de uma s vez, e (ii) fornecer ao SGBD algum tipo de
comportamento ativo (ou reativo) a determinadas situaes.
De forma a permitir a migrao das regras de negcio para o gerenciador de banco de dados foram definidos,
na SQL, os conceitos de procedimento e funo armazenados. Estes so pequenos programas compilados,
armazenados e executados diretamente no servidor de banco de dados. So invocados atravs de comandos SQL.
J para adicionar ao SGBD comportamento reativo, foi introduzido, na linguagem SQL, o conceito de gatilho.
Este um mecanismo que permite a execuo automtica de comandos ou, at mesmo, programas, a partir de
eventos que ocorrem na base de dados (como a atualizao do contedo de uma clula, por exemplo).
Para permitir a definio de blocos de programas a serem armazenados no SGBD, a SQL foi estendida com
comandos tpicos de linguagens no-declarativas, como comandos de iterao e de deciso, por exemplo. Estes
blocos compem o corpo no s de procedimentos e funes armazenados nos servidores, mas, tambm, de

239

gatilhos. Os SGBDs apresentam tambm, conjuntos prprios de comandos de controle. No Oracle, a linguagem
de programao, chama-se PL/SQL. J no SQL Server, chama-se Transact SQL.
Bloco de Comandos
Para permitir a criao de programas com SQL, foi criado o conceito de blocos de comandos. Alm disso,
foram incorporados linguagem vrios comandos de controle similares aos existentes em outras linguagens de
programao.
Blocos de comandos so pequenos programas compostos de um ou mais comandos SQL. Permitem a
especificao de variveis e cursores prprios aos blocos. Sua estrutura a seguinte:
BEGIN
DECLARAO DE VARIVEIS
DECLARAO DE CURSORES
LISTA DE COMANDOS SQL
END
Existe, ainda, no padro SQL:2003, a possibilidade de declarao de handles, objetos que iro tratar excees
ocorridas durante a execuo de blocos de comandos.
Declarao de Variveis: em um bloco de comandos, podemos declarar quantas variveis locais forem
necessrias. Para isso, utilizamos a seguinte estrutura:
DECLARE NOME_VARIAVEL1, NOME_VARIAVEL2, ...,
NOME_VARIAVELN TIPO_DE_DADOS
Cursores OPEN, FETCH e CLOSE: cursores so mecanismos que permitem que as linhas de uma tabela sejam
manipuladas uma a uma. Atuam como ponteiros que apontam para as linhas que formam o resultado de uma
dada consulta. Podemos recuperar e manipular os valores de cada linha apontada por um cursor.
Desta forma, deve existir um comando SELECT associado a um cursor. Para declarar um cursor e seu
comando associado, utilizamos o comando DECLARE CURSOR, conforme mostrado a seguir:
DECLARE CURSOR
FOR COMANDO_SELECT
[FOR UPDATE]
Um cursor no deve ser, somente, declarado. Para manipularmos os dados, devemos, inicialmente, abrir um
cursor. Para isso, utilizaremos o comando OPEN seguido do nome do cursor, conforme a seguir:
OPEN NOME_CURSOR
Neste momento, o resultado do comando SQL que define o cursor estar pronto para ser manipulado. Ento,
para posicionarmos o ponteiro, devemos utilizar o comando FETCH. Esse comando ir posicionar o ponteiro em
uma dada linha e atribuir as informaes apontadas para um conjunto de variveis. Ento, aps a atribuio,
poderemos manipular as variveis que recebem o valor de um cursor como tratamos quaisquer outras. FETCH
ter a seguinte estrutura:
FETCH NOME_CURSOR
INTO VARIAVEL1, ..., VARIAVELN
O comando FETCH , usualmente, utilizado em conjunto com um comando de iterao, como os comandos
REPEAT e WHILE, que sero apresentados ainda nesta seo.
Ao final de sua utilizao, o cursor deve ser fechado. Para fechar o cursor, utilizamos o comando CLOSE
seguido do nome do cursor, conforme representado a seguir:
240

CLOSE NOME_CURSOR
Atravs do comando FOR, poderemos declarar, abrir, navegar, e fechar cursores em um nico comando. O
comando FOR ser apresentado mais adiante.
Atribuio de Valores: podemos utilizar variveis em blocos de comandos. Para atribuirmos valores a variveis,
utilizaremos o comando SET da seguinte forma:
SET NOME_VARIAVEL = VALOR;
Por exemplo: Bloco de comando contendo a declarao de uma varivel X, de tipo caractere de comprimento
cinco, e atribuio do valor OI a X.
BEGIN
DECLARE X CHAR(5);
SET X = OI;
END
Comando FOR: FOR um comando bastante til, pois permite que, atravs de um s comando, seja declarado
como cursor, que seu contedo seja percorrido e que tal cursor seja fechado. O cursor fechado
automaticamente ao final do comando. FOR deve ser utilizado quando a navegao se faz de forma seqencial e
atravs de todas as linhas do resultado da consulta de declarao do cursor. Sua estrutura mostrado a seguir.
FOR
NOME_CURSOR [CURSOR FOR]
COMANDO_SELECT
DO LISTA DE COMANDOS SQL
END FOR
Ao incio de FOR o cursor declarado e aberto. O ponteiro posicionado na primeira linha do resultado da
consulta. Ento, os comandos SQL contidos na lista de comandos so executados. Ao chegar a END FOR, a
execuo retorna para FOR que, desta vez, percebe que o cursor j est aberto e posiciona o ponteiro na prxima
linha do resultado da consulta. Novamente, o conjunto de comandos SQL executado. O lao se repete at que
todas as linhas resultantes do comando SELECT tenham sido percorridas.
Comando SELECT INTO: atribui um valor a uma varivel. O valor atribudo recuperado a partir de uma consulta.
A consulta deve retornar somente uma linha. A seguir apresentado um formato para o comando.
SELECT COL1, COL2, ..., COLN
INTO VAR1, VAR2, ..., VARN
FROM NOME_TABELA
Comando IF: para permitir decises, foi incorporado linguagem SQL o comando IF. Esta testa se uma condio
booleana verdadeira e, em funo do resultado dos testes, executa um determinado conjunto de comandos.
Sua estrutura :
IF CONDICAO_BOOLEANA THEN
LISTA DE COMANDOS SQL
[ELSE IF CONDICAO_BOOLEANA THEN
LISTA DE COMANDOS SQL]
[ELSE LISTA DE COMANDOS SQL]
END IF

241

Comando WHILE: permite que a execuo de um conjunto de comandos se repita enquanto determina se a
condio verdadeira. Sua estrutura :
WHILE CONDICAO_BOOLEANA DO
LISTA DE COMANDOS SQL
END WHILE
Comando REPEAT: permite que a execuo de um conjunto de comandos se repita enquanto determinada
condio for falsa. Os comandos sero executados ao menos uma vez, independente do valor da condio.
REPEAT
LISTA DE COMANDOS SQL
UNTIL CONDICAO_BOOLEANA
END REPEAT
Comando LOOP: assim como WHILE e REPEAT, LOOP permite a repetio na execuo de um conjunto de
comandos. Entretanto, no caso de LOOP, no existe uma condio a ser testada. Para que a repetio termine,
outro comando deve ser utilizado. Segundo a SQL, o comando LEAVE termina o lao. Na estrutura de LOOP, que
apresentado a seguir, temos LOOP e END LOOP como delimitadores do comando e conjunto de comandos a
serem executados, representados por uma lista de comandos SQL. LEAVE deve ser posicionado na lista de
comandos SQL.
LOOP
LISTA DE COMANDOS SQL
END LOOP
Procedimentos armazenados e Funes
Os blocos e comandos apresentados anteriormente permitem a construo de rotinas que sero executadas
no servidor de banco de dados. Tais rotinas podem possuir cdigo extenso e serem bastante complexas.
Armazenar tais rotinas no servidor e permitr que sejam invocadas a partir da prpria linguagem SQL aumenta em
muito a utilidade de sua construo. Para permitir essa definio e armazenamento, esto definidas, na
linguagem SQL, os conceitos de procedimentos e funes armazenados no servidor.
Procedimentos armazenados
Procedimentos armazenados (stored procedures) so procedimentos anlogos aos existentes em linguagens
de programao tradicionais, mas que tero seu cdigo-fonte armazenado no servidor de banco de dados, o que
capaz de compil-lo e execut-lo.
Assim como em outras linguagens, os procedimentos podero receber valores como parmetros. Esses
parmetros so definidos no cabealho de procedimentos. Eles tm um nome, um tipo de dados e um modo.
Existem trs modos para os parmetros na SQL:2003: (i) parmetros que permitem apenas que os valores
externos das variveis sejam passados dentro do procedimento (idntico s passagens por valor de outras
linguagens); (ii) modo onde as variveis internas ao procedimento referentes aos parmetros no recebem
valores das variveis externas correspondentes, mas alteraes de valores ocorridas nos procedimentos so
efetivadas nas variveis externas correspondentes; e (iii) os valores externos so passados para dentro do
procedimento e as modificaes ocorridas internamente so efetivadas para as variveis externas (modo
semelhante s passagens por referncia de outras linguagens). Parmetros do primeiro modo so identificados
pela palavra reservada IN. A palavra OUT identifica os parmetros do segundo modo. J os parmetros que
pertencem ao terceiro modo so identificados pela palavra reservada INOUT. O primeiro passo para a utilizao
de procedimentos armazenados a sua criao no servidor. Para criar um procedimento armazenado, utilizamos
o comando CREATE PROCEDURE. Uma estrutura bsica para este comando apresentado a seguir.
CREATE PROCEDURE NOME_PROCEDURE(
242

MODO_PARAM1 NOME_PARAM1 TIPO_PARAM1,


MODO_PARAM2 NOME_PARAM2 TIPO_PARAM2,
...
MODO_PARAMN NOME_PARAMN TIPO_PARAMN
BLOCO_DE_COMANDOS_SQL
Consideremos, por exemplo, o procedimento PRECO_MEDIO apresentado a seguir. Ele possui dois
parmetros. O primeiro, NMERO_LIVROS, um parmetro de entrada que recebe do ambiente externo o
nmero total de livros a ser considerado. O segundo parmetro, PRECO_MEDIO, um procedimento e este valor
estar visvel para a varivel externa correspondente ao parmetro. Aps a declarao da linguagem utilizada,
est sendo criado um bloco de comandos SQL. Neste bloco, declarada uma varivel (V_VALOR_TOTAL),
utilizado um cursor (MEUCURSOR), manipulado atravs do comando FOR, e o valor mdio dos preos dos livros
calculado. Tal valor atribudo varivel PRECO_MEDIO, segundo parmetro do procedimento.
CREATE PROCEDURE PRECO_MEDIO
(IN NMERO_LIVROS INTEGER, OUT PRECO_MEDIO REAL)
LANGUAGE SQL
BEGIN
DECLARE V_VALOR_TOTAL REAL;
SET PRECO_MEDIO = 0;
SET V_VALOR_TOTAL = 0;
FOR MEU_CURSOR AS
SELECT PRECO FROM LIVRO
DO
SET V_VALOR_TOTAL = V_VALOR_TOTAL + PRECO;
END FOR;
SET PRECO_MEDIO = V_VALOR_TOTAL / NMERO_LIVROS
END
Aps a criao do procedimento, este fica armazenado no servidor de banco de dados e est pronto para ser
utilizado, bastando acion-lo a partir de um bloco de comandos. Para isso, devemos utilizar seu nome e variveis
correspondentes aos parmetros entre parnteses, quando for o caso. A seguir temos um exemplo de chamada
ao procedimento PRECO_MEDIO:
BEGIN
DECLARE V_NUMERO INTEGER;
DECLARE MDIA REAL;
...
PRECO_MEDIO(V_NUMERO, MDIA);
...
END
Para destruirmos um procedimento de nosso banco de dados, devemos utilizar o comando DROP
PROCEDURE seguido do nome do procedimento a ser destrudo, conforme mostrado a seguir.
DROP PROCEDURE NOME_PROCEDIMENTO;
Como exemplo, vamos destruir o procedimento PRECO_MEDIO:
DROP PROCEDURE PRECO_MEDIO;
Funes Armazenadas

243

Alm de procedimentos, o SQL permite que armazenemos funes no servidor de banco de dados. A funo
pode receber e tratar diversos parmetros de uma mesma maneira que o procedimento. A diferena entre um
procedimento e uma funo reside no fato de que a funo sempre retorna um valor. Assim, para criar uma
funo, utilizamos o comando CREATE FUNCTION ao invs do comando CREATE PROCEDURE. Como a funo
retorna um valor, no comando CREATE FUNCTION devemos especificar o tipo de dados retornado pela funo. O
exemplo da estrutura de CREATE FUNCTION similar a CREATE PROCEDURE. A nica diferena, alm do nome do
comando, reside na introduo da clusula RETURNS, onde o TIPO_RETORNO representa o tipo de dados
retornado pela funo.
CREATE FUNCTION NOME_FUNO (
MODO_PARAM1 NOME_PARAM1 TIPO_PARAM1,
MODO_PARAM2 NOME_PARAM2 TIPO_PARAM2,
...
MODO_PARAMN NOME_PARAMN TIPO_PARAMN
) RETURN TIPO_RETORNO [LANGUAGE NOME_LINGUAGEM]
BLOCO DE COMANDOS SQL
Dentro do bloco de comandos do corpo da funo devemos ter um comando RETURN seguido do valor a ser
retornado pela mesma. Exemplo:
RETURN 3.65;
A chamada para execuo de funes um pouco diferente da chamada para execuo de procedimentos.
Como funes retornam um valor, o nome da funo aparece ao lado direito do comando de atribuio de
valores. Por exemplo:
BEGIN
DECLARE V_NUMERO INTEGER;
DECLARE MDIA REAL;
...
SET MDIA = FUNC_PRECO_MEDIO(V_NUMERO);
...
END
Funes armazenadas podem, ainda, ser utilizadas em comandos SQL da mesma forma que as funes da
prpria linguagem, j apresentadas anteriormente.
Para destruirmos funes, utilizamos o comando DROP FUNCTION seguido do nome da funo.
DROP FUNCTION FUNC_PRECO_MEDIO
Gatilhos
Gatilhos so especificaes de aes a serem realizadas sempre que um dado evento ocorrer sobre um dado
objeto. Entre os eventos possveis, temos a incluso, atualizao ou excluso de informaes de uma tabela.
Um gatilho executa um conjunto de comandos, definido num bloco de comandos similar aos apresentados
anteriormente. Este bloco pode ser executado uma vez para cada evento que disparou o gatilho ou uma vez para
cada linha afetada pelo evento em questo. No primeiro caso, dizemos que se trata de um evento ao nvel de
comando e, no segundo, ao nvel de linha.
Entretanto, podemos querer que o bloco de comandos seja acionado somente em algumas circunstncias e
no todas as vezes que o evento disparador do gatilho ocorrer. A linguagem SQL nos permite realizar tal ao
atravs da incluso de uma condio booleana na declarao do gatilho. Devido s suas caractersticas, os
gatilhos so conhecidos por atenderem regra ECA Evento, Condio e Ao.

244

Um gatilho pode ser executado antes ou aps a execuo do comando que o disparou. Entretanto, em ambos
os casos, podemos querer acessar os dados nos formatos que teriam antes ou aps a execuo de tal comando.
Ou seja, podemos, por exemplo, aps a realizao de uma atualizao, querer testar se o novo valor de uma dada
coluna diferente do valor anterior.
Para permitir o acesso duas verses das informaes de uma dada linha dentro de um gatilho, foram
definidas as tabelas de transio NEW e OLD. NEW contm a nova verso das informaes e OLD, a verso antiga.
Note que os eventos podem ser operaes de incluso, atualizao e excluso. No caso de uma operao de
incluso, OLD est vazia, pois a informao no existia antes do evento. Caso o evento seja um operao de
excluso, NEW est vazia, pois a informao no mais existe aps o comando. Quando o evento disparador uma
operao de atualizao, tanto NEW quanto OLD possuem dados. A seguir, apresentaremos a sintaxe bsica para
a declarao de um gatilho:
CREATE TRIGGER NOME_GATILHO
MOMENTO_EXECUO
EVENTO_DISPARADOR
ON TABELA_EVENTO
[REFERENCING NEW AS NOVO_NOME_N OLD AS NOVO_NOME_O]
[NIVEL_GATILHO]
[CONDICAO_EXECUCAO]
BLOCO_DE_COMANDOS_SQL
Por exemplo: Suponha que desejamos armazenar, sempre que um livro sofra um aumento de preo superior a
20%, seu cdigo, seu preo antigo e seu novo preo. Para isto, criamos uma tabela chamada AUDITORIA que tem
trs colunas: uma para armazenar o cdigo do livro que sofreu aumento (CODIGO_LIVRO), a segunda para
armazenar o preo do livro antes do aumento (VALOR_ANTIGO) e a ltima (VALOR_NOVO), para armazenar o
novo preo do livro.
Para que a rotina de armazenamento das mudanas de preo ocorra de forma automtica, criamos um
gatilho, chamado TESTA_AUMENTO, que disparado sempre que a coluna PREO, da tabela LIVRO, atualizada.
Ento, para cada linha afetada pelo comando de atualizao, se o novo valor for superior a 20% do antigo valor, o
cdigo do livro, o seu preo antigo e seu novo preo so inseridos na tabela auditoria. Nesse gatilho, utilizaremos
N1 como apelido para a tabela NEW e O1 para apelido para a tabela OLD.
O comando de criao do gatilho descrito encontra-se a seguir:
CREATE TRIGGER TESTA_AUMENTO
AFTER UPDATE OF PRECO ON LIVRO
REFERENCING NEW AS N1 OLD AS O1
FOR EACH ROW
WHEN (N1.PRECO > 1.2 * O1.PRECO)
BEGIN
INSERT INTO AUDITORIA (CODIGO_LIVRO, VALOR_ANTIGO, VALOR_NOVO) VALUES (:N1.CODIGO, :O1.PRECO,
:N1.PRECO)
END;
Note que, no exemplo, utilizamos o caractere ; para referenciar, a partir do bloco de comandos SQL, as
variveis que representam a tabela de transio. Note, ainda, que, para acessarmos os valores das colunas,
podemos utilizar o formato NOME_TABELA_TRANSICAO.NOME_COLUNA.
No podemos executar gatilhos atravs de chamadas diretas, como fazemos com procedimentos e funes
armazenadas. A nica maneira de execut-los atravs de seu evento disparador.
Para apagar um gatilho, utilizamos o comando DROP TRIGGER seguido do nome do gatilho. Exemplo:
DROP TRIGGER TESTA_AUMENTO;
245

Extenses ao Relacional
No final da dcada de 80, a programao orientada a objetos alcanou um grande nmero de adeptos. O
debate entre os que defendiam os SGBDs orientados a objetos e entre os adeptos dos SGBDs relacionais tomou
maior importncia. A partir deste, surgiram SGBDs que incorporaram caractersticas de orientao a objeto aos
modelos relacionais: os SGBDs estendidos ou relacionais a objeto.
Vrios SGBDs Relacionais comearam a se tornar relacionais estendidos, at que a SQL incorporou
comandos para criao de tipos do usurio e manipulao de dados no-convencionais, entre outros.
Tipos de Dados do Usurio
A primeira caractersticas dos SGBDs relacionais estendidos a possibilidade do usurio poder criar seus
prprios tipos de dados.
Tipos de dados definidos pelo usurio podem conter um ou mais atributos, sendo que cada atributo possui,
por sua vez, um tipo de dados prprio, podendo este ser um tipo predefinido ou um tipo de dados do usurio.
Tipos de dados do usurio em conjunto com seus atributos formam estruturas anlogas ao struct da linguagem C
ou ao RECORD da linguagem Pascal.
Podemos, tambm, atribuir mtodos a tipos de dados do usurio. Mtodos so rotinas (procedimentos ou
funes) que podem ser acionados para tratamento e manipulao de informaes.
Outro importante conceito proveniente de orientao a objetos o de herana. Na orientao a objetos,
uma classe, chamada de subclasse, pode herdar atributos e mtodos de outra classe, sua superclasse. Na
SQL:2003, um tipo de dados do usurio pode ser classificado como NOT FINAL podero ter herdeiros (ou
descendentes), ou seja, seus atributos e mtodos podero ser herdados por outros tipos de dados.
CREATE TYPE NOME_TIPO [UNDER NOME_SUPER_TIPO] AS (
ATRIBUTO1
TIPO_ATRIBUTO1,
ATRIBUTO2
TIPO_ATRIBUTO2,
...
ATRIBUTON
TIPO_ATRIBUTON
)
[TIPO_FINAL]
[METHOD NOME_MTODO1 (PARAMETROS_METODO1),
METHOD NOME_METODO2 (PARAMETROS_METODO2),
...
METHOD NOME_METODON(PARAMETROS_METODON)]
Consideremos que nossa base de dados armazena a informao de endereos em diversas tabelas. Para
tornar a definio de um endereo mais completa, gostaramos de dividi-lo em vrios campos: logradouro,
nmero, complemento, CEP, bairro, cidade e estado.
Como temos vrias tabelas com colunas que armazenam endereos, decidimos, por exemplo, criar um tipo
de dados chamado TYP_ENDERECO, que contm os campos citados anteriormente com seus atributos. A criao
do tipo de dados TYP_ENDERECO apresentado a seguir:
CREATE TYP_ENDERECO (
LOGRADOURO
VARCHAR(100),
NMERO
INTEGER,
COMPLEMENTO VARCHAR(15),
CEP
CHAR(8),
BAIRRO
VARCHAR(30),
CIDADE
VARCHAR(40),
ESTADO
VARCHAR(2) )
246

FINAL
No exemplo anterior, o tipo de dados TYP_ENDERECO foi definido como FINAL. Isso significa que ele no
pode ter suas propriedades herdadas por outros tipos de dados. TYP_ENDERECO no apresenta nenhum mtodo.
Consideremos, agora, como exemplo, que desejamos tornar a definio de nomes mais bem estruturada,
criando dois atributos para um nome e sobrenome. Chamemos nosso tipo de dados de TYP_NOME. Alm disso,
muitas vezes, desejamos obter o nome completo de uma pessoa. Para tal, criamos um mtodo que seja capaz de
concatenar nome e sobrenome. Os atributos e mtodos desse tipo de dados podem ser herdados por outros
tipos. A definio do tipo de dados, contendo atributos e mtodos, apresentado a seguir:
CREATE TYPE TIP_NOME(
PRIMEIRO_NOME VARCHAR(30),
SOBRENOME
VARCHAR(30)
) NOT FINAL
METHOD NOME_COMPLETO RETURNS VARCHAR
Utilizando tipo de dados do usurio
Os tipos de dados definidos pelo usurio podem ser utilizados na definio de colunas. Assim, podemos criar
uma tabela CLIENTE que possui, dentre as suas colunas, a coluna NOME, de tipo de dados TYP_NOME, e a coluna
ENDERECO que tem, como tipo de dados, tipo TYP_ENDERECO. O comando de criao da tabela CLIENTE
apresentado a seguir:
CREATE TABLE CLIENTES(
CODIGO INTEGER PRIMARY KEY,
NOME
TYP_NOME NOT NULL,
ENDERECO TYP_ENDERECO NOT NULL
CPF
CHAR(11) CONSTRAINT UK_CPF UNIQUE,
DATA_NASCIMENTO
DATE,
TELEFONE VARCHAR(12) )
Para utilizarmos colunas cujos tipos so definidos pelo usurios em comandos de seleo, incluso,
atualizao e excluso, devemos utilizar o construtor do tipo, que podemos o nome do prprio tipo de dados.
Alterando o tipo de dados do usurio
Em varias situaes pode ser necessrios alterar um tipo de dados definido pelo usurio. Podemos, por
exemplo, querer: (i) adicionar atributos, (ii) remover atributos, (iii) adicionar novos mtodos e (iv) remover
mtodos existentes. Para atender a essas necessidades, foi definido o comando ALTER TYPE.
Podemos utilizar ALTER TYPE em diferentes construes. A estrutura a seguir deve ser utilizada para
adicionarmos um atributo a um tipo.
ALTER TYPE NOME_TIPO
ADD ATTRIBUTE NOME_ATRIBUTO TIPO_ATRIBUTO
Exemplo:
ALTER TYPE TYP_ENDERECO
ADD ATTRIBUTE PAIS VARCHAR(35)
J para remover um atributo, utilizamos o comando ALTER TYPE com o formato abaixo.
ALTER TYPE NOME_TIPO
DROP ATTRIBUTE NOME_ATRIBUTO [RESTRICT]

247

RESTRICT refora a idia de que nenhum atributo pode ser apagado se o tipo de dados estiver sendo utilizado na
definio de qualquer objeto de b d.
Exemplo:
ALTER TYPE TYP_ENDERECO
DROP ATTRIBUTE PAIS
Para adicionar novos mtodos, utilizamos o commando com o formato abaixo:
ALTER TYPE NOM_TIPO
ADD METHOD NOME_METODO [PARAMETROS_METODO]
RETURNS TIPO_RETORNO
Aps a incluso do mtodo, seu corpo deve ser especificado. Tal especificao ocorre de forma anloga
apresentada anteriormente.
J para removermos um mtodo do tipo definido pelo usurio, utilizamos o comando ALTER TYPE conforme
mostrado a seguir.
ALTER TYPE NOME_TIPO DROP METHOD NOME_METODO
Removendo tipos de dados do usurio
Tipos de dados do usurio podem ser excludos. Para isso, utilizamos o comando DROP TYPE seguido do
nome do tipo de dados em questo. A seguir, teremos o exemplo de excluso dos tipos TYP_CLIENTE e
TYP_ENDERECO.
DROP TYPE TYP_CLIENTE
DROP TYPE TYP_ENDERECO
Para que possamos excluir um tipo de dados, ele no deve estar sendo utilizado por nenhuma tabela e nem
por outro tipo de dados.
Armazenando e referenciando objetos
Os objetos (de dados) criados a partir dos tipos definidos pelo usurio possuem um identificador nico,
chamado OID (object identifier). Podemos referenciar os objetos, atravs de seu OID, utilizando o tipo REF.
REF um ponteiro para objetos de um determinado tipo de dados do usurio. Permite implementar vnculos
entre relaes onde em um dos lados existe um objeto. Desta forma, podemos criar colunas ou atributos que
sejam do tipo REF e que armazenam um ponteiro para um objeto de um dado tipo. Ao valor da coluna, podemos
atribuir o valor NULL ou uma referncia ao objeto. Podemos utilizar o valor contido em REF para recuperar o
objeto que apontado e para atualizar seu valor.
Para criarmos um atributo ou coluna que armazene uma referncia, devemos utilizar a construo:
NOME_COLUNA REF NOME_TIPO_DE_DADOS_USUARIO
Exemplo: Considere que tenhamos montado um banco de dados para armazenar as equipes que participam de
um torneio. De cada jogador, queremos armazenar o nome e a equipe a que pertence. De cada equipe,
desejamos armazenar o nome e o nome de seu capito. Para isso, iremos criar dois tipos de dados.
Iniciamos criando o tipo que representa as informaes de equipes que, por enquanto, contm apenas o
atributo nome.
CREATE TYPE TYP_EQUIPE AS (
NOME VARCHAR(30)
)
Ento, criamos o tipo de dados para representar as informaes de cada jogador. Este tipo contm dois
atributos: o nome, e uma referncia para um objeto do tipo referenciado.
248

CREATE TYPE TIP_JOGADOR AS (


NOME VARCHAR(50),
EQUIPE REF(TYP_EQUIPE))
Por fim, alteramos TYP_EQUIPE para conter uma referncia para um objeto que contm as informaes do
capito da equipe:
ALTER TYPE TYP_EQUIPE ADD ATTRIBUTE CAPITAO REF(TYP_JOGADOR)
A SQL:2003 nos permite criar tabela que sejam repositrios de objetos. Nestas tabelas, somente temos um
objeto. Uma sintaxe simplificada para sua criao :
CREATE TABLE NOME_TABELA OF NOME_TIPO_DADOS (
REF IS NOME_COLUNA,
NOME_COLUNA_TIPO_REF WITH OPTIONS
SCOPE NOME_TABELA_REFERENCIADA,
NOME_COLUNA_TIPO_REF2 WITH OPTIONS
SCOPE NOME_TABELA_REFERENCIADA2,
NOME_COLUNA_TIPO_REFN WITH OPTIONS
SCOPE NOME_TABELA_REFERENCIADAN
)
Consideremos o tipo de dados TYP_EQUIPE e TYP_JOGADORES, mencionados anteriormente. Vamos, agora,
criar as tabelas EQUIPES e JOGADORES de forma a armazenar objeto dos dois tipos, respectivamente.
Inicialmente, criamos a tabela EQUIPES, definindo OID como nome da coluna de referncia.
Comando:
CREATE TABLE EQUIPES OF TYP_EQUIPE (REF IS OID)
Ento, criamos a tabela JOGADORES, definindo, tambm, uma coluna de nome OID como coluna de
referncia. Na criao, definimos, ainda, que o atributo EQUIPE aponta para objetos contidos na tabela EQUIPES.
Comando:
CREATE TABLE JOGADORES OF TYP_JOGADOR (REF IS OID,
EQUIPE WITH OPTIONS SCOPE EQUIPES)
Agora, utilizamos o comando ALTER TABLE para modificar a tabela EQUIPES de forma a fazer com que a
coluna CAPITAO referencie objetos contidos na tabela JOGADORES. O comando a ser utilizado, apresentado a
seguir, permite alterar a definio de uma coluna, adicionando um escopo para sua referncia.
ALTER TABLE EQUIPES ALTER CAPITAO ADD SCOPE JOGADORES
Vamos, agora, como exemplo, incluir equipes e jogadores nas tabelas. Comeamos incluindo trs equipes
chamadas Equipe Azul, Equipe Verde e Equipe Laranja. Os comandos de incluso so apresentados a seguir.
INSERT INTO EQUIPES (OID, NOME)
VALUES (TYP_EQUIPE(1), EQUIPE AZUL)
INSERT INTO EQUIPES (OID, NOME)
VALUES (TYP_EQUIPE(2), EQUIPE VERDE)
INSERT INTO EQUIPES (OID, NOME)
VALUES (TYP_EQUIPE(3), EQUIPE LARANJA)
Note, nos comandos anteriores, que no inclumos valores para o atributo CAPITAO. Alm disso, utilizamos o
nome do tipo de dados como construtor para a obteno de um OID a partir dos valores 1, 2 e 3.

249

Podemos, tambm, incluir dados na tabela de jogadores. Vamos incluir trs jogadores para a Equipe Azul:
Joo, Andr, e Pedro. Para isso, executamos os comandos a seguir:
INSERT INTO JOGADORES (OID, NOME, EQUIPE)
VALUES (
TYP_JOGADOR(1), JOAO, (SELECT OID FROM EQUIPES WHERE NOME= EQUIPE AZUL))
INSERT INTO JOGADORES (OID, NOME, EQUIPE) VALUES (
TYP_JOGADOR(2), ANDR, (SELECT OID FROM EQUIPES WHERE NOME= EQUIPE AZUL))
INSERT INTO JOGADORES (OID, NOME, EQUIPE) VALUES (
TYP_JOGADOR(3), PEDRO, (SELECT OID FROM EQUIPES WHERE NOME= EQUIPE AZUL))
Nos comandos anteriores, utilizamos uma subconsulta para recuperar o objeto referente equipe dos
jogadores e inseri-lo na tabela JOGADORES. Vamos, agora, marcar o jogador Andr como capito da equipe Azul.
UPDATE EQUIPE
SET CAPITAO = ( SELECT OID FROM JOGADORES WHERE NOME = ANDR)
WHERE NOME = EQUIPE AZUL
Podemos, tambm, realizar consultas sobre os dados contidos em JOGADORES e em EQUIPES. Vejamos
exemplos:
Desejamos selecionar o nome do capito da Equipe Azul.
SELECT CAPITAO -> NOME
FROM EQUIPES
WHERE NOME = EQUIPE AZUL
Desejamos selecionar o nome da equipe do jogador JOAO.
SELECT EQUIPE -> NOME
FROM JOGADORES
WHERE NOME = JOAO
Desejamos selecionar o nome do capito da equipe do jogador JOAO.
SELECT EQUIPE -> CAPITAO -> NOME
FROM JOGADORES
WHERE NOME = JOAO
Nestes comandos utilizamos -> para acessar os campos dos objetos referenciados pelas colunas de tipo REF.
No terceiro exemplo, a partir do objeto referente ao jogador JOAO acessamos o objeto referente Equipe Azul,
na tablea de equipes, e, ento, acessamos o objeto referente ao jogdor capito da equipe, Andr, para obter o
seu nome.
A SQL:2003 define, tambm, dois tipos de colees de objetos: arrays e multisets. Arrays so colees onde
cada elemento participante possui uma posio fixa e pode ser acessado por sua posio na coleo. Multisets
so colees onde no existe ordenao dos elementos. Assim, Multisets so colees onde no existe ordenao
dos elementos. Assim, no h um ndice atravs do qual acessemos um dado elemento.
Extenso para OLAP
A SQL:2003 apresenta diferentes estruturas para atender a necessidades de aplicaes OLAP. Dentre elas,
temos os elementos de agrupamento ROLLUP, CUBE e GROUPING SETS, que so apresentados a seguir.
Anteriormente foi apresentada a clusula GROUP BY. Ela faz com que dados sejam agrupados atravs de uma
ou mais colunas e permite que se apliquem funes sobre as linhas que participam de cada grupo. ROLLUP, CUBE,
250

e GROUPING SETS so empregados em conjunto com GROUP BY, provendo diferentes comportamentos a essa
clusula.
ROLLUP
Quando utilizamos ROLLUP, o resultado obtido contm linhas representando a realizao do agrupamento
em vrios nveis. Sua sintaxe de utilizao a seguinte:
SELECT COL1, COL2, ..., COLN, FUNCAO1, ..., FUNCAON
FROM NOME_TABELA
GROUP BY ROLLUP (COL1, ..., COLN)
Como exemplo, considere uma base de dados de vendas. Assuma que existe uma tabela onde so
armazenadas informaes das vendas realizadas por uma empresa nos diversos estados do pas. So
armazenados os produtos vendidos, a data das vendas e as quantidades vendidas em cada operao. Um
exemplo desta tabela apresentado na Tabela 11.1.
Considere, como exemplo, que desejamos saber a quantidade total vendida em cada combinao de
<produto, ms, estado> existente na tabela. Desejamos que a listagem esteja ordenada por estado, ms de
venda, e nome do produto. Para isso, devemos utilizar a consulta a seguir.
SELECT ESTADO, MONTH(DATA) AS MS, PRODUTO, SUM(QUANTIDADE) AS TOTAL
FROM VENDA
GROUP BY ESTADO, MONTH(DATA), PRODUTO
ORDER BY ESTADO, MONTH(DATA), PRODUTO
Considere que, agora, desejamos montar uma listagem que apresente os totais de vendas, no s para as
diversas combinaes de <produto, ms, estado>, mas, tambm, para cada par <ms, estado> e para cada estado
isoladamente. Vamos, ento, utilizar o operador ROLLUP:
SELECT ESTADO, MONTH(DATA) AS MS, PRODUTO,
SUM(QUANTIDADE) AS TOTAL
FROM VENDA
GROUP BY ROLLUP (ESTADO, MONTH(DATA), PRODUTO)
ORDER BY ESTADO, MONTH(DATA), PRODUTO
Note a diferena entre os resultados da utilizao da clusula GROUP BY com e sem o operador ROLLUP.
Quando utilizamos o operador ROLLUP, alm das linhas obtidas com a realizao do agrupamento, so obtidas
novas linhas que contm os subtotais para cada nvel de agrupamento. Uma linha contendo o total geral tambm
participa do resultado.
Grouping Sets
J a utilizao do operador GROUPING SETS faz com que o agrupamento seja realizado, isoladamente, por
cada uma das expresses contidas na clusula GROUP BY. Ou seja, o resultado de uma consulta com a utilizao
de GROUPING SETS em um clusula GROUP BY com n expresses idntico unio dos resultados de n
comandos com a clusula GROUP BY utilizada isoladamente e, em cada um dos n comandos, somente uma das
colunas n originais est presente em GROUP BY.
GROUPING SETS utilizado de forma idntica a ROLLUP, bastando substituir no comando de consulta, ROLLUP
por GROUPING SETS. Vejamos, como exemplo, a utilizao de GROUP SETS na nossa tabela de vendas.
SELECT ESTADO, MONTH(DATA) AO MS, PRODUTO, SUM(QUANTIDADE) AS TOTAL
FROM VENDA
GROUP BY GROUPING SETS (ESTADO, MONTH(DATA), PRODUTO)
251

ORDER BY ESTADO, MONTH(DATA), PRODUTO


Note, no exemplo, anterior, que o resultado final idntico ao que seria obtido se realizssemos a consulta
trs vezes, onde, em cada uma, somente o comando GROUP BY e uma das trs expresses de agrupamento
(ESTADO, MONTH(DATA), PRODUTO) fossem utilizados.
CUBE
Este operador realizar agrupamentos por cada combinao possvel das expresses contidas na clusula
GROUP BY. Ele apresenta, tambm, uma linha com informao condensada de toda a tabela. utilizado de forma
idntica a ROLLUP e a GROUP SETS. Vejamos um exemplo de consulta utilizando a tabela VENDA:
SELECT ESTADO, MONTH(DATA) AS MS, PRODUTO, SUM(QUANTIDADE) AS TOTAL
FROM VENDA
GROUP BY CUBE(ESTADO, MONTH(DATA), PRODUTO)
ORDER BY ESTADO, MONTH(DATA), PRODUTO
Notamos que esto presentes no resultado aqueles que seriam obtidos se realizssemos vrias consultas
com a clusula GROUP BY e diversas combinaes entre as colunas ESTADO e PRODUTO e a expresso
MONTH(DATA).
Nos exemplos anteriores, utilizamos a funo SUM. Comportamento anlogo pode ser obtido se utilizarmos
outras funes agregadas, como SUM. No caso da utilizao de AVG em conjunto com ROLLUP, por exemplo,
obtemos a mdia por produto, ms e estado, a mdia de vendas por ms e estado, a mdia por estado e, enfim, a
mdia final de vendas.
Privilgios e Papis
Controle de privilgios um importante mecanismo existente em SGBDs. atravs dele possvel garantir
que os usurios realizem apenas as operaes que lhe so permitidas.
Todo acesso a um SGBD realizado em conjunto com a identificao de um usurio ou tipo de usurio, seja
de forma implcita ou explcita. A cada usurio podem estar associados diversos privilgios. De acordo com os
privilgios que possui, o usurio pode, por exemplo, se conectar ao banco de dados, criar outros usurios e ler,
alterar, incluir ou apagar dados de uma ou mais tabela.
possvel ainda, por exemplo, configurar o sistema de forma que um determinado usurio conectado ao
SGBD no saiba da existncia de uma ou mais tabelas. Para isso, basta no atribuir a tal usurio os privilgios
mnimos para que tome conhecimento da existncia das tabelas em questo.
De forma a facilitar o gerenciamento e a atribuio de privilgios a usurios, o padro SQL define a
possibilidade de criao de papis (roles), os quais podem ser tratados como conjuntos de privilgios que podem
ser atribudos a usurios.
Usurios
O padro SQL define o conceito de identificadores de usurios como a representao no SGBD de usurios do
mundo real. Desta forma, identificadores de usurios representam usurios do SGBD.
De acordo com o que foi definido no padro SQL, toda sesso SQL possui um identificador de usurio a ela
associado. De acordo com os privilgios, que o identificador de usurio da sesso possuir, so definidos os
comandos que podem ou no ser executados na referida sesso.
comum que usurios do banco de dados representem aplicaes e no usurios reais. Do ponto de vista do
SGBD, no que se refere ao controle de acesso e segurana, esses tipos de usurios no so diferentes entre si,
devendo ser tratados de maneira similar, havendo tambm a necessidade de atribuio e revogao de
privilgios.

252

Privilgios
O padro SQL define um privilegio como sendo uma autorizao para que uma dada ao seja executada.
Estas aes geralmente incidem sobre um objeto de banco de dados, como tabelas, vises, gatilhos ou colunas,
por exemplo.
Dentre as possveis aes indicadas no padro SQL, temos:
INSERT [LISTA_DE_COLUNAS] LISTA DE COLUNAS opcional. Permite incluir somente valores para as
colunas especificadas na LISTA_DE_COLUNAS, caso esta lista tenha sido especificada, ou para todas as
colunas de uma tabela/viso, caso a lista no tenha sido especificada.
UPDATE [LISTA_DE_COLUNAS] LISTA_DE_COLUNAS opcional. Permite atualizar as colunas de uma
tabela/viso especificadas na LISTA_DE_COLUNAS, caso essa lista tenha sido especificada, ou em todas as
colunas, caso essa lista no tenha sido especificada.
DELETE Apagar dados em uma tabela.
SELECT [LISTA_DE_COLUNAS] LISTA_DE_COLUNAS opcional. Permite selecionar valores de uma
tabela/viso, somente para as colunas especificadas na LISTA_DE_COLUNAS, caso esta lista tenha sido
especificada, ou para todas as colunas, caso essa lista no tenha sido especificada.
REFERENCES [LISTA_DE_COLUNAS] LISTA_DE_COLUNAS opcional. Permite referenciar uma tabela na
criao de chaves estrangeiras. Somente as colunas especificadas na LISTA_DE_COLUNAS podero ser
referenciadas, caso essa lista tenha sido especificada, ou qualquer coluna, caso a lista no tenha sido
especificada.
De forma a melhorar os mecanismos de controle de acesso e segurana, os Gerenciadores de Banco de dados
apresentam diversos privilgios alm dos especificados no padro. Cada SGBD possui seu prprio modelo de
privilgios. Nesses modelos, os privilgios so classificados, geralmente, ao menos como privilgios de objeto e
privilgios de sistema.
De toda a forma, so comuns em SGBDs privilgios especficos para:
Conectar-se a uma instncia do SGBD ou a uma de suas bases de dados;
Criar e destruir objetos do banco de dados, como tabelas, ndices, vises, gatilhos, e procedimentos
armazenados, dentre outros.
Consultar, atualizar, incluir e excluir dados em tabelas (e em vises, para gerenciadores que suportam a
realizao dessas operaes nas mesmas).
Executar procedimentos e funes armazenados.
Alterar as caractersticas do sistema e de suas bases de dados, tais como parmetros de inicializao.
Realizar operaes de gerao de cpias de segurana (backup) e recuperao de tais cpias (restore).
Em geral, o usurio analista de sistema ou programador no necessitar possuir todos esses privilgios. A
maioria de tais privilgios se relaciona com aes que so realizadas especificamente pelo administrador do
banco de dados.
Usualmente, o administrador do banco de dados que concede os privilgios necessrios para que outros
usurios realizem suas aes.
Atribuindo privilgios a um usurio
Para atribuirmos um privilgio a um usurio (ou seja, para permitimos que um usurio realize uma
determinada ao), devemos utilizar o comando GRANT, cuja sintaxe exibida a seguir:
GRANT PRIVILEGIOS
TO NOME_PRIVILEGIADO
[WITH HIERARCHY OPTION][WITH GRANT OPTION]
[GRANTED BY NOME_CONCEDENTE]
importante notar que, para poder atribuir um privilgio a um dado usurio, o usurio concedente deve
possuir privilgios para tal.
Como exemplo, consideremos que deve ser permitido ao usurio MARIA realizar qualquer operao dentro
da tabela EDITORA. Para atribuir ao referido usurio tais privilgios, pode ser usada a clusula ALL PRIVILEGES.
253

GRANT ALL PRIVILEGES ON EDITORA TO MARIA


Considere-se, ainda, que este usurio deveria poder, tambm, selecionar e atualizar dados da tabela LIVRO,
mas que no lhe deve ser permitido incluir ou apagar dados desta tabela. O usurio MARIA poder, ainda,
conceder privilgios que possui na tabela LIVRO a outros usurios. Para permitir que o usurio MARIA realize tais
aes, executa-se o comando a seguir:
GRANT SELECT, UPDATE ON LIVRO TO MARIA WITH GRANT OPTION
J no que se refere tabela ASSUNTO, o usurio MARIA somente pode alterar apenas a coluna DESCRIO.
Para atribuir Maria privilgios necessrios para realizar essa operao, deve ser executado o seguinte comando:
GRANT UPDATE(DESCRIO) ON ASSUNTO TO MARIA
Conforme mencionado anteriormente, para que os comandos GRANT apresentados nos exemplos possam
ser executados com sucesso, devem ser executados por um usurio que possua os privilgios adequados.
Usualmente, esse usurio representa o administrador do banco de dados, o qual possui privilgios de sistema
que lhe permitem realizar todas, ou quase todas as operaes do banco de dados. No entanto, podem, tambm,
ser executados por um usurio que tenha recebido tais privilgios com a opo WITH GRANT OPTION, que lhe
permite atribuir privilgios recebidos a outros usurios.
Privilgios referentes manipulao de dados em objetos podem, ainda, ser executados pelo usurio dono
do objeto em questo. Usualmente, o dono de um objeto de banco de dados o usurio que o criou.
Removendo privilgios de um usurio
Aps o usurio ter recebido o privilegio para executar uma ao, ele ir manter esse privilgio at que o
mesmo seja explicitamente revogado. Para revogar um ou mais privilgios de um usurio, deve-se utilizar o
comando REVOKE. Sua estrutura simplificada mostrada a seguir:
REVOKE [GRANT OPTION FOR] PRIVILGIOS FROM NOME_PRIVILEGIADO
Como exemplo, consideremos que o usurio MARIA no deve mais possuir a habilidade de alterar dados da
tabela EDITORA. Para tal, pode-se executar comando como o apresentado a seguir.
REVOKE UPDATE ON EDITORA FROM MARIA
Consideremos, agora, que no deve mais ser permitido ao usurio MARIA atribuir a todos os outros usurios
o privilgio de atualizao da tabela LIVRO. Para tal, pode-se executar o comando apresentado a seguir, que
revoga essa habilidade do usurio em questo, mas tambm a possibilidade que o referido usurio possa
atualizar dados na tabela LIVRO.
REVOKE GRANT OPTION FOR UPDATE ON LIVRO FROM MARIA
Podemos ainda considerar a situao onde no mais deve ser permitido ao usurio realizar quaisquer aes
na tabela ASSUNTO. Para tal, pode-se executar o comando a seguir, que retira do usurio os privilgios para
executar aes na tabela ASSUNTO.
REVOKE ALL PRIVILEGES ON ASSUNTO FROM MARIA
Papis
Em um ambiente de banco de dados de produo podem existir diversos usurios e algumas centenas ou at
mesmo milhares de tabelas, entre outros objetos. Muitos dos usurios podem utilizar o mesmo conjunto de
objetos, devendo ter privilgios para executar conjuntos similares de aes.
Atribuir privilgios referentes a cada um dos objetos para cada usurio de forma individual pode ser uma
tarefa bastante trabalhosa. Alm disso, a medida que aumenta o nmero de tabelas ou outros objetos sobre as
quais cada usurio deve ter privilgios, aumenta tambm a probabilidade de que, por erro ou por esquecimento
254

pode ficar desapercebido num primeiro momento. No entanto, poder causar problemas mais graves, por
exemplo, quando a aplicao que utilize o usurio em questo para acessar o banco de dados esteja em
produo.
Para facilitar as tarefas de administrao do banco de dados relacionadas com a atribuio e revogao de
privilgios, e reduzir o nmero de erros nessas operaes, foi definido o conceito de Papel (Role).
Um Papel visa representar todas as aes que um ou mais usurios podem realizar no banco de dados.
Assim, aps criar um papel, necessrio atribuir-lhe todas as aes que representa. Em seguida, esse papel pode
ser atribudo a um ou mais usurios. Todos os usurios a quem o papel for atribudo recebero todos os
privilgios que foram atribudos ao papel em questo. A qualquer momento possvel atribuir ou revogar
privilgios de um papel, e atribuir ou revogar o papel de um ou mais usurios.
Desta forma, ao ser criado um novo usurio B que deva possuir os mesmos privilgios para execuo de
aes que outro usurio A j existente, podemos atribuir ao usurio B os mesmos papis que tiverem sido
atribudos ao usurio A.
Criando e utilizando Papis
Para criamos um papel, utilizamos o comando CREATE ROLE. Sua sintaxe simplificada a seguinte:
CREATE ROLE NOME-ROLE
Consideremos a base de dados de livros que ser utilizada por vrios usurios que podem ser agrupados
segundo dois diferentes perfis: um denominado BIBLIOTECA e outro denominado VISITANTE. Para criar esses
papis, utilizamos o comando a seguir:
CREATE ROLE BIBLIOTECA
CREATE ROLE VISITANTE
Os papis somente sero teis se a eles forem associados os privilgios aos quais correspondem. Para
aqueles que possurem o papel BIBLIOTECA, dever ser permitido realizar quaisquer operaes sobre os dados
das tabelas ASSUNTO, EDITORA, AUTOR, LIVRO e AUTOR_LIVRO. necessrio, ento, que tais privilgios sejam
atribudos ao papel BIBLIOTECA. Isto pode ser feito pelo comando GRANT, de forma similar ao que foi realizado
para a atribuio de privilgios para um usurio. Nesse caso, deve-se usar o nome do papel na posio de NOMEPRIVILEGIADO.
Os cinco comandos a seguir apresentam a atribuio dos privilgios para o papel BIBLIOTECA.
GRANT ALL PRIVILEGES ON ASSUNTO TO BIBLIOTECA
GRANT ALL PRIVILEGES ON EDITORA TO BIBLIOTECA
GRANT ALL PRIVILEGES ON AUTOR TO BIBLIOTECA
GRANT ALL PRIVILEGES ON LIVRO TO BIBLIOTECA
GRANT ALL PRIVILEGES ON AUTOR_LIVRO TO BIBLIOTECA
Alm de atribuir os privilgios ao papel, faz-se necessrio atribuir o papel a cada usurio que deva ter o perfil
em questo.
Caso deva ser permitido aos usurios MARIA, JOO e ANA o acesso completo aos dados das tabelas
ASSUNTO, EDITORA, AUTOR, LIVRO e AUTOR_LIVRO, podemos atribuir o papel BIBLIOTECA a tais usurios. Para
isso, utilizamos o comando GRANT de forma similar ao apresentado anteriormente. Porm, neste caso,
PRIVILGIOS ser substitudo pelo nome do papel. O NOME_PRIVILEGIADO ir se referir ao usurio que dever
possuir os mesmos privilgios que foram atribudos ao papel. O comando a seguir exemplifica a atribuio do
papel BIBLIOTECA aos usurios MARIA, JOO e ANA.
GRANT BIBLIOTECA TO MARIA, JOAO, ANA

255

Aps a execuo do comando anterior, os usurios MARIA, JOO e ANA podero executar todas as aes
definidas nos privilgios atribudos ao papel BIBLIOTECA.
Se considerarmos que, aps uma reavaliao dos critrios de segurana do banco de dados, seja definido, por
exemplo, que o papel BIBLIOTECA no deve ter acesso aos dados da tabela EDITORA, podemos revogar os
privilgios que possui com a utilizao do comando REVOKE.
A utilizao do comando REVOKE, nesse caso, ser similar apresentada anteriormente, sendo necessrio
que se utilize, como NOME_PRIVILEGIADO, o nome do papel em questo. O exemplo a seguir retira os privilgios
sobre a tabela EDITORA do papel BIBLIOTECA.
REVOKE ALL PRIVILEGES ON EDITORA FROM BIBLIOTECA
Ao executarmos o comando anterior, alguns privilgios para executar aes que so revogados do papel
BIBLIOTECA e, consequentemente, de todos os usurios que possuem o referido papel. Ou seja, segundo nosso
exemplo, os privilgios para executar aes sobre a tabela EDITORA foram removidos dos usurios MARIA, ANA e
JOO. De fato, se for necessrio atribuir um novo privilgio ou revogar um privilgio do papel que os usurios
possuem.
possvel, tambm, revogar de um usurio a sua participao em um papel. Para isso, tambm utilizado o
comando REVOKE. Neste caso, o nome do papel ser utilizado em PRIVILEGIOS e o nome do usurio em
NOME_PRIVILEGIADO.
Consideremos que o usurio ANA no deva mais ter os privilgios definidos para o papel BIBLIOTECA. O
exemplo a seguir revoga o referido papel do usurio ANA.
REVOKE BIBLIOTECA FROM ANA
Removendo Papis
Para removermos papis, podemos utilizar o comando DROP ROLE. Sua sintaxe bsica :
DROP ROLE NOME_ROLE
O comando a seguir exemplifica a excluso do papel BIBLIOTECA atravs do comando DROP ROLE.
DROP ROLE BIBLIOTECA
Ao removermos um papel, ele automaticamente retirado de todos os usurios a quem tenha sido atribudo.
Desta forma, no ser mais permitido aos usurios que executem as aes definidas no papel que foi removido, a
menos que os privilgios para tal sejam diretamente atribudos aos usurios ou que sejam atribudos atravs de
outros papis.
Com base nos exemplos anteriores, pode-se dizer que ao removermos o papel BIBLIOTECA, o usurio JOO
no ter mais privilgios para realizar aes sobre as tabelas LIVROS e LIVRO_AUTOR, dentre outras. Isso porque
nenhum privilegio sobre tais tabelas tinha sido explicitamente atribudo a este usurio. Todas as aes que ele
podia realizar sobre essas tabelas eram permitidas pois o usurio possua o papel BIBLIOTECA, ao qual foi, agora,
removido do sistema.

256

Transao e Concorrncia
Normalmente, considera-se que um conjunto de vrias operaes no banco de dados uma nica
unidade do ponto de vista do usurio. Por exemplo, a transferncia de fundos de uma conta corrente para uma
poupana uma operao nica sob o ponto de vista do cliente; dentro do sistema de banco de dados, porm,
ela envolve vrias operaes. Evidentemente, essencial a concluso de todo o conjunto de operaes, ou que,
no caso de uma falha, nenhuma delas ocorra. Seria inaceitvel o dbito na conta sem o crdito na poupana.
As operaes que formam uma nica unidade lgica de trabalho so chamadas de transaes. Um
sistema de banco de dados precisa garantir a execuo apropriada das transaes a despeito de falhas ou a
transao executada por completo ou nenhuma parte dela executada. Alm disso, ele deve administrar a
execuo simultnea de transaes de modo a evitar a ocorrncia de inconsistncias. Retornando a nosso
exemplo de transferncia de fundos, uma transao que calcula o total de dinheiro do cliente poderia trabalhar
com o saldo da conta corrente antes do dbito feito pela transao de transferncia e, tambm, verificar o saldo
da poupana depois do crdito. Com isso, obteria um resultado incorreto.
Conceito de Transao
Uma transao uma unidade de execuo de programa que acessa e, possivelmente, atualiza vrios
itens de dados. Uma transao, geralmente, o resultado da execuo de um programa de usurio escrito em
uma linguagem de manipulao de dados de alto nvel ou em uma linguagem de programao (p.e., SQL, COBOL,
C ou Pascal), e determinada por declaraes (ou chamadas de funo) da forma begin transaction e end
transaction. A transao consiste em todas as operaes ali executadas, entre o comeo e o fim da transao.
Para assegurar a integridade dos dados, exigimos que o sistema de banco de dados mantenha as
seguintes propriedades das transaes:
Atomicidade. Ou todas as operaes da transao so refletidas corretamente no banco de dados ou
nenhuma o ser.
Consistncia. A execuo de uma transao isolada (ou seja, sem a execuo concorrente de outra
transao) preserva a consistncia do banco de dados.
Isolamento. Embora diversas transaes possam ser executadas de forma concorrente, o sistema garante
que, para todo par de transaes Ti e Tj, Ti tem a sensao de que Tj terminou sua execuo antes de Ti
comear, ou que Tj comeou sua execuo aps Ti terminar. Assim, cada transao no toma
conhecimento de outras transaes concorrentes no sistema.
Durabilidade. Depois da transao completar-se com sucesso, as mudanas que ela faz no banco de
dados persistem, at mesmo se houver falhas no sistema.
Essas propriedades so chamadas frequentemente de propriedades ACID; o acrnimo derivado da
primeira letra de cada uma das quatro propriedades.
Para obter um melhor entendimento das propriedades ACID e da necessidade dessas propriedades,
vamos considerar um sistema bancrio simplificado que consiste em vrias contas e um conjunto de transaes
que acessam e atualizam essas contas. Por enquanto, vamos supor que o banco de dados reside
permanentemente em disco, mas que alguma parte dele reside, temporariamente, na memria principal.
O acesso ao banco de dados obtido pelas duas seguintes operaes:
read(X), que transfere o item de dados X do banco de dados para um buffer local alocado transao que
executou a operao de read.
write(X), que transfere o item de dados X do buffer local da transao que executou a write de volta ao
banco de dados.
Em um sistema de banco de dados real, a operao write (escrita) no resulta necessariamente na
atualizao imediata dos dados no disco; a operao write pode ser armazenada temporariamente na memria e
ser executada depois no disco. Mas, por enquanto, vamos supor que a operao write atualize o banco de dados
imediatamente.
257

Seja Ti uma transao que transfere 50 dlares da conta A para a conta B. Essa transao pode ser
definida como:

Vamos considerar cada uma das propriedades ACID (para facilidade de apresentao, vamos considera-las
em ordem diferente da ordem A-C-I-D).
Consistncia. A exigncia de consistncia aqui significa que a soma de A com B deve permanecer
inalterada aps a execuo da transao. Sem a exigncia de consistncia, uma soma em dinheiro poderia
ser criada ou destruda pela transao! Pode-se verificar facilmente que, se o banco de dados permanece
consistente depois da execuo da transao.
Assegurar a permanncia da consistncia aps uma transao em particular responsabilidade do
programador da aplicao que codifica a transao.

Atomicidade. Suponha que, exatamente antes da execuo da transao Ti, os valores das contas A e B
sejam 1000 e 2000 dlares, respectivamente. Agora suponha que, durante a execuo da transao Ti,
uma falha aconteceu impedindo Ti de se completar com sucesso. Exemplos desses tipos de falhas incluem
falta de energia, falhas de mquina e erros de software. Alm disso, suponha que a falha tenha ocorrido
depois da execuo da operao write(A), mas antes da operao write(B). Nesse caso, os valores das
contas A e B refletidas no banco de dados so 950 e 2000 dlares. Como resultado da falha sumiram 50
dlares. Em particular, notamos que a soma A+B j no preservada.

Assim, como resultado da falha, o estado do sistema no reflete mais de um estado real do mundo que se
supe representado no banco de dados. Chamamos esse estado de inconsistente. Devemos assegurar que essas
inconsistncias no sejam perceptveis em um sistema de banco de dados. Porm, observe que o sistema pode,
em algum momento, estar em um estado inconsistente. Mesmo que a transao Ti seja executada at o final, h
um ponto no qual o valor da conta A 950 dlares e o valor da conta B 2000 dlares, que claramente um
estado inconsistente. Porm esse estado dever ser substitudo pelo estado consistente em que o valor da conta
A 950 dlares e o valor da conta B 2050 dlares. Assim, se a transao nunca se iniciou ou se for garantida sua
execuo completa, esse estado incompatvel no seria visvel, exceto durante a execuo da transao. Essa a
razo da exigncia da atomicidade: se a propriedade de atomicidade for garantida, todas as aes da transao
sero refletidas no banco de dados ou nenhuma delas o ser.
A ideia bsica por trs da garantia da atomicidade a seguinte. O sistema de banco de dados mantm um
registro (em disco) dos antigos valores de quaisquer dados sobre os quais a transao executa uma gravao e, se
a transao no se completar, os valores antigos so restabelecidos para fazer com que parea que ela nunca foi
executada. Assegurar a atomicidade responsabilidade do prprio sistema de banco de dados, mais
especificamente ela tratada por um componente chamado de componente de gerenciamento de transaes.
Durabilidade. Se a transao se completar com sucesso, e o usurio que a disparou for notificado da
transferncia de fundos, isso significa que no houve nenhuma falha de sistema que tenha resultado em
perda de dados relativa a essa transferncia de capitais.
A propriedade de durabilidade garante que, uma vez completada a transao com sucesso, todas as atualizaes
realizadas no banco de dados persistiro, at mesmo se houver uma falha de sistema aps a transao se
completar.
Suponha agora que uma falha do sistema possa resultar em perda de dados na MP, mas que os dados
gravados em disco nunca sejam perdidos. Podemos garantir a durabilidade observando um dos seguintes itens:
258

1. As atualizaes realizadas pela transao foram gravadas em disco, antes da transao completar-se.
2. Informaes gravadas no disco, sobre as atualizaes realizadas pela transao, so suficientes para que o
banco de dados possa reconstruir essas atualizaes quando o sistema de banco de dados for reiniciado
aps uma falha.
Assegurar a durabilidade responsabilidade de um componente do sistema de banco de dados chamado
de componente de gerenciamento de recuperao. O componente de gerenciamento de transao e o
componente de gerenciamento de transao esto estreitamente relacionados.
Isolamento. Mesmo asseguradas as propriedades de consistncia e de atomicidade para cada transao,
quando diversas transaes concorrentes so executadas, suas operaes podem ser intercaladas de
modo inconveniente, resultando em um estado inconsistente.
Por exemplo, conforme vimos, o banco de dados fica temporariamente inconsistente, enquanto a
transao transfere fundos de A para B, quando o total reduzido j est escrito em A e o total a ser acrescidos
ainda est aguardando ser escrito em B. Se uma segunda transao, em execuo concorrente, ler A e B nesse
ponto intermedirio e computar A+B, observar um valor inconsistente. Alm disso, se essa segunda transao
executar em A e B atualizaes baseadas nos valores inconsistentes que leu, o banco de dados pode ficar em um
estado inconsistente mesmo aps ambas as transaes se completarem.
Uma soluo para o problema de execuo concorrente de transaes executar as transaes em srie
ou seja, uma aps a outra. Entretanto, a execuo simultnea de transaes proporcionam uma melhoria de
desempenho significativa. Por isso, foram desenvolvidas opes que permitem que diversas transaes sejam
executadas de modo concorrente.
Discutimos os problemas causados pela execuo de transaes concorrentes adiante. A propriedade de
isolamento de uma transao garante que a execuo simultnea de transaes resulte em uma situao no
sistema equivalente ao estado obtido caso as transaes tivessem sidos executadas uma de cada vez, em
qualquer ordem. Assegurar a propriedade de isolamento responsabilidade de um componente do sistema de
banco de dados chamado componente de controle de concorrncia e bem como a obedincia a seus princpios.

Estado da Transao
Na ausncia de falhas, todas as transaes completam-se com sucesso. Entretanto, como observamos
anteriormente, nem sempre uma transao pode completar-se com sucesso. Nesse caso, a transao abortada.
Se asseguramos a propriedade de atomicidade, uma transao abortada. Se assegurarmos a propriedade de
atomicidade, uma transao abortada no deve ter efeito sobre o estado do banco de dados. Assim, quaisquer
atualizaes que a transao abortada tiver feito no banco de dados devem ser desfeitas. Uma vez que as
mudanas causadas por uma transao abortada sejam desfeitas, dizemos que a transao foi desfeita (rolled
back retornada). Gerenciar transaes abortadas responsabilidade do esquema de recuperao.
Uma transao completada com sucesso chamada efetivada (committed). Uma transao que foi
efetivada e que realizou atualizaes transforma o banco de dados em um novo estado consistente que deve
persistir at mesmo se houver uma falha no sistema.
Uma vez que uma transao chegue efetivao (commit), no podemos desfazer seus efeitos
abortando-a. O nico modo de desfazer os efeitos de uma transao efetivada executar uma transao de
compensao, porm nem sempre isso possvel. Logo, a responsabilidade pela criao e execuo de uma
transao de compensao deixada a cargo do usurio, no sendo tratada pelo sistema de banco de dados.
Precisamos ser mais precisos sobre o que queremos dizer com trmino com sucesso de uma transao.
Portanto, estabeleceremos um modelo de transao simples e abstrato. Uma transao deve estar em um dos
seguintes estados:
Ativa, ou estado inicial; a transao permanece neste estado enquanto estiver executando.
Em efetivao parcial, aps a execuo da ltima declarao.
Em falha, aps a descoberta de que a execuo normal j no pode se realizar.
259

Abortada, depois que a transao foi desfeita e o banco de dados foi restabelecido ao estado anterior do
incio da execuo da transao.
Em efetivao, aps a concluso com sucesso.

O diagrama de estado correspondente a uma transao mostrado na fig. 13.1. Dizemos que uma
transao foi efetivada somente se ela entrou no estado de efetivao. Analogamente, dizemos que uma
transao abortou somente se ela entrou no estado de abortada. Uma transao dita concluda se estiver em
efetivao abortada.

Uma transao comea no estado ativo. Quando termina sua ltima declarao, ela entra no estado de
efetivao parcial.
Nesse momento, a transao completou sua execuo, mas ainda possvel ser abortada, j que seus
efeitos ainda podem estar na MP, e com isso uma falha de hardware pode impedir que seja completada com
sucesso.
Ento, o sistema de banco de dados escreve informaes suficientes no disco, de forma que, at mesmo
em uma falha eventual, as atualizaes realizadas pela transao possam ser recriadas quando o sistema for
reiniciado. Quando a ltima dessas informaes for escrita, a transao entre no estado de efetivao.
Conforme mencionamos anteriormente, por enquanto estaremos supondo que as falhas no resultam em
perda de dados no disco. Tcnicas para lidar com a perda de dados sero discutidas a seguir.
Uma transao entra no estado de falha quando o sistema determina que ela j no pode prosseguir sua
execuo normal (p.e., por causa de erros de hardware ou erros lgicos). Essa transao deve ser desfeita. Ela
entra, ento, no estado abortada. Nesse momento, o sistema tem duas opes:
Ele pode reiniciar a transao, mas somente se ela foi abortada como resultado de algum erro de
hardware ou de software no criado pela lgica interna da transao. Uma transao reiniciada
considerada uma transao nova.
Ele pode matar a transao. Normalmente, isso feito em decorrncia de algum erro lgico interno que
s pode ser corrigido refazendo o programa de aplicao, ou porque a entrada de dados no era
adequada ou porque os dados desejados no foram encontrados no banco de dados.
Devemos ser cautelosos quando tratamos de escritas externas observveis, como escrever em um
terminal ou em uma impressora. Uma escrita desse tipo no pode ser apagada, j que vista externamente ao
sistema de banco de dados. A maioria dos sistemas permite que essas escritas aconteam somente depois que
essas escritas aconteam somente depois que a transao entra no estado de efetivao. Um modo de
implementar esse esquema fazer com que o sistema de banco de dados armazene temporariamente, em um
meio de armazenamento no-voltil, qualquer valor associado a uma escrita externa, e fazer com que ele executa
a escrita real somente depois que a transao entra no estado de efetivao. Se o sistema falhar depois ter
entrado no estado de efetivao, mas antes de completar a escrita externa, quando o sistema for reiniciado, o
260

sistema de banco de dados executar a escrita externa (usando as informaes do meio de armazenamento novoltil).
Para certas aplicaes, pode ser conveniente permitir que transaes ativas exibam dados aos usurios,
particularmente em transaes de longa durao, de minutos ou horas. Infelizmente, no podemos permitir essas
sadas de dados, a menos que estejamos dispostos a comprometer a atomicidade da transao. A maioria dos
atuais sistemas de transao assegura a atomicidade e, por isso, probe essa forma de interao com usurios.
Implementao de Atomicidade e Durabilidade
O componente de gerenciamento de recuperao de um banco de dados implementa o suporte
atomicidade e durabilidade. Consideraremos primeiro um esquema simples, mas extremamente ineficiente. Esse
esquema supe que somente uma transao esteja ativa por vez, e baseia-se em cpias do banco de dados
simplesmente um arquivo no disco. Um ponteiro chamado db_pointer mantido no disco; ele aponta para a
cpia corrente do banco de dados.
No esquema de banco de dados shadow, uma transao que deseja atualizar o banco de dados primeiro
cria uma cpia completa dele. Todas as atualizaes so feitas na nova cpia, deixando a cpia original, chamada
cpia shadow, intata. Se, em qualquer momento, a transao tiver de ser abortada, simplesmente apaga-se a
novo cpia.
Se a transao se completa, sua efetivao ser feita conforme segue. Primeiro, o sistema operacional
precisa ter certeza de que todas as pginas da nova cpia do banco de dados tenham sido escritas no discos. Em
sistemas Unix, o comando flush (transportar, arrebatar) usada para esse propsito. Depois que o flush se
completa, o ponteiro db_pointer atualizado para apontar para a nova cpia do banco de dados e a esta se torna
a cpia atual. Ento, a cpia velha apagada. Esse esquema mostrado graficamente na fig. 13.2, em que o
estado do banco de dados, antes e aps a atualizao, indicado.

Diz-se que uma transao foi efetivada quando o db_pointer atualizado escrito no disco. Discutiremos,
agora, como essa tcnica trata as falhas de transao e de sistema. Primeiramente, consideremos a falha de
transao. Se a transao falhar antes da atualizao do db_pointer, o contedo antigo do banco de dados no
ser afetado. Simplesmente podemos abortar a transao apagando a cpia nova do banco de dados. Se a
transao foi efetivada, todas as atualizaes que ela executou esto no banco de dados apontado pelo
db_pointer. Assim, ou todas as atualizaes da transao so efetivadas ou nenhum de seus efeitos estaro
refletidos, a despeito da falha da transao.
Agora, considere uma falha do sistema. Suponha que a falha do sistema ocorra antes do db_pointer
atualizado ser escrito em disco. Quando o sistema reiniciar, ele ler o db_pointer, ver o contedo original do
banco de dados e nenhum dos efeitos da transao ser visvel no banco de dados. Agora, suponha que o sistema
falha depois que o db_pointer tiver sido atualizado em disco. Antes de atualizar o ponteiro, todas as pginas
atualizadas da nova cpia do banco de dados foram escritas no disco. Como mencionamos anteriormente,
estamos supondo que, uma vez escrito no disco, o contedo de um arquivo no seja danificado, nem mesmo se

261

houver uma falha de sistema. Portanto, quando o sistema reiniciar, ele ler o db_pointer e ver o contedo do
banco de dados depois de todas as atualizaes executadas pela transao.
Na verdade, a implementao depende da atomicidade da gravao em db_pointer; ou seja, todos os
seus bytes so escritos ou nenhum de seus bytes o ser. Se alguns dos bytes do ponteiro forem atualizados por
uma escrita, mas outros no, o ponteiro no ser representativo, e tanto a verso antiga do banco de dados
quanto a verso nova podem no ser encontradas quando o sistema for reiniciado. Felizmente, os sistemas de
disco fornecem atualizaes atmicas para blocos inteiros, ou pelo menos para um setor de disco. Em outras
palavras, o sistema de disco garante que atualizar o db_pointer atomicamente.
Assim, as propriedades de atomicidade e durabilidade das transaes so garantidas na tcnica de
implementao com cpia shadow, feita pelo componente de gerenciamento de recuperao.
Um exemplo simples de uma transao, fora do domnio de banco de dados, seria uma sesso de edio
de texto. Uma sesso de edio inteira pode ser modelada como uma transao. As aes executadas pela
transao so a leitura e a atualizao de um arquivo. Salvar o arquivo ao trmino da edio corresponde
efetivao da transao de edio; sair da sesso do editor sem salvar o arquivo corresponde a abortar a
transao de edio.
Muitos editores de texto usam essencialmente a implementao descrita acima, para garantir que a
sesso de edio seja transacional. Um arquivo novo usado para armazenar o arquivo atualizado. Ao trmino da
sesso de edio, se o arquivo atualizado for salvo, um comando de arquivo rename usado para rebatizar o
arquivo novo com seu nome corrente. Supe-se que o rename seja implementado como uma operao atmica
pelo sistema de arquivo subjacente, e que ele tambm apagar o arquivo antigo.
Infelizmente, essa implementao extremamente ineficiente no contexto dos grandes banco de dados,
j que a execuo de uma nica transao implica copiar o banco de dados inteiro. Alm disso, essa
implementao no permite que transaes concorram uma com as outras. H maneiras prticas de implementar
a atomicidade e a durabilidade que so muito menos onerosas e mais poderosas.
Execues Concorrentes
Os sistemas de processamento de transaes, normalmente, permitem que diversas transaes sejam
executadas de modo concorrente. Permitir que mltiplas transaes concorram na atualizao de dados traz
diversas complicaes em relao consistncia desses dados, conforme vimos anteriormente. Assegura a
consistncia, apesar da execuo concorrente de transaes, exige trabalho adicional; muito mais fcil insistir
na execuo de transaes sequencialmente, uma de cada vez, cada uma comeando somente depois que a
anterior se completou. Porm, h duas boas razoes para permitir a concorrncia.
Uma transao consiste em diversos passos. Alguns envolvem atividade de I/O; outros atividades de CPU.
A CPU e os discos em um sistema de computador podem operar em paralelo. Logo, a atividade de I/O
pode ser feita em paralelo com o processamento na CPU. Assim, o paralelismo entre CPU e o sistema de
I/O pode ser explorado para executar diversas transaes em paralelo. Enquanto uma leitura ou escrita
solicitada por uma transao est em desenvolvimento em um disco, outra transao pode estar sendo
processada na CPU, e outro disco pode estar executando uma leitura ou escrita solicitada por uma
terceira transao. Desse modo, h um aumento no throughput do sistema ou seja, no nmero de
transaes que podem ser executadas em um determinado tempo. De forma correspondente, o uso do
processador e do disco tambm aumentam; em outras palavras, o processador e o disco ficam menos
tempo inativos ou sem executar trabalho til.
Pode haver uma mistura de transaes em execuo simultnea no sistema, algumas curtas e outras
longas. Se a execuo das transaes for sequencial, uma transao curta pode ser obrigada a esperar at
que uma transao longa precedente se complete, o que pode gerar atrasos imprevisveis em sua
execuo. Se as transaes esto operando em diferentes partes do banco de dados, melhor deixa-las
concorre de modo a compartilhar os ciclos de CPU e os acessos de disco entre si. A execuo concorrente
reduz os atrasos imprevisveis na execuo. Se as transaes esto operando em diferentes partes do
262

banco de dados, melhor deixa-las concorrer de modo a compartilhar os ciclos de CPU e os acessos de
disco entre si. Alm disso, reduz tambm o tempo mdio de resposta: o tempo mdio para uma
transao ser completada aps ser submetida.
A motivao para usar a execuo concorrente em um banco de dados essencialmente a mesma para
usar a multiprogramao em um sistema operacional.
Quando vrias transaes so processadas de modo concorrente, a consistncia do banco de dados pode
ser destruda, mesmo que cada transao individual seja executada com correo. Vamos agora apresentar o
conceito de escalas de execuo (schedules), para ajudar na identificao de quais ordens de execuo podem
garantir a manuteno da consistncia.
O sistema de banco de dados deve controlar a interao entre as transaes concorrentes para impedi-las
de destruir sua consistncia. Isso feito por meio de uma variedade de mecanismos chamados de esquemas de
controle de concorrncia.
Considere, novamente, o sistema bancrio simplificado j apresentado, que possui diversas contas, alm
de um conjunto de transaes que acessa e atualiza essa contas. Sejam T1 e T2 duas transaes que transferem
fundos de uma conta para outra. A transao T1 transfere 50 dlares da conta A para a conta B e definida da
seguinte forma:

A transao T2 transfere 10 por cento do saldo da conta A para a conta B e definida da seguinte forma:

Sejam mil e dois mil dlares os valores correntes das contas A e B, respectivamente. Suponha que as duas
transaes sejam executadas em sequncia, T1 seguida de T2. Essa sequncia de execuo representada na fig.
13.3. A sequncia dos passos das instrues esto em ordem cronolgica a partir do topo da figura, com as
instrues de T1 aparecendo na coluna esquerda e as instrues de T2 aparecendo na coluna direita. Depois
que a execuo apresentada na fig. 13.3 terminar, os valores nas contas A e B so 855 e 2145 dlares,
respectivamente. Assim, o montante de dinheiro das contas A e B ou seja, a soma A+B preservado depois da
execuo de ambas as transaes.

263

Analogamente, se as transaes forem executadas em outra sequncia, desta vez T2 seguida de T1, ento
a sequncia de execuo correspondente mostrada na fig. 13.4. Novamente, conforme esperado, a soma A+B
preservada, e os valores finais das contas A e B so 850 e 2150 dlares, respectivamente.
As sequncias de execuo descritas anteriormente so chamadas de escalas de execuo ou escalas. Elas
representam a ordem cronolgica por meio da qual as instrues so executadas no sistema. Claramente, uma
determinada escala de execuo de um conjunto de transaes consiste em todas as instrues dessas transaes
e deve preservar a ordem na qual as instrues aparecem em cada transao individual. Por exemplo, na
transao T1, a instruo write(A) deve aparecer antes da instruo read(B), em qualquer escala vlida. Na
discusso a seguir, iremos nos referir primeira sequncia de execuo (T1 seguida de T2) como escala 1 e
segunda sequncia de execuo (T2 seguida de T1) como escala 2.

Essas escalas de execuo so sequenciais. Cada escala sequencial consiste em uma sequncia de
instrues de vrias transaes em que as instrues que pertencem a uma nica transao aparecem agrupadas.
Assim, para um conjunto de n transaes, h n! escalas sequenciais vlidas diferentes.
Quando vrias transaes so executadas simultaneamente, a escala correspondente pode j no ser
sequencial. Se duas transaes so executadas simultaneamente, o sistema operacional pode executar uma
transao durante algum tempo e, ento, voltar primeira transao durante algum tempo e assim por diante,
alternadamente. Com diversas transaes, o tempo de CPU compartilhado entre todas.
Vrias sequncias de execuo so possveis, j que as vrias instrues, de ambas as transaes podem
ser intercaladas. Geralmente, no possvel exatamente prever quantas instrues de uma transao sero
executadas antes que a CPU alterne para outra transao. Assim, o nmero de escalas de execuo possveis para
um conjunto de n transaes muito maior que n!
264

Retornando ao nosso exemplo anterior, suponha que as duas transaes sejam executadas de modo
concorrente. Uma escala de execuo possvel mostrada na fig. 13.5. Aps essa execuo, chegamos ao mesmo
estado obtido durante a execuo sequencial na ordem T1 seguida de T2. A soma A+B preservada.

Nem todas as execues concorrentes resultam em um estado correto. Para ilustrar, considere a escala
de execuo da fig. 13.6. Depois de sua execuo, chegamos a um estado tal que os valores para as contas A e B
so 950 e 2100 dlares, respectivamente. Esse estado final um estado inconsistente, j que apareceram 50
dlares durante a execuo concorrente. Realmente, a soma A+B no preservada na execuo das duas
transaes.

Se o controle da execuo concorrente deixado completamente sob a responsabilidade do sistema


operacional, muitas escalas de execuo possveis, inclusive aquelas que deixam o banco de dados em um estado
inconsistente como a descrita anteriormente, so factveis. uma tarefa do sistema de banco de dados garantir
que qualquer escala executada deixe o banco de dados em estado consistente. O componente do sistema de
banco de dados que executa esta tarefa chamado de componente de controle de concorrncia.
Podemos assegurar a consistncia do banco de dados, sob execuo concorrente, garantindo que
qualquer escala executada tenho o mesmo efeito de outra que tivesse sido executada sem qualquer
concorrncia. Isto , uma escala de execuo deve, de alguma forma, ser equivalente a uma escala sequencial.
Serializao
O sistema de banco de dados deve controlar a execuo concorrente de transaes para assegurar que o
estado do banco de dados permanea consistente. Antes de examinarmos como o sistema de banco de dados
pode cumprir essa tarefa, temos de entender primeiro quais escalas de execuo podem garantir a consistente e
quais no iro faz-lo.
265

Considerando que as transaes so programas, difcil, pelo carter da computao, determinar quais
so as operaes exatas que uma transao executa, e como as operaes de vrias transaes interagem. Por
essa razo, no faremos interpretaes sobre o tipo de operaes que uma transao pode executar em um item
de dados. Em vez disso, consideraremos apenas duas operaes: read (leitura) e write (escrita). Supomos assim
que, entre uma instruo read (Q) e write(Q) em um item de dado Q, uma transao pode executar uma
sequncia arbitrria de operaes na cpia de Q, que est residindo no buffer local no qual se processa a
transao. Assim, as nicas operaes significativas de uma transao, do ponto de vista da escala de execuo,
so suas instrues de leitura e escrita. Por isso, mostraremos apenas as instrues read e write nas escalas de
execuo, conforme fizemos na representao da escala 3 que mostrada na fig. 13.7.

Vamos discutir formas de equivalncia entre escalas de execuo; elas conduzem s noes de
serializao de conflito e de viso serializada.
Serializao de Conflito
Vamos considerar uma escala de execuo S com duas instrues sucessivas, Ii e Ij, das transaes Ti e Tj
(ij), respectivamente. Se Ii e Ij referem-se a itens de dados diferentes, ento podemos alternar Ii e Ij sem afetar os
resultados de qualquer instruo da escala. Porm, se Ii e Ij referem-se ao mesmo item de dados Q, ento a
ordem de dois passos pode importar. Como estamos lidando apenas com instrues read e write, h quatro casos
a considerar:

Assim, apenas no caso em que ambas, Ii e Ij, so instrues de read a ordem relativa de suas execues
no importante.
Dizemos que Ii e Ij entram em conflito caso elas sejam operaes pertencentes a diferentes transaes,
agindo no mesmo item de dado, e pelo menos uma dessas instrues uma operao de write.
Para ilustrar o conceito de operaes conflitantes consideraremos a escala 3 mostrada na fig. 13.7. A
instruo write (A) de T1 entra em conflito com a instruo read(A) de T2. Porm, a instruo write(A) de T2 no
est em conflito com a instruo read(B) de T1, porque as duas instrues trabalham itens de dados diferentes.
Sejam Ii e Ij instrues consecutivas de uma escala de execuo S. Se Ii e Ij so instrues de transaes
diferentes e no entram em conflito, ento podemos trocar a ordem de Ii e Ij para produzir uma nova escala de
266

execuo S. Esperamos que S seja equivalente a S, j que todas as instrues aparecem na mesma ordem em
ambas as escalas de execuo com exceo de Ii e Ij , cuja ordem no importa.
Como a instruo write(A) de T2 na escala 3 da fig. 13.7 no entra em conflito com a instruo read(B) de
T1, podemos trocar essas instrues para gerar uma escala de execuo equivalente, a escala 5, conforme mostra
a fig. 13.8. A despeito do estado inicial do sistema, ambas as escalas, 3 e 5, produzem o mesmo estado final no
sistema.

Continuaremos a trocar instrues no-conflitantes conforme segue:


Trocar a instruo read(B) de T1 pela instruo read(A) de T2.
Trocar a instruo write(B) de T1 pela instruo write(A) de T2.
Trocar a instruo write(B) de T1 pela instruo read(A) de T2.

O resultado final dessas trocas, conforme mostrado na escala 6 da fig. 13.9, uma escala de execuo
sequencial. Assim, mostramos que a escala 3 equivalente a uma escala de execuo sequencial. Essa
equivalncia implica que, a despeito do estado inicial do sistema, a escala 3 produzir o mesmo estado final
produzido por alguma escala sequencial.

Se uma escala de execuo S puder ser transformada em outra, S, por uma srie de trocas de instrues
no-conflitantes, dizemos que S e S so equivalentes no conflito.
Retornando a nossos exemplos anteriores, observamos que a escala 1 no equivalente no conflito
escala 2. Entretanto, a escala 1 equivalente no conflito escala 3, porque as instrues read(B) e write(B) de T1
podem ser trocadas pelas instrues read(A) e write(A) de T2.
O conceito de equivalncia no conflito leva ao conceito de serializao de conflito. Dizemos que uma
escala de execuo S conflito serializava se ela equivalente no conflito a uma escala de execuo sequencial.
Assim, a escala 3 conflito serializava, j que ela equivalente no conflito escala sequencial 1.
Finalmente, considere a escala 7 da fig. 13.10; ela consiste somente nas operaes significativas (ou seja,
read e write) das transaes T3 e T4. Essa escala de execuo no conflito serializava, j que no equivalente
escala sequencial <T3, T4> ou escala sequencial <T4, T3>.

267

possvel ter duas escalas de execuo que produzam o mesmo resultado, mas que no sejam
equivalentes no conflito. Por exemplo, considere a transao T5, que transfere 10 dlares da conta B para a conta
A. Seja a escala 8 definida na fig. 13.11. Verificamos que a escala 8 no equivalente no conflito escala
sequencial <T1, T5>, j que, na escala 8, a instruo write(B) de T5 entra em conflito com a instruo read(B) de T1.
Assim, apenas pela troca de instrues consecutivas no conflitantes, no conseguimos mover todas as instrues
de T1 antes daquelas de T5. Porm, os valores finais das contas A e B depois da execuo da escala 8 ou da escala
sequencial <T1, T5> so os mesmos isto , 960, e 2040 dlares, respectivamente.

Podemos ver nesse exemplo que h definies menos triviais de equivalncia de escala que a
equivalncia de conflito. Para o sistema determinar se a escala 8 produz o mesmo resultado que a escala
sequencial <T1, T5>, ele tem de analisar toda computao executada por T1 e T5, em vez de analisar apenas as
operaes read e write. Em geral, tal anlise difcil de implementar e onerosa em termos computacionais.
Porm, h outras definies de equivalncia entre escalas de execuo baseadas puramente nas operaes read
e write.
Viso Serializada
Vamos considerar uma forma de equivalncia que menos restritiva que a equivalncia de conflito,
embora, assim como a equivalncia de conflito, esteja baseada apenas nas operaes read e write das
transaes.
Considere duas escalas de execuo S e S, com o mesmo conjunto de transaes participando de ambas.
As escalas S e S so ditas equivalente na viso se as trs condies seguintes forem satisfeitas:
1. Para cada item de dados Q, se a transao Ti fizer uma leitura no valor inicial de Q na escala S, ento a
transao Ti tambm deve, na escala S, ler o valor inicial de Q.
2. Para cada item de dados Q, se a transao Ti executar um read(Q) na escala S, e aquele valor foi
produzido por meio da transao Tj (se houver), ento a transao Ti tambm dever, na escala S, ler o
valor de Q que foi produzido por meio da transao Tj.
3. Para cada item de dados Q, a transao (se houver) que executa a operao final write(Q) na escala S tem
de executar a operao write(Q) final na escala S.

268

As condies 1 e 2 asseguram que cada transao l os mesmos valores em ambas as escalas e, ento,
executa a mesma computao. A condio 3, em conjunto com as condies 1 e 2, assegura que ambas as escalas
de execuo resultem no mesmo estado final de sistema.
Retornando a nossos exemplos anteriores, notamos que a escala 1 no equivalente em viso escala 2,
j que, na escala 1, o valor da conta A lido pela transao T2 foi produzido por T1, enquanto isso no ocorre na
escala 2. Porm, a escala 1 equivalente em viso escala 3, porque os valor da conta A e B lidos pela transao
T2 foram produzidos por T1 em ambas as escalas.
O conceito de equivalncia de viso leva ao conceito de serializao de viso. Dizemos que uma escala de
execuo S tem viso serializada se for equivalente, em viso, a uma escala de execuo sequencial.
Para ilustrar, suponha que aumentemos a escala 7 com a incluso da transao T6 obtendo a escala 9,
conforme pode ser visto na fig. 13.12. A escala 9 a viso serializada. De fato, ela equivalente em viso escala
sequencial <T3, T4, T6>, j que uma instruo read(Q) l o valor inicial de Q em ambas as escalas, e T6 executa a
escrita final de Q em ambas as escalas.

Toda escala conflito serializava viso serializava, mas h escala viso serializava que no so conflito
serializava. Realmente, a escala 9 no conflito serializava, uma vez que qualquer par de instrues consecutivas
conflitante e, assim, no possvel nenhuma troca de instrues.
Observe que, na escala 9, as transaes T4 e T6 executam operaes write(Q) sem terem executado uma
operao read(Q). Esse tipo de escrita chamado de escrita cega (blind write). As escritas cegas aparecem em
algumas escalas viso serializava que no so conflito serializava.
Recuperao
At o momento, estudamos quais escalas de execuo so aceitveis do ponto de vista da consistncia do
banco de dados, supondo, de modo implcito, que no ocorram falhas de transao. Veremos agora os efeitos das
falhas de transao durante a execuo concorrente.
Se uma transao Ti falhar, por qualquer razo, precisamos desfazer seus efeitos para garantir a
propriedade de atomicidade da transao. Em um sistema que permite execuo concorrente, tambm
necessrio assegurar que qualquer transao Tj que seja dependente de Ti (quer dizer, Tj leu dados escritos por Ti)
tambm seja abortada. Para alcanar essa segurana, precisamos colocar restries no tipo de escalas permitidas
no sistema.
Escala de Execuo Recuperveis
Considere a escala 11, mostrada na fig. 13.13, na qual T9 uma transao que executa apenas uma
instruo: read(A). Suponha que o sistema permita que T9 seja efetivada imediatamente aps executar a
instruo read(A). Assim, T9 efetivada antes que T8 o seja. Agora, suponha que T8 falhe antes da efetivao.
Como T9 leu o valor do item de dados A escrito por T8, temos de abortar T9 para assegurar a atomicidade da
transao. Porm, T9 j foi efetivada e no poder ser abortada. Assim, temos uma situao em que impossvel
se recuperar corretamente da falha de T8.

269

A escala 11, com a efetivao acontecendo imediatamente aps a instruo read(A), um exemplo de
escala de execuo no-recupervel que, portanto, no deveria ser permitida. A maioria dos sistemas de banco
de dados exige que todas as escalas sejam recuperveis. Uma escala recupervel aquela na qual, para cada par
de transaes Ti e Tj, tal que Tj leia itens de dados previamente escritos por Ti, a operao de efetivao de Ti
aparea antes da operao de efetivao de Tj.
Escalas sem cascata
Mesmo em uma escala recupervel, para o sistema recuperar-se corretamente da falha de transao Ti,
pode ser que seja necessrio desfazer diversas transaes. Tais situaes ocorrem se as transaes leram dados
escritos por Ti. Como ilustrao, considere a escala parcial da fig. 13.14. A transao T10 escreve um valor para A
que lido pela transao T11. A transao T11 escreve um valor para A que lido pela transao T11. Suponha que,
nesse momento, T10 falhe. T10 dever ser desfeita. Como T11 dependente de T10, T11 dever ser desfeita. Como
T12 dependente de T11, T12 dever ser desfeita. Esse fenmeno, no qual a falha de uma nica transao conduz a
uma srie de reverses de transao, chamado de retorno em cascata (cascading rollback).

O retorno em cascata indesejvel, j que leva a desfazer uma quantia significativa de trabalho.
conveniente restringir as escalas quelas nas quais os retornos em cascata no possam acontecer. Tais escalas so
chamadas de escalas sem cascata. Uma escala sem cascata aquela na qual cada par de transaes Ti e Tj, tal que
Tj leia um item de dados previamente escrito por Ti, a operao de efetivao de Ti aparea antes da operao de
leitura de Tj. fcil verificar que toda escala sem cascata tambm recupervel.
Implementao do Isolamento
At o momento, vimos quais propriedades uma escala deve ter para deixar o banco de dados em um
estado consistente e para permitir o tratamento seguro de possveis falhas de transao. Especificamente, as
escalas que so conflito ou viso serializava e sem cascata satisfazem essas exigncias.
H vrios esquemas de controle de concorrncia que podemos usar para garantir que, at mesmo quando
diversas transaes so executadas de modo concorrente, sejam geradas apenas escalas aceitveis, a despeito de
como o sistema operacional compartilha os recursos (como o tempo de CPU) entre as transaes.
Como um exemplo trivial de um esquema de controle de concorrncia, considere este: uma transao
bloqueia (lock) o banco de dados inteiro antes de comear e libera o bloqueio aps sua efetivao. Enquanto uma
transao mantm um bloqueio, nenhuma outra tem permisso para realizar um bloqueio, todas elas so
obrigadas a esperar sua liberao. Como resultado dessa poltica de bloqueio, apenas uma transao pode
executar um bloqueio de cada vez. Logo, so geradas apenas escalas sequenciais. Estas so trivialmente
serializveis e fcil verificar que so tambm sem cascata.

270

Um esquema de controle de concorrncia como esse apresenta um desempenho pobre, j que fora as
transaes a esperarem o trmino das precedentes antes que possam comear. Em outras palavras, ele
possibilita um baixo grau de concorrncia. A execuo concorrente traz vrios benefcios em relao ao
desempenho.
O objetivo dos esquemas de controle de concorrncia proporcionar um alto grau de concorrncia,
enquanto garante que todas as escalas geradas sejam conflito serializava ou viso serializava, e tambm sejam
em cascata.
Os esquemas tm diferentes caractersticas em termos do grau de concorrncia observado e da
quantidade de overhead em que incorrem. Alguns deles permite que apenas escalas conflito serializava sejam
geradas, outros permite que escalas viso serializvel, que no so conflito serializava, tambm sejam geradas.
Definio de Transao em SQL
Uma linguagem de manipulao de dados deve possuir um construtor para especificar o conjunto de
aes que constitui uma transao.
O padro SQL especifica que uma transao comea de modo subentendido. As transaes so
terminadas por uma das seguintes declaraes SQL:
Commit work executa a efetivao da transao corrente e comea uma nova.
Rollback work aborta a transao corrente.
A palavra-chave work opcional em ambas as declaraes. Se um programa termina sem um desses
comandos, as atualizaes so efetivadas ou desfeitas a escolha no especificada pelo padro, e
dependente da implementao.
O padro especifica tambm que o sistema deve assegurar a serializao e retorno sem cascata. A
definio de serializao usada pelo padro a que estabelece que uma escala deve ter o mesmo efeito de uma
escala sequencial. Assim, tanto serializao de conflito quanto serializao de viso so aceitveis.
O padro SQL-92 tambm permite que se estabelea para uma transao uma execuo de modo no
serializava em relao a outras transaes. Por exemplo, uma transao pode operar em nvel de read sem
efetivao (read uncommitted), permitindo que as transaes leiam registros mesmo sem suas efetivaes. Essa
caractersticas oferecida para transaes longas, cujos resultados no precisam ser exatos. Por exemplo, uma
informao aproximada geralmente suficiente para estatsticas usadas na otimizao de consultas. Se essas
transaes forem executadas de uma maneira serializava, elas poderiam interferir em outras transaes,
provocando atrasos.
O nvel de consistncia especificado pela SQL-92 :
Serializvel o default (padro).
Read repetitivo somente permite leitura de registros que sofreram efetivao e, alm disso, exige que
nenhuma outra transao consiga atualizar um registro entre duas leituras feitas por uma transao.
Entretanto, a transao pode no ser serializava com respeito a outras transaes. Por exemplo, quando
se est procurando registros que satisfaam algumas condies, uma transao pode achar alguns dos
registros inseridos por uma transao que sofreu efetivao, mas no encontrar os outros.
Read com efetivao permite que apenas registros que sofreram efetivao sejam lidos, mas no exige
read repetitivo. Por exemplo, entre duas leituras de um registro feitas por uma transao, os registros
podem ter sido atualizados por meio de transaes que obtiveram efetivao.
Read sem efetivao permite a leitura de registros que no sofreram efetivao. o nvel mais baixo de
consistncia permitido pela SQL-92.
Teste de Serializao
Ao projetar esquemas de controle de concorrncia, devemos mostrar que as escalas geradas por eles so
serializveis. Para faz-lo, primeiro temos de entender como determinar, para uma escala S em particular, se ela
serializava. Nesta seo, apresentaremos mtodos para determinar serializao de conflito e serializao de viso.
271

Mostraremos que h um algoritmo simples e eficiente para determinar a serializao de conflito. Entretanto, no
h nenhum algoritmo eficiente para determinar a serializao de viso.
Teste para Serializao de Conflito
Seja S uma escala. Construmos um grfico direcionado, chamado grfico de precedncia de S. Esse
grfico consiste em um par G=(V,E), em que V um conjunto de vrtices e E um conjunto de arestas. O conjunto
de vrtices consiste em todas as transaes que participam da escala. O conjunto de arestas consiste em todas as
transaes que participam da escala. O conjunto de arestas consiste em todas as arestas TiTj para as quais uma
das seguintes condies se verifica:
1. Ti executa write(Q) antes de Tj executar read(Q).
2. Ti executa read(Q) antes de Tj executar write(Q).
3. Ti executa write(Q) antes de Tj executar write(Q).
Se h uma aresta TiTj no grfico de precedncia, ento, em qualquer escala sequencial S equivalente a
S, Ti deve aparecer antes de Tj.
Por exemplo, o grfico de precedncia para a escala 1 mostrado na fig. 13.15a. Ele contm a nica
aresta T1T2, j que todas as instrues de T1 so executadas antes da primeira instruo de T2 ser executada. De
forma semelhante, a fig. 13.15b mostra o grfico de precedncia para a escala 2 com a nica aresta T2T1, j que
todas as instrues de T2 so executadas antes da primeira instruo de T1 ser executada.

O grfico de precedncia para a escala 4 mostrado na fig. 13.16. Ele contm a aresta T1T2, porque T1
executa read(A) antes de T2 executar write(A). Ele tambm contm a aresta T2T1, porque T2 executa read(B)
antes de T1 executar write(B).
Se o grfico de precedncia para S tem um ciclo, ento a escala S no conflito serializava. A ordem de
serializao pode ser obtida por meio da classificao topolgica, que estabelece uma ordem linear consistente
com a ordem parcial do grfico de precedncia. Em geral, vrias ordens lineares possveis podem ser obtidas por
meio da classificao topolgica. Por exemplo, o grfico da fig. 13.17a possui ordens lineares aceitveis, conforme
ilustrado pelas fig. 13.17b e 13.17c.
Assim, para testar a serializao de conflito, precisamos construir o grfico de precedncia e evocar um
algoritmo de deteco de ciclos. Algoritmos de deteco de ciclos podem ser encontrados em livros-texto sobre
algoritmos. Os algoritmos de deteco de ciclos, como aqueles baseados em depth-first search, so da ordem de
n2 operaes, em que n o nmero de vrtices no grfico (ou seja, o nmero de transaes). Assim, temos um
esquema prtico para determinar a serializao de conflito.
Retornando a nossos exemplos anteriores, observe que os grficos de precedncia para as escalas 1 e 2
(fig. 13.15) realmente no contm ciclos. O grfico de precedncia para a escala 4 (fig. 13.16), por outro lado,
contm um ciclo que indica que essa escala no conflito serializava.
Teste para Serializao de Viso
Podemos modificar o teste do grfico de precedncia para serializao de viso, conforme mostraremos a
seguir. Entretanto, o teste resultante oneroso em relao ao tempo de CPU. De fato, testar serializao de viso
um problema caro em termos computacionais, como veremos posteriormente.

272

No teste para serializao de conflito, sabemos que, se duas transaes, Ti e Tj, tm acesso a um item de
dados Q, e pelo menos uma dessas transaes escreve Q, ento a aresta TiTj ou a aresta TjTi ser inserida no
grfico de precedncia. Porm, isto no mais ocorre no teste para serializao de viso. Como veremos em breve,
essa diferena a razo da incapacidade em se chegar a um algoritmo eficiente para esse teste.
Considere a escala 9 da fig. 13.12. Se seguirmos a regra do teste para serializao de conflito e criamos o
grfico de precedncia, obteremos o grfico da fig. 13.18. O grfico contm um ciclo indicando que a escala 9 no
conflito serializava. Entretanto, como vimos anteriormente, a escala 9 viso serializava, j que ela
equivalente em viso escala sequencial <T3, T4, T6>. A aresta T4T3 no deveria ter sido inserida no grfico, j
que os valores do item Q produzidos por T3 e T4 no foram usados por quaisquer outras transaes, e T6 produziu
um valor final novo de Q. As instrues write(Q) de T3 e T4 so chamadas de gravaes inteis.

Com isso, mostramos que no podemos simplesmente usar o esquema de grfico de precedncia citado
anteriormente para testar serializao de viso. Precisamos desenvolver um esquema para decidir se uma aresta
deve ou no ser inserida no grfico de precedncia.
Seja S uma escala. Suponha que a transao Tj leia o valor do item de dado Q escrito por Ti. claro que, se
S viso serializava, ento, em qualquer escalar que S seja equivalente a S, Ti deve preceder Tj. Suponha agora
que, na escala S, a transao Tk executou uma write(Q). Ento, na escala S, Tk deve preceder Ti ou deve seguir Tj.
273

Ela no poder aparecer entre Ti e Tj, porque dessa forma Tj no leria o valor de Q escrito por Ti e, assim, S no
seria equivalente em viso a S.
Tais requisitos no podem ser expressos no modelo simples de grfico de precedncia discutido
anteriormente. A dificuldade acontece porque sabemos que, no exemplo precedente, um dos pares de arestas,
TkTi ou TjTk, dever ser inserido no grfico, mas no temos, contudo, formulada a regra para determinar qual
a escolha apropriada.
Para formul-la, precisamos expandir o grfico de precedncia de modo a incorporar as arestas rotuladas.
Chamamos esse grfico de grfico de precedncia rotulado. Como antes, os ns do grfico so as transaes que
participam da escala. As regras para a insero de arestas rotuladas so descritas a seguir.
Seja S uma escala que consiste nas transaes {T1, T2, ..., Tn}. Sejam Tb e Tf duas transaes fictcias, tais
que Tb execute write(Q) para todo Q que sofreu acesso em S e Tf, execute uma read(Q) para todo Q que sofreu
acesso em S. Construmos uma nova escala S a partir de S por meio da insero de Tb no incio de S e do
acrscimo de Tf no final de S. Construmos o grfico de precedncia rotulado para a escala S conforme segue:
1. Adicione uma aresta
, se a transao Tj l o valor do item de dados Q escrito pela transao Ti.
2. Remova todas as arestas que incidam em transaes inteis. Uma transao Ti intil se no houver
caminho, no grfico de precedncia, de Ti para a transao Tf.
3. Para todo item de dados Q, tal que Tj l o valor de Q escrito por Ti, Tk executa um write(Q) e TkTb, faa o
seguinte:
no grfico de precedncia rotulado.
a. Se Ti=Tb e TjTf, ento insira a aresta
b. Se TiTb e Tj=Tf, ento insira a aresta
no grfico de precedncia rotulado.
c. Se Ti=Tb e TjTf, ento insira o par de arestas
e
no grfico de precedncia rotulado,
em que p um inteiro maior que 0 que no tenha sido usado anteriormente para rotular arestas.
A regra 3c determina que, se Ti escrever um item de dados lido por Tj, ento uma transao Tk que escreva o
mesmo item de dados deve vir antes de Ti ou depois de Tj. As regras 3a e 3b so casos especiais resultantes do
fato de que, necessariamente, Tb e Tf so a primeira e a ltima transao, respectivamente. Quando aplicamos a
regra 3c, no estamos exigindo que Tk esteja simultaneamente antes de Ti e depois de Tj. Em vez disso,
poderemos escolher onde Tk aparecer, em uma ordem sequencial equivalente.
Como ilustrao, considere novamente a escala 7 (fig. 13.10). O grfico construdo pelos passos 1 e 2
mostrado na fig. 13.19a. Ele contm a aresta
, j que T3 l o valor de Q escrito por Tb. ele contm a aresta
, j que T3 foi a ltima transao que escreveu Q e, assim, Tf leu aquele valor. O grfico final que
corresponde escala 7 mostrado na fig. 13.19b. Ele contm a aresta
resultante do passo 3a. Ele contm
a aresta
como resultado do passo 3b.

274

Agora, considere a escala 9 (fig. 13.12). O grfico construdo nos passos 1 e 2 mostrado na fig. 13.20a. O
grfico final mostrado na fig. 13.20b. Ele contm as arestas
e
como resultado do passo 3a. Contm
as arestas
(j no grfico) e
como resultado do passo 3b.

Finalmente, considere a escala 10 da fig. 13.21. A escala 10 viso serializava, j que equivalente em
viso escala sequencial <T3, T4, T7>. O grfico de precedncia rotulado correspondente, construdo nos passos 1
e 2 mostrado na fig. 13.22a. O grfico final mostrado na fig. 13.22b. As arestas
e
foram inseridas
como resultado da regra 3a. O par de arestas
aplicao da regra 3c.

275

foi inserido como resultado de uma nica

Os grficos mostrados nas figuras 13.19b e 13.22b contm os seguintes ciclos mnimos, respectivamente:

O grfico da fig. 13.20b, por outro lado, no contm ciclos.


Se o grfico no contm ciclos, a escala correspondente viso serializava. Realmente, o grfico da figura
13.20b no contm ciclos, e sua escala correspondente, escala 9, viso serializava. Entretanto, se o grfico
contiver um ciclo, essa condio no implica necessariamente que a escala correspondente no seja viso
serializava. Realmente, o grfico da fig. 13.19b contm um ciclo, contudo sua escala correspondente, escala 7,
no viso serializava. O grfico da fig. 13.22b, por outro lado, contm um ciclo, mas sua escala correspondente,
escala 10, viso serializava.
Como, ento, determinamos se uma escala viso serializava? A resposta est em uma intepretao
apropriada do grfico de precedncia. Suponha que haja n pares de arestas distintas. Ou seja, aplicamos n vezes a
regra 3c na construo do grfico de precedncia. Haver ento 2n grficos diferentes, sendo que cada grfico
contm apenas uma aresta de cada par. Se algum desses grficos for acclico, ento a escala correspondente ser
viso serializava. A ordem de serializao determinada pela remoo das transaes fictcias Tb e Tf e pela
classificao topolgica do grfico acclico restante.
Volte ao grfico da fig. 13.22b. como h exatamente um par distinto, h dois grficos diferentes que
devem ser considerados. Os dois grficos so mostrados na fig. 13.23. Como o grfico da fig. 13.23a acclico,
sabemos que a escala correspondente, escala 10, viso serializava.
O algoritmo descrito anteriormente obriga testar exaustivamente todos os possveis grficos distintos.
Para isso mostrou-se que o problema do teste de um grfico acclico nesse conjunto recai sobre a classe de

276

problemas NP-completos. Qualquer algoritmo para um problema NP-completo quase certamente tomar um
tempo exponencial proporcional ao tamanho do problema.

De fato, foi mostrado que o problema do teste para serializao de viso , ele prprio, NP-completo.
Assim, muito provavelmente no h um algoritmo eficiente para testar serializao de viso. Entretanto, os
esquemas de controle de concorrncia ainda podem usar as condies suficientes para serializao de viso. Ou
seja, se as condies suficientes forem satisfeitas, a escala viso serializava, mas pode haver escalas viso
serializava que no satisfaam as condies suficientes.

277

Controle de Concorrncia
J vimos que uma propriedade fundamental da transao o isolamento. Quando diversas transaes so
executadas de modo concorrente em um banco de dados, a propriedade do isolamento pode no ser preservada.
necessrio que o sistema controle a interao entre transaes concorrentes; esse controle alcanado por
meio de uma larga gama de mecanismo chamados esquemas de controle de concorrncia.
Todos os esquemas de controle de concorrncia tm por base a propriedade de serializao
(serializability). Isto , todos os esquemas apresentados aqui garantem que a ordenao de processamento
serializada.
Protocolo com Base em Bloqueios (Lock)
Um meio de garantir a serializao obrigar que o acesso aos itens de dados seja feito de maneira
mutuamente exclusiva; isto , enquanto uma transao acessa um item de dados, nenhuma outra transao pode
modifica-lo. O mtodo mais usado para sua implementao permitir o acesso a um item de dados somente se
ele estiver bloqueado.
Bloqueios
H vrios modos por meio dos quais um item de dado pode ser bloqueado. Vamos nos restringir a dois
deles:
1. Compartilhado. Se uma transao Ti obteve um bloqueio compartilhado (denotado por S) sobre o item Q,
ento Ti pode ler, mas no escrever Q.
2. Exclusivo. Se uma transao Ti obteve um bloqueio exclusivo (denotado por X) do item Q, ento Ti pode
tanto ler como escrever Q.
Precisamos que toda transao solicite o bloqueio do item Q de modo apropriado, dependendo do tipo
de operao realizada em Q. A solicitao direcionada para o gerenciador do controle de concorrncia. A
transao pode realizar suas operaes somente depois que o gerenciador de controle de concorrncia. A
transao pode realizar suas operaes somente depois que o gerenciador de controle de concorrncia conceder
(grants) o bloqueio para transao.
Dado um conjunto de bloqueios, podemos definir uma funo de compatibilidade sobre eles. Seja A e B
uma representao arbitrria dos modos de bloqueio. Suponha que uma transao Ti solicite um bloqueio do
modo A sobre o item Q, sobre o qual a transao Tj (TiTj) mantm um bloqueio do modo B.
Se uma transao Ti consegue um bloqueio sobre Q imediatamente, a despeito da presena de um
bloqueio do modo B, ento dizemos que o modo A compatvel com o modo B. Essa funo pode ser
convenientemente representada por uma matriz. A relao de compatibilidade entre os dois modos de bloqueio
usados aqui apresentada na matriz comp da fig. 14.1. Um elemento comp(A,B) da matriz possui valor
verdadeiro se, e somente se, o modo A compatvel com o modo B.

Note que o modo compartilhado compatvel com o modo compartilhado, mas no com o modo
exclusivo. A qualquer hora podem ser feitos diversos bloqueios compartilhados simultaneamente (por diferentes
transaes) sobre um item de dado em particular. Uma solicitao de bloqueio exclusivo precisa esperar at que
um bloqueio compartilhado termine para ser efetivada.
Uma transao solicita um bloqueio compartilhado do item de dado Q executando a instruo lock-S(Q).
Analogamente, um bloqueio exclusivo solicitado pela instruo lock-X(Q). um item de dado Q pode ser
desbloqueado por outra transao, o gerenciador de controle de concorrncia no conceder o bloqueio at que
todos os bloqueios incompatveis mantidos pela outra transao sejam desfeitos.

278

A transao Ti pode desbloquear um item de dado a qualquer momento. Note que uma transao precisa
manter o bloqueio do item de dado durante todo o tempo de acesso quele item. Alm disso, o desbloqueio
imediatamente aps o acesso final nem sempre interessante, j que pode comprometer a serializao.
Como ilustrao, considere novamente o sistema bancrio apresentado anteriormente.
Sejam A e B duas contas que so acessadas pelas transaes T1 e T2. A transao T1 transfere 50 dlares
da conta A para a conta B e tem a forma:

A transao T2 apresenta o saldo total das contas A e B isto , a soma A+B e definida por:

Suponha que os saldos de A e B sejam 100 e 200 dlares, respectivamente. Se essas duas transaes so
executadas serialmente, na ordem T1, T2 ou T2, T1, ento a transao T2 mostrar o valor 300 dlares. Se, no
entanto, essas transaes forem executadas concorrentemente, a escala de execuo 1, mostrada na fig. 14.2,
pode ocorrer. Nesse caso, a transao T2 mostrar o resultado 250 dlares, que no correto. A razo desse erro
provm da falta de bloqueio em tempo hbil do item de dado B, com isso T2 mostra uma situao inconsistente.
A escala de execuo mostra as aes que so executadas pelas transaes, assim como os pontos em
que os bloqueios so concedidos pelo gerenciador de controle de concorrncia. Uma transao que pede um
bloqueio no pode executar sua prxima ao at que o bloqueio seja concedido pelo gerenciador de controle de
concorrncia; da o bloqueio precisa ser concedido no intervalo de tempo entre a operao de pedido de
bloqueio e a ao seguinte da transao. Em que momento, exatamente, o bloqueio concedido imediatamente
antes da ao seguinte da transao. Assim, retiraremos a coluna que indica as aes do gerenciador de controle
de concorrncia de todas as escalas de execuo apresentadas.
Suponha, agora, que os desbloqueios sejam realizados ao final da transao. A transao T3 similar
transao T1, com desbloqueio ao final da transao, e definida como:

A transao T2 apresenta o saldo total das contas A e B isto , a soma A+B e definida por:
279

Suponha que os saldos de A e B sejam 100 e 200 dlares, respectivamente. Se essas duas transaes so
executadas serialmente, na ordem T1, T2 ou T2, T1, ento a transao T2 mostrar o valor 300 dlares. Se, no
entanto, essas transaes forem executadas concorrentemente, a escala de execuo 1, mostrada na fig. 14.2,
pode ocorrer. Nesse caso, a transao T2 mostrar o resultado 250 dlares, que no correto. A razo desse erro
provm da falta de bloqueio em tempo hbil do item de dado B, com isso T2 mostra uma situao inconsistente.
A escala de execuo mostra as aes que so executadas pelas transaes, assim como os pontos em
que os bloqueios so concedidos pelo gerenciador de controle de concorrncia. Uma transao que pede um
bloqueio no pode executar sua prxima ao at que o bloqueio seja concedido pelo gerenciador de controle de
concorrncia; da o bloqueio precisa ser concedido no intervalo de tempo entre a operao de pedido de
bloqueio e a ao seguinte da transao. Em que momento, exatamente, o bloqueio concedido dentro desse
intervalor no importante; o bloqueio considerado seguro mesmo que concedido imediatamente antes da
ao seguinte da transao. Assim, retiraremos a coluna que indica as aes do gerenciador de controle de
concorrncia de todas as escalas de execuo apresentadas aqui.
Suponha, agora, que os desbloqueios sejam realizados ao final da transao. A transao T3 similar
transao T1, com desbloqueio ao final da transao, e definida como:

A transao T4 corresponde T2, com desbloqueio ao final da transao, e definida como:

280

Voc pode notar que a sequncia de leituras e escritas da escala de execuo 1, que resulta no total
incorreto de 250 dlares, no ocorre usando T3 e T4. Outras escalas so possveis. T4 no apresentar um
resultado inconsistente, qualquer que seja a escala de execuo.
Infelizmente, o uso de bloqueio pode causar situaes indesejveis. Considere a escala parcial de T3 e T4
na fig. 14.3. J que T3 mantm um bloqueio exclusivo sobre B, e T4 solicita um bloqueio compartilhado em B, e T4
solicita um bloqueio compartilhado em B, T4 espera que T3 libere B. Analogamente, como T4 mantm um bloqueio
compartilhado de A, e T3 est solicitando um bloqueio exclusivo em A, T3 est esperando que T4 libere A. Assim,
chegamos a uma situao em que nenhuma dessas transaes pode processar em sua forma normal. Essa
situao chamada de deadlock (impasse). Quando um deadlock ocorre, o sistema precisa desfazer uma das duas
transaes. Uma vez desfeita a transao, os itens de dados so, ento, avaliados por outras transaes, que
podem continuar com suas execues. Retornaremos aos meios de tratamento do deadlock mais adiante.

Se no usarmos o bloqueio, ou desbloqueio, dos itens de dados, to logo seja possvel, aps sua leitura ou
escrita, poderemos chegar a resultados inconsistentes. Por outro lado, se no desbloquearmos um item de dados
antes de solicitarmos um bloqueio a outro item de dados, o deadlock poder ocorrer. H formas de evitar o
deadlock em algumas situaes. Entretanto, em geral, deadlocks so problemas inerentes ao bloqueio, necessrio
se desejarmos evitar estados inconsistentes. Os deadlocks podem ser preferveis a estados inconsistentes, j que
podem ser tratados por meio do rollback (reverso) da transao, enquanto os estados inconsistentes podem
originar problemas reais, no tratados pelo sistema de banco de dados.
Exigimos que cada transao do sistema siga determinado conjunto de regras, chamado de protocolo de
bloqueio, indicando quando uma transao pode ou no bloquear ou desbloquear cada um dos itens de dados. O
protocolo de bloqueio restringe o nmero de escalas de execuo possveis. O conjunto de todas as escalas desse
tipo um subconjunto de todas as escalas serializadas possveis. Apresentaremos diversos protocolos de bloqueio
que permitem somente escalas com serializao de conflitos. Antes de faz-lo, precisamos de algumas definies.
Seja {T0, T1, ..., Tn} um conjunto de transaes participantes de uma escala de execuo S. Dizemos que Ti
precede Tj em S, denotando TiTj, se h um item de dado Q tal que Ti consegue bloqueio do tipo A sobre Q e
depois Tj consegue bloqueio do tipo B sobre Q e comp (A,B) = falso. Se TiTj, ento essa precedncia implica que,
em qualquer escala serial equivalente, Ti precisa aparecer antes de Tj. Observe que esse grfico similar ao usado
anteriormente para testar serializao de conflito. Dizemos que um protocolo de bloqueio garante serializao de
conflito se, e somente se, para todas as escalas de execuo legais, as relaes associadas  so acclicas.
Concesso de Bloqueios
Quando uma transao solicita bloqueio sobre um determinado item de dado em particular, e nenhuma
outra transao mantm o mesmo item de dado bloqueado de modo conflitante, tal bloqueio pode ser
concedido. Entretanto, preciso ter cuidado para evitar o seguinte cenrio. Suponha que a transao T2 tenha um
bloqueio compartilhado sobre um item de dado e outra transao T1 solicite um bloqueio exclusivo do mesmo
281

item. Claro que T1 ter de esperar at que o bloqueio compartilhado feito por T2 seja liberado. Enquanto isso,
uma transao T3 pode solicitar que um bloqueio compartilhado feito por T2 seja liberado. Enquanto isso, uma
transao T3 pode solicitar um bloqueio compartilhado sobre o mesmo item de dado. O bloqueio pedido
compatvel com o bloqueio concedido a T2, de modo que o bloqueio compartilhado pode ser concedido a T3.
Nessa altura, T2 pode liberar o bloqueio, mas T1 ter de esperar agora, at que T3 termine. Novamente, aparece
uma nova transao T4 que solicita um bloqueio compartilhado sobre o mesmo item de dado e ele concedido
antes que T3 libere o dado. De fato, possvel que haja uma sequncia de transaes solicitando bloqueios
compartilhados sobre um item de dado, e que cada uma delas libere seu bloqueio um pouco antes de que novo
bloqueio seja concedido outra transao, de modo que T1 nunca consegue seu bloqueio exclusivo. A transao
T1 poder nunca ser processada, e ela chamada de inane (starved).
Podemos evitar a inanio de transaes da seguinte forma. Quando uma transao Ti solicita o bloqueio
do item de dados Q de um modo particular M, o bloqueio concedido contato que:
1. No haja nenhuma outra transao com bloqueio sobre Q cujo modo de bloqueio seja conflitante com
M.
2. No haja nenhuma outra transao que esteja esperando um bloqueio sobre Q e que tenha feito sua
solicitao de bloqueio antes de Ti.
Protocolo de Bloqueio em Duas Fases
Um dos protocolos que garante a serializao o protocolo de bloqueio em duas fases (two-phase locking
protocol). Esse protocolo exige que cada transao emita suas solicitaes de bloqueio e desbloqueio em duas
fases:
1. Fase de expanso. Uma transao pode obter bloqueios, mas no pode liberar nenhum.
2. Fase de encolhimento. Uma transao pode liberar bloqueios, mas no consegue obter nenhum bloqueio
novo.
Inicialmente, uma transao est na fase de expanso. A transao adquire os bloqueios de que precisa.
To logo a transao libera um bloqueio, ela entra na fase de encolhimento e no poder solicitar novos
bloqueios.
Por exemplo, as transaes T3 e T4 tm duas fases. Por outro lado, as transaes T1 e T2 no tm duas
fases. Note que as instrues de desbloqueio no precisam aparecer no final da transao. Por exemplo, no caso
da transao T3, podemos colocar a instruo unlock(B) logo aps a instruo lock-X(A) e ainda assim manter a
propriedade do bloqueio em duas fases.
Podemos mostrar que o protocolo do bloqueio em duas fases garante a serializao de conflitos.
Considere qualquer transao. O ponto da escala no qual a transao obteve seu bloqueio final (o fim da fase de
expanso) chamado de ponto de bloqueio da transao. Assim, as transaes podem ser ordenadas de acordo
com seus pontos de bloqueio essa ordenao , de fato, uma ordenao serializada de transaes.
O bloqueio em duas fases no garante a ausncia de deadlock. Observe que as transaes T3 e T4
possuem duas fases, mas na escala de execuo 2 (fig. 14.3) elas esto em um deadlock.
Recordamos que, alm de serem serializada, desejvel que as escalas de execuo no sejam em
cascata. O rollback em cascata pode ocorrer sob o protocolo de bloqueio em duas fases. Como ilustrao,
considere a escala da fig. 14.4. Cada transao observa o protocolo de bloqueio em duas fases, mas a falha de T5
depois do passo read(A) da transao T7 ocasiona o rollback em cascata de T6 e T7.

282

Os rollbacks em cascata podem ser evitados por uma modificao no bloqueio em duas fases chamado
protocolo de bloqueio em duas fases severo (strict two-phase locking). O protocolo de bloqueio em duas fases
severo exige, em adio ao bloqueio feito em duas fases, que todos os bloqueios de modo exclusivo tomados por
uma transao sejam mantidos at que a transao seja efetivada. Essa exigncia garante que qualquer dado
escrito por uma transao que no foi ainda efetivada seja bloqueado de modo exclusivo at que a transao seja
efetivada, evitando que qualquer outra transao leia o dado em transao.
Outra variante do bloqueio em duas fases o protocolo de bloqueio em duas fases rigoroso, que exige
que todos os bloqueios sejam mantidos at que a transao seja efetivada. Pode ser facilmente verificado que,
com o bloqueio em duas fases rigoroso, as transaes podem ser serializadas na ordem de sua efetivao. A
maioria dos sistemas de banco de dados implementa ou o bloqueio em duas fases severo ou o rigoroso.
Considere as duas transaes seguintes para as quais mostramos somente algumas das mais significativas
operaes de leitura (read) e escrita (write). A transao T8 definida como:

A transao T9 definida como:

Se empregarmos o protocolo de bloqueio em duas fases, ento T8 precisar bloquear a1 de modo


exclusivo. Portanto, qualquer execuo concorrente de ambas as transaes atinge uma execuo serial. Note,
entretanto, que T8 precisa de um bloqueio exclusivo de a1 somente ao final de sua execuo, quando ela escreve
a1. Assim, se T8 estiver bloqueando ai de modo compartilhado e depois mudar esse bloqueio para o modo
exclusivo, poderemos obter mais concorrncia, j que T8 e T9 poderiam manter acesso simultneo a a1 e a2.
Essa observao remete-nos ao refinamento do protocolo bsico do bloqueio em duas fases, no qual a
converso de bloqueios permitida. Podemos proporcionar um mecanismo para promover um bloqueio
compartilhado para exclusivo de promoo (upgrade) e de exclusivo para compartilhamento de rebaixamento
(downgrade). A converso de bloqueio no pode ser arbitrria. Pelo contrrio, a promoo s pode acontecer
durante a fase de expanso, enquanto o rebaixamento somente ocorre na fase de encolhimento.
Retornando a nosso exemplo, as transaes T8 e T9 podem ser executadas concorrentemente sob o
protocolo de bloqueio em duas fases refinado, como mostra a escala incompleta da fig. 14.5, em que somente
algumas das instrues de bloqueio so mostradas.
Note que uma transao tentando a promoo de um bloqueio do item Q pode ser forada a esperar.
Essa espera forada ocorre se Q estiver bloqueado por outra transao em modo compartilhado.

283

Tanto quanto o protocolo de bloqueio em duas fases, o bloqueio em duas fases com converso de
bloqueio no pode ser arbitrria. Pelo contrrio, a promoo s pode acontecer durante a fase de expanso,
enquanto o rebaixamento somente ocorre na fase de encolhimento.
Retornando a nosso exemplo, as transaes T8 e T9 podem ser executadas concorrentemente sob o
protocolo de bloqueio em duas fases refinado, como mostra a escala incompleta da fig. 14.5, em que somente
algumas das instrues de bloqueio so mostradas.
Note que uma transao tentando a promoo de um bloqueio do item Q pode ser forada a esperar.
Essa espera forada ocorre se Q estiver bloqueado por outra transao em modo compartilhado.
Tanto quanto o protocolo de bloqueio em duas fases, o bloqueio em duas fases com converso de
bloqueio s gera escalas com serializao de conflito, e as transaes podem ser serializadas por seus pontos de
bloqueio. Alm disso, se bloqueios exclusivos so mantidos at o final da transao, as escalas so em cascata.
Descreveremos agora um esquema simples, mas muito usado, que gera as instrues de bloqueio e
desbloqueio, automaticamente, para uma transao. Quando uma transao Ti emite uma operao read(Q), o
sistema emite uma instruo lock-S(Q) seguida de uma instruo read(Q). Quando Ti emite uma operao
write(Q), o sistema verifica se Ti ainda mantm um bloqueio compartilhado. Se ainda h, o sistema emite uma
instruo upgrade(Q), seguida de uma instruo write(Q). De outro modo, o sistema emite uma instruo lockX(Q), seguida de uma instruo write(Q). Todos os bloqueios obtidos por uma transao so desbloqueados
depois da transao ser efetivada ou abortada.

Para um conjunto de transaes, pode haver escalas de serializao de conflito que no sejam obtidas por
meio do protocolo de bloqueio em duas fases. Entretanto, para obter escalas de serializao de conflito por meio
de protocolos de bloqueio sem usar duas fases, precisamos obter informaes adicionais sobre as transaes ou
impor alguma estrutura, ou ordem, sobre o conjunto de itens de dados dos banco de dados. Na ausncia de tais
informaes, o bloqueio em duas fases necessrio para a serializao de conflito se Ti uma transao que
no est em duas fases, sempre possvel encontrar outra transao Tj que esteja em duas fases, tal que haja
uma escala vivel para Ti e Tj que no seja conflitante por serializao.
O bloqueio em duas fases severo e o bloqueio em duas fases rigoroso (com converso de bloqueios) so
usados extensivamente em sistemas de banco de dados comerciais.
Protocolos com Base em Grficos (Graph-Based Protocols)
Como dissemos, na ausncia de informaes a respeito do modo de acesso aos itens de dados, o
protocolo de bloqueio em duas fases necessrio e suficiente para garantir a serializao. Assim, se desejamos
desenvolver protocolos que no usam duas fases, precisamos de informaes adicionais sobre como cada
transao desenvolver seu acesso ao banco de dados. H diversos modelos que diferem no tocante quantidade
de informaes a proporcionar. O modelo mais simples exige que tenhamos conhecimento anterior sobre a
ordem na qual os itens de banco de dados sero acessados. Fornecidas essas informaes, possvel construir
protocolos de bloqueio que no sejam em duas fases, mas que, no entanto, garantem a serializao de conflito.
Para adquirir esse conhecimento prvio, impomos uma ordenao parcial  sobre o conjunto
D={d1,d2,...,dn} de todos os itens de dados. Se didj, ento qualquer transao que mantenha acesso a ambos, di
284

e dj, dever acessar primeiro di e depois dj. Essa ordenao parcial pode resultar da organizao fsica ou lgica
dos dados, ou pode ser imposta somente para fins de controle de concorrncia.
A ordenao parcial implica que o conjunto D pode ser visto agora como um grfico acclico, chamado
grfico de banco de dados. Por maior simplicidade, restringiremos nossa ateno somente queles grficos que
so rvores razes. Apresentaremos um protocolo simples, chamado de protocolo de rvore, que restrito para
emprego somente nos bloqueios exclusivos.
No protocolo de rvore permitida somente a instruo de bloqueio lock-X. Cada transao Ti pode
bloquear um item de dado no mximo uma vez e deve observar as seguintes regras:
1. O primeiro bloqueio feito por Ti pode ser sobre qualquer dado.
2. Subsequentemente, um certo item de dado Q pode ser bloqueado por Ti somente se os pais de Q
estiverem bloqueados por Ti.
3. Itens de dados podem ser desbloqueados a qualquer momento.
4. Um item de dado que foi bloqueado e desbloqueado por Ti no pode ser rebloqueado por Ti
subsequentemente.
Como colocamos anteriormente, todas as escalas de execuo que forem legais sob o protocolo de rvore
que sero conflito serializadas.
Para ilustrar esse protocolo, considere o grfico do banco de dados da fig. 14.6. As quatro transaes
seguintes respeitam o protocolo de rvore desse grfico. Mostraremos somente as instrues de bloqueio e
desbloqueios:

Uma escala possvel em que participam essas quatro transaes a mostrada na fig. 14.7. Note que,
durante a execuo, a transao T10 mantm bloqueio sobre duas subrvores separadas.

Observe que a escala da fig. 14.7 conflito serializada. No apenas pode ser mostrado que o protocolo de
rvore garante a serializao de conflito, mas tambm que esse protocolo garante a ausncia de deadlock.
285

O protocolo de bloqueio em rvore apresenta a vantagem de realizar o desbloqueio mais cedo do que
feito no protocolo de bloqueio em duas fases. O desbloqueio feito mais cedo pode reduzir os tempos de espera e
aumentar a concorrncia. Alm disso, uma vez que o protocolo resistente a deadlocks, nenhum rollback
necessrio. Entretanto, o protocolo tem a desvantagem de, em alguns casos, uma transao pode manter o
bloqueio de um item de dado que no acessa. Por exemplo, uma transao que precise do acesso aos itens de
dados A e J cujo grfico do banco de dados o da fig. 14.6, precisa no somente bloquear A e J, mas tambm os
itens de dados B, D e H. Esse bloqueio adicional resulta no aumento de overhead relativo aos bloqueios, na
possibilidade de tempo de espera adicional e decrscimo potencial da concorrncia. Alm disso, sem o
conhecimento prvio de como os itens de dados sero bloqueados, as transaes tero de bloquear a raiz da
rvore, o que reduz consideravelmente a concorrncia.
Para um conjunto de transaes, h escalas conflitos serializadas que no podem ser obtidas pelo
protocolo de rvore. Ainda, h escalas possveis sob o protocolo de bloqueio em duas fases que tambm no so
possveis sob o protocolo de rvore, e vice-versa.
Protocolos com Base em Timestamp (Registro de Tempo)
Nos protocolos de bloqueio, descritos at agora, a ordem entre cada par de transaes conflitantes
determinada durante a execuo do primeiro bloqueio que ambas solicitam e que envolve modos incompatveis.
Outro mtodo para a determinao da ordem serializada selecionar uma ordenao entre transaes em
andamento. O mtodo mais usado o esquema de ordenao por timestamp.
Timestamp
A cada transao Ti dos sistema associamos um nico timestamp fixo, denotado por TS(Ti). Esse
timestamp criado pelo sistema de banco de dados antes que a transao Ti inicie sua execuo. Se uma
transao Ti recebeu o TS(Ti) em uma nova transao Tj entre no sistema, ento TS(Ti)<TS(Tj).
H duas formas simples de implementar esse esquema:
1. Usar a hora do relgio do sistema (clock) como timestamp, isto , o timestamp de uma transao igual
hora em que a transao entra no sistema.
2. Usar um contador lgico que incrementado sempre que se usa um novo timestamp, isto , o timestamp
da transao igual ao valor do contador no momento em que a transao entre no sistema.
Os timestamps das transaes determinam a ordem de serializao. Assim, se TS(Ti)<TS(Tj), o sistema
precisa garantir que a escala produzida seja equivalente a uma escala serial em que a transao Ti aparece antes
da transao Tj.
Para implementao desse esquema, associamos a cada item Q dois valores para timestamp:
W-timestamp(Q) denota o maior timestamp de qualquer transao que execute uma write(Q) com
sucesso.
R-timestamp(Q) denota o maior timestamp de qualquer transao que execute uma read(Q) com
sucesso.
Esses timestamps so atualizados sempre que uma nova instruo read(Q) ou write(Q) for executada.
O Protocolo de Ordenao por Timestamp
O protocolo de ordenao por timestamp assegura que quaisquer operaes de leitura e escrita sejam
executadas por ordem de timestamp. Esse protocolo opera da seguinte forma:
1. Suponha que a transao Ti emita uma read(Q).
a. Se TS(Ti)<W-timestamp(Q), ento Ti precisa ler um valor de Q que j foi sobreposto. Assim, a
operao read rejeitada e Ti desfeita.
b. Se TS(Ti)W-timestamp(Q), ento a operao read executada e R-timestamp(Q) recebe o maior
valor entre R-timestamp(Q) e TS(Ti).
2. Suponha que a transao Ti emita um write(Q).
286

a. Se TS(Ti)<R-timestamp(Q), ento o valor de Q que Ti est produzindo foi necessrio antes e o


sistema assumiu que aquele valor nunca seria produzido. Logo, a operao write rejeitada e Ti
desfeita.
b. Se TS(Ti)<W-timestamp(Q), ento Ti est tentando escrever um valor obsoleto em Q. Logo, essa
operao write rejeitada e Ti desfeita.
c. De outro modo, a operao write executada e W-timestamp(Q) registrado em TS(Ti).
Uma transao Ti que foi desfeita pelo esquema de controle de concorrncia, decorrente de uma
operao read ou write, recebe um novo timestamp e reiniciada.
Para ilustrar esse protocolo, considere as transaes T14 e T15. A transao T14 mostra o contedo total das
contas A e B e definida como:

A transao T15 transfere 50 dlares da conta A para a conta B e ento apresenta o resultado de ambas:

Nas escalas criadas obedecendo ao protocolo de timestamp, assumimos que uma transao recebe um
timestamp imediatamente antes de sua primeira instruo. Assim, na escala 3 da fig. 14.8, TS(T14)<TS(T15) e a
escala possvel sob o protocolo de timestamp.
Notamos que a execuo precedente pode tambm ser realizada pelo protocolo de bloqueio em duas
fases. H, entretanto, escalas que so viveis sob o protocolo de bloqueio em duas fases, mas inviveis sob o
protocolo de timestamp, e vice-versa.

O protocolo de ordenao por timestamp garante a serializao de conflito. Essa assero provm do fato
de que operaes conflitantes so processadas pela ordem do timestamp. O protocolo garante tambm
resistncia a deadlocks, j que uma transao nunca espera. O protocolo consegue gerar escalas que no podem
ser recuperadas (desfeitas), entretanto ele pode receber uma extenso para fazer escalas cascateadas.
Regra de Escrita de Thomas (Thomas Write Rule)
Apresentaremos agora uma modificao no protocolo de ordenao por timestamp que aumenta a
concorrncia em potencial em relao quele que descrevemos anteriormente. Consideremos a escala 4 da fig.
14.9 e apliquemos a ela o protocolo da ordenao por timestamp. Uma vez que T16 comea antes de T17, podemos
considerar que TS(T16)<TS(T17). A operao read(Q) de T16 executada, assim como a operao write(Q) de T17.
Quando T16 tenta executar sua operao write(Q), descobrimos que TS(T16)<W-timestamp(Q), j que Wtimestamp(Q) = TS(T17). Assim, a operao write(Q) de T16 rejeitada e a transao T16 precisa ser desfeita.

287

Embora o rollback de T16 seja requerido pelo protocolo da ordenao por timestamp, ele desnecessrio.
Uma vez que T17 j escreveu Q, o valor que T16 est tentando escrever nunca ser lido. Qualquer transao Ti com
TS(Ti)<TS(T17) dever ler o valor de Q que foi escrito por T17 em vez de o valor escrito por T16.
Essa observao sugere uma modificao no protocolo de ordenao por timestamp no qual operaes
write obsoletas podem ser ignoradas sob determinadas circunstncias. As regras de protocolo para as operaes
read permanecem inalteradas. As regras de protocolo para as operaes write, entretanto, so ligeiramente
diferentes das do protocolo de ordenao por timestamp vista anteriormente:
1. Se TS(Ti)<R-timestamp(Q), ento o valor de Q que Ti est produzindo foi necessrio anteriormente, e
assumiu-se que o valor nunca seria produzido. Logo, a operao write rejeitada e Ti desfeita.
2. Se TS(Ti)<W-timestamp(Q), ento Ti est tentando escrever um valor obsoleto para Q. Logo, a operao
write pode ser ignorada.
3. De outro modo, a operao write executada e W-timestamp(Q) recebe o valor de TS(Ti).
A diferena entre essas regras e as apresentadas anteriormente est na segunda regra. O protocolo de
ordenao por timestamp exige que Ti seja desfeita se emitir uma write(Q) e TS(Ti)<W-timestamp(Q). Entretanto,
aqui, nos casos em que TS(Ti)W-timestamp(Q). Entretanto, aqui, nos casos em que TS(Ti)R-timestamp(Q),
ignoramos writes obsoletas. Essa modificao no protocolo de ordenao por timestamp chamada de regra de
escrita de Thomas.
A regra de escrita de Thomas faz uso da serializao de viso, eliminando, com efeito, as operaes de
write obsoletas das transaes que as emitem. Essa modificao torna possvel a gerao de escalas de execuo
serializadas que no poderiam ocorrer sob outros protocolos apresentados aqui. Por exemplo, a escala 4 da fig.
14.9 no-conflito serializada e, assim, no vivel sob qualquer protocolo de bloqueio em duas fases, protocolo
de rvore ou de ordenao por timestamp. Sob a regra escrita de Thomas, a operao write(Q) da T16 poderia ser
ignorada. O resultado uma escala cuja viso equivalente escala serial <T16, T17>.
Protocolos com Base em Validao
Nos casos em que a maioria das transaes somente de leitura, a taxa de conflitos entre as transaes
pode ser baixa. Assim, algumas dessas transaes, se executadas sem a superviso de um esquema de controle
de concorrncia, poderiam deixar o sistema sempre em estado consistente. Um esquema de controle de
concorrncia impe overhead relativo execuo de mais cdigo e possvel atraso nas transaes. Pode ser
interessante usar um esquema alternativo que resulte em menor overhead. Uma dificuldade enfrentada para a
reduo de overhead que no sabemos a priori quais transaes sero envolvidas em conflito. Para obter essa
informao, precisamos de um esquema para a monitorao do sistema.
Consideramos que cada transao Ti executada em duas ou trs fases diferentes, dependendo se uma
transao somente de leitura ou de atualizao. Essas fases so, em ordem, as seguintes:
1. Fase de leitura. Durante essa fase, a execuo da transao Ti tem incio. Os valores de diversos itens de
dados so lidos e armazenados em variveis locais para Ti. Todas as operaes de escrita so processadas
com variveis locais temporrias, sem alterar de fato o banco de dados.
2. Fase de validao. A transao Ti processa um teste de validao para determinar se pode copiar no
banco de dados as variveis locais temporrias que mantm os resultados das operaes de escrita sem,
com isso, causar a violao da serializao.
3. Fase de escrita. Se a transao Ti obtm sucesso na validao (passo 2), ento a atualizao aplicada de
fato ao banco de dados. Caso contrrio, Ti desfeita.
Cada transao precisa passar pelas trs fases, na ordem mostrada. Entretanto, as trs fases de
transaes em execuo concorrentes podem ser intercaladas.
288

As fases de leitura e escrita so autoexplicativas. A nica fase que exige mais explicaes a de validao.
Para realizar os testes de validao, precisamos saber quando ocorreram as diversas fases da transao Ti.
Precisamos, portanto, associar trs timestamps diferentes para a transao Ti:
1. Start(Ti), o momento em que Ti teve incio.
2. Validation(Ti), o momento em que Ti terminou sua fase de leitura e comeou sua fase de validao.
3. Finish(Ti), o momento em que Ti terminou sua fase de escrita.
Determinamos a ordem de serializao pela tcnica de ordenao por timestamp, usando o valor do
timestamp da Validation(Ti). Assim, o valor de TS(Ti)=Validation(Ti) e, se TS(Tj)<TS(Tk), ento qualquer escala criada
precisa ser equivalente escala serializada na qual a transao Tj aparece antes da transao Tk. A razo para
escolhermos Validation(Ti) em vez de Start(Ti) como timestamp da transao Ti que, com isso, podemos esperar
menor tempo de resposta, com a condio de que as taxas de conflito entre transaes sejam com certeza
pequenas.
O teste de validao para Ti exige que, para todas as transaes Ti com TS(Ti)<TS(Tj), uma das duas
condies a seguir seja realizada:
1. Finish(Ti)<Start(Ti). J que Ti completa sua execuo antes de Tj comear, a ordem de serializao com
certeza mantida.
2. No h interseo entre o conjunto de itens de dados escritos por Ti e o conjunto de dados lidos por Tj, e
Ti completa sua fase de escrita antes de Tj comear sua fase de validao
(Start(Tj)<Finish(Ti)<Validation(Tj)). Essa condio garante que as escritas de Ti e Tj no sejam sobrepostas.
Uma vez que a escrita de Ti no afeta a leitura de Tj e que Tj no pode afetar a leitura de Ti, a ordem de
serializao com certeza mantida.
Como ilustrao, considere novamente as transaes T14 e T15. Suponha que TS(T14)<TS(T15). Ento, a fase de
validao consegue produzir a escala de execuo 5, que apresentada na fig. 14.10. Note que a escrita das
variveis reais realizada somente aps a fase de validao de T15. Assim, T14 l valores desatualizados de A e B e
essa serializada.

O esquema de validao evita, automaticamente, os rollbacks em cascata, j que as escritas reais


acontecem somente depois que a transao que emitiu a solicitao de escrita tenha sido efetivada.
Granularidade Mltipla
Nos esquemas de concorrncia descritos at agora, estivemos usando cada item de dado individual como
uma unidade qual a sincronizao aplicada.
H circunstncias, no entanto, em que pode ser vantajoso o agrupamento de diversos itens de dados,
tratando-os como uma unidade de sincronizao individual. Por exemplo, se uma transao Ti precisa do acesso a
todo o banco de dados e um protocolo de bloqueio usado, Ti precisar bloquear cada um dos itens do banco de
dados. Logicamente, esse bloqueio um consumidor de tempo. Seria melhor Ti emitir uma nica solicitao de
bloqueio a todo o banco de dados. Por outro lado, se uma transao Tj precisa do acesso a somente alguns itens
de dados, no necessrio bloquear todo o banco de dados, porque, desse modo, a concorrncia perdida.
preciso um mecanismo que permita ao sistema definir diferentes mltiplos de granulao. Podemos
desenvolver um desses mecanismos permitindo diversos tamanhos aos itens de dados e definindo uma hierarquia
289

de granularidade de dados, em que as granulaes menores sejam aninhadas s maiores. Tal hierarquia pode ser
representada graficamente como uma rvore. Note que a rvore que descrevemos aqui bastante diferente da
usada no protocolo de rvore. O n sem ramificaes de uma rvore de granularidade mltipla representa o dado
associado a seus descendentes. No protocolo de rvore, cada n representa um item de dado independente.
Como ilustrao, considere a rvore da fig. 14.11, consistindo em ns em quatro nveis. O nvel mais alto
representa o banco de dados como um todo. Abaixo, h ns do tipo rea; o banco de dados constitudo
exatamente dessas reas. Cada rea, por sua vez, possui ns do tipo arquivo como filhos. Cada rea constituda
exatamente daqueles arquivos que so seus ns filhos. Nenhum arquivo est em mais de uma rea. Finalmente,
cada arquivo possui ns do tipo registro. Como antes, o arquivo constitudo exatamente daqueles registros que
so seus ns filhos, e nenhum registro pode estar em mais de um arquivo.

Cada n de uma rvore pode ter bloqueio individual. Como foi feito no protocolo de bloqueio em duas
fases, usaremos os modos de bloqueio exclusivo e compartilhado. Quando uma transao bloqueia um n, tanto
no modo compartilhado quanto no exclusivo, a transao tambm bloquear todos os descendentes daquele n
no mesmo modo de bloqueio. Por exemplo, se a transao Ti bloqueio de forma explcita o arquivo Fc da fig.
14.11, no modo exclusivo, ento ela est bloqueando de forma implcita, no modo exclusivo, todos os registros
pertencentes quele arquivo. Ela no precisar fazer, de forma explcita, o bloqueio individual dos registros de Fc.
Suponha que uma transao Tj queira bloquear o registro rb6 do arquivo Fb. Dado que Ti bloqueou Fb de
forma explcita, segue que rb6 est tambm bloqueado (de forma implcita). Mas, quando Tj emite uma solicitao
de bloqueio para rb6, este no bloqueado de modo explcito! Como o sistema determinar se Tj pode bloquear rb6?
Tj precisar percorrer a rvore da raiz at o registro rb6. Se algum modo n do caminho estiver bloqueado de
modo incompatvel, ento Tj precisar esperar.
Suponha, agora, que a transao Tk deseja bloquear todo o banco de dados. Para isso, ela precisa
simplesmente bloquear a raiz hierrquica. Note, entretanto, que Tk no deve conseguir o bloqueio no n raiz, j
que Ti j est bloqueado, como acontece com parte da rvore (especificamente, o arquivo Fb). Mas, agora, como o
sistema determinar se o n raiz poder ser bloqueado? Uma soluo seria pesquisar a rvore inteira. Essa
soluo, entretanto, se antepe ao proposito do esquema do bloqueio de granularidade mltipla. Um meio mais
eficiente seria introduzir uma nova classe de modo de bloqueio, chamado modo de bloqueio intencional. Se um
n bloqueado no modo intencional, o bloqueio explcito ser feito no nvel mais baixo da rvore (isto , na
granularidade mais fina). Bloqueios intencionais sero feitos em todos os antecessores do n antes que aquele n
seja bloqueado de forma explcita. Assim, uma transao no precisa pesquisar a rvore inteira para determinar
se poder bloquear um n. Uma transao que queira bloquear um n digamos, Q precisa percorrer o
caminho, pela rvore, do n at Q. Enquanto se percorre a rvore, os bloqueios das transaes so feitos de
modo intencional.
H um modo intencional associado ao modo compartilhado e um relacionado ao modo exclusivo. Se um
n bloqueado no modo compartilhado-intencional (intention-shared IS), o bloqueio explcito est sendo feito
no nvel mais baixo da rvore, mas com somente bloqueios de modo compartilhado.
Analogamente, se um n bloqueado no modo exclusivo-intencional (intention-exclusive IX), ento o
bloqueio explcito est sendo feito no nvel mais baixo, no modo exclusivo ou compartilhado. Finalmente, se um
n est bloqueado nos modos de bloqueio apresentada na fig. 14.12.
290

O protocolo de bloqueio de granularidade mltipla garante a serializao. Cada transao Ti pode


bloquear um n Q, usando as seguintes regras:
1. A funo de compatibilidade de bloqueio da fig. 14.12 precisa ser observada.
2. A raiz da rvore precisa ser bloqueada primeiro e pode ser bloqueada em qualquer modo.
3. Um n Q pode ser bloqueado por Ti no modo S ou IS somente se o pai de Q for bloqueado por Ti no modo
IX ou IS.
4. Um n Que pode ser bloqueado por Ti no modo X, SIX ou IX somente se o pai de Q estiver bloqueado por
Ti no modo IX ou no modo SIX.
5. Ti pode bloquear um n somente se ele no desbloqueou outro n anteriormente (isto , Ti tem duas
fases).
6. Ti pode desbloquear um n Que somente se nenhum dos filhos de Que estiver bloqueado por Ti.
Observe que o protocolo de granularidade mltipla exige que os bloqueios sejam feitos de cima para
baixo (top-down da raiz para as folhas), enquanto a liberao deve ser de baixo para cima (bottom-up das
folhas para a raiz).
Para ilustrar o protocolo, considere a rvore da fig. 14.11 e as seguintes transaes:
Suponha que a transao T18 leia o registro ra2 do arquivo Fa. Ento, T18 precisa bloquear o banco de
dados, a rea A1, o arquivo Fa no modo IS (nessa ordem) e, finalmente, bloquear ra2 no modo S.
Suponha que a transao T19 altere o registro ra9 do arquivo Fa. Ento, T19 precisa bloquear o banco de
dados, a rea A1, o arquivo Fa no modo IX e, finalmente, bloquear ra9 no modo X.
Suponha que a transao T20 leia todos os registros do arquivos Fa. Ento, T20 precisa bloquear o banco de
dados e a rea A1 (nesse ordem) no modo IS e, finalmente, bloquear Fa no modo S.
Suponha que a transao T21 leia todo o banco de dados. Ento, poder faz-lo depois de bloquear o
banco de dados no modo S.
Podemos notar que as transaes T18, T20, e T21 mantm acesso ao banco de dados concorrentemente. A
transao T19 pode concorrer com T18, mas no com T20 nem T21.
Esse protocolo aumenta a concorrncia e reduz o overhead por bloqueio. Isso particularmente til em
aplicaes que misturam:
Transaes curtas que mantm acesso em poucos itens de dados.
Transaes longas que produzem relatrios a partir de um arquivo ou de um conjunto de arquivos.
H protocolos de bloqueio similares que so aplicados a sistemas de banco de dados nos quais a
granularidade organizada na forma de grficos acclicos.
Esquemas de Multiverso
Os esquemas de controle de concorrncia discutidos at aqui garantem a serializao atrasando a
operao ou abortando a transao responsvel por tal operao. Por exemplo, uma operao de read pode ser
retratada se o valor apropriado em questo ainda estiver sendo escrito; ou pode ser rejeitada se o valor
apropriado em questo ainda estiver sendo escrito; ou pode ser rejeitada (isto , a transao que emitiu tal
solicitao deve ser abortada) porque o valor lido j foi alterado. Essas dificuldades podem ser evitadas se o
sistema providenciar cpias anteriores de cada item de dado.
Em um sistema de banco de dados multiverso, cada operao write(Q) cria uma nova verso de Q.
Quando emitida uma operao read(Q), o sistema seleciona uma das verses de Q para ser lida seja tal que
291

assegure a serializao. crucial, por razes de desempenho, que uma transao possa determinar fcil e
rapidamente qual verso do item de dados poder ser lido.
Multiverso com Ordenao por Timestamp
A tcnica mais usada nos esquemas de multiverso o timestamp. A cada transao Ti do sistema
associado um timestamp nico e esttico, denotado por TS(Ti). Esse timestamp associado antes do incio da
execuo da transao, conforme j descrito.
Para cada idem de dado Q, uma sequncia de verses < Q1, Q2, ..., Qm> associada. Cada verso Qk
contm trs campos de dados:
Content (contedo) o valor da verso Qk.
W-timestamp(Qk) o timestamp da transao que criou a verso Qk.
R-timestamp(Qk) o timestamp mais alto de alguma transao que tenha lido a verso Qk com sucesso.
Uma transao digamos, Ti cria uma nova verso Qk do item de dado Q emitindo uma operao
write(Q). O campo contedo da verso mantm o valor escrito por Ti. O W-timestamp e o R-timestamp so
inicializados por TS(Ti). O valor de R-timestamp atualizado sempre que uma transao Tj l o contedo de Qk e
R-timestamp atualizado sempre que uma transao Tj l o contedo de Qk e R-timestamp(Qk)<TS(Tj).
O esquema de multiverso com timestamp apresentado a seguir garante a serializao. O esquema opera
da forma descrita a seguir. Suponha que uma transao Ti emita uma operao read(Q) ou write(Q). Seja Qk a
verso de Q cujo timestamp de escrita o mais alto timestamp, menor ou igual a TS(Ti).
1. Se a transao Ti emitir uma read(Q), ento o valor recebido ser o contedo da verso Qk.
2. Se a transao Ti emitir um write(Q) e TS(Ti)<R-timestamp(Qk), o contedo de Qk sobreposto; caso
contrrio, outra verso de Q criada.
A justificativa para a regra 1 clara. Uma transao l a verso mais recente anterior a ela. A segunda
regra fora o aborto de uma transao se for tarde demais para que se faa uma escrita. Mais precisamente, se
Ti tentar escrever uma verso que alguma outra transao j tenha lido, ento no poderemos permitir que essa
escrita seja bem-sucedido.
As verses que no forem mais necessrias sero removidas conforme a regra seguinte. Suponha que
haja duas verses, QK e Qj, de um item de dados e que ambas as verses tenha o W-timestamp menor que o
timestamp da ltima transao do sistema. Ento, a mais antiga entre as verses QK e Qj no ser usada
novamente e pode ser eliminada.
O esquema multiverso ordenada por timestamp possui a adequada propriedade de garantir que uma
solicitao de leitura nunca falhe e nunca espere. Em um sistema de banco de dados tpico, em que as operaes
de leitura so mais frequentes que as de escrita, essa vantagem de grande importncia prtica.
O esquema, entretanto, possui duas propriedades indesejveis. Primeiro, a leitura de um item de dados
exige tambm a atualizao do campo R-timestamp, resultando em dois acessos ao disco, em vez de apenas um.
Segundo, os conflitos entre transaes so resolvidos por rollback, em vez da imposio de tempo de espera. Essa
alternativa pode ser onerosa. Um algoritmo para amenizar o problema ser descrito na prxima seo.
Multiverso com Bloqueio em Duas Fases
O protocolo de multiverso com bloqueio em duas fases tenta combinar as vantagens do controle de
concorrncia multiverso com as vantagens do bloqueio em duas fases. Esse protocolo diferencia transaes
somente de leitura das transaes de atualizao. As transaes de atualizao executam um bloqueio em duas
fases rigorosas, isto , elas mantm todos os bloqueios at o final da transao. Assim, podem ser serializadas de
acordo com sua ordem de efetivao. Cada item de dado possui um nico timestamp. O timestamp no , nesse
caso, baseado no horrio, mas em um contador, que ser chamado de ts_counter, que incrementado durante o
processo de efetivao.

292

Marcamos o timestamp das transaes somente de leitura por meio do valor corrente do contador, ou
seja, lendo o valor de ts_counter antes de comear sua execuo; para a leitura, elas seguem o protocolo de
multiverso ordenada por timestamp. Com isso, quando uma transao Ti desse tipo emite uma read(Q), o valor
recebido o contedo da verso cujo timestamp o inferior a TS(Ti) mais prximo.
Quando uma transao de atualizao l um item, ela impe um bloqueio compartilhado ao item e l a
ltima verso do item. Quando uma transao de atualizao deseja escrever um item, ela primeiro consegue o
bloqueio exclusivo desse item e, ento, cria uma nova verso do item de dados. A escrita realizada a partir da
nova verso e o timestamp da nova verso recebe como valor inicial, que maior que qualquer outro
timestamp possvel.
Quando uma transao de atualizao Ti completa suas aes, ela realiza o processo de efetivao da
seguinte forma: primeiro, Ti adiciona 1 ao valor de ts_counter e transfere esse valor aos timestamp de todas as
verses que criou; ento, Ti adiciona 1 ao ts_counter. Somente uma transao de atualizao por vez pode
realizar o processo de efetivao.
Como consequncia, as transaes somente de leitura que comearem depois de Ti incrementar o
ts_counter acessaro o valor atualizado por Ti, enquanto aquelas que comearem antes do incremento de
ts_counter, feito por Ti, vero o valor anterior atualizao de Ti. Nesse caso, as transaes somente de leitura
jamais precisaro esperar por bloqueios.
As verses so eliminadas de modo similar multiverso com ordenao por timestamp. Suponha que
haja duas verses, QK e Qj, de um item de dado e que ambas as verses tenham timestamp menor que o da
ltima transao somente de leitura processada no sistema. Logo, a mais antiga entre as duas verses QK e Qj
no ser mais usada e pode ser eliminada.
A multiverso com bloqueio em duas fases ou variaes so aplicadas a alguns sistemas de banco de
dados comerciais.
Manuseio do Deadlock
Um sistema est em estado de deadlock se h um conjunto de transaes, tal que toda a transao desse
conjunto est esperando outra transao tambm nele contida. Mais precisamente, h um conjunto de
transaes esperando {T0,T1,...,Tn}, tal que T0 est esperando um item de dado mantido por T1, T1 est esperando
um item de dado mantido por T2, ..., Tn-1 est esperando um item de dados mantido por Tn e Tn est esperando
por um item de dado mantido por T0. Nenhuma dessas transaes poder prosseguir em uma situao dessas. O
nico remdio para essa situao indesejvel uma ao drstica do sistema, como reverter uma das transaes
envolvidas no deadlock.
H dois mtodos principais para o tratamento do deadlock. Podemos usar o protocolo de preveno de
deadlock para garantir que o sistema nunca entrar em tal situao. Ou podemos permitir que o sistema entre
em estado de deadlock e, ento, remov-lo dessa situao, recuperando-o por meio dos esquemas de deteco
de deadlock e recuperao de deadlock. Como vimos, ambos os mtodos podem acabar por reverter uma
transao (rollback). A preveno mais utilizada se a probabilidade do sistema que entrar deadlock for
relativamente alta; caso contrrio, a deteco e recuperao so mais eficientes.
Note que os esquemas de deteco e recuperao implicam overhead relativo, no somente ao tempo de
processamento do sistema para manuteno das informaes necessrias e para a execuo do algoritmo de
deteco, mas tambm devido s perdas potenciais inerentes advindas da recuperao de um deadlock.
Preveno de Deadlock
H duas abordagens para a preveno de deadlock. Uma garante que nenhum ciclo de espera poder
ocorrer pela ordenao de solicitaes de bloqueios, ou obrigando que todos os bloqueios sejam obtidos juntos.
Outra aproxima-se da recuperao do deadlock, fazendo com que a transao seja refeita, em vez de esperar um
bloqueio, sempre que a espera possa potencialmente ocorrer um deadlock.

293

O esquema mais simples sob a primeira abordagem obriga cada transao a bloquear todos os itens de
dados antes de sua execuo. Alm disso, ou todos so bloqueados de uma vez ou nenhum o ser. H duas
desvantagens nesse protocolo. A premiria, normalmente, a dificuldade em prever, antes da transao comear,
quais itens de dados precisaro de bloqueio. Segundo, a utilizao do item de dados pode ser bastante reduzida,
j que muitos dos itens de dados podem ser bloqueados e no ser usados pro um longo perodo.
Outro esquema de preveno de deadlock feito pela imposio de ordenao parcial de todos os itens
de dados e pela obrigao de que a transao bloqueie um item de dado somente na ordem especificada na
ordenao parcial. Vimos um desses esquemas no protocolo de rvore.
A segunda abordagem para a preveno de deadlock a preempo e o rollback de transaes. Na
preempo, quando uma transao T2 solicita um bloqueio que est sendo mantido pela transao T1, o bloqueio
concedido a T1 pode ser revisto por meio do rollback de T1, e concedido a T2. Para controle da preempo,
consideramos um nico timestamp para cada transao. O sistema usa esses timestamps somente para decidir se
a transao pode esperar ou ser revertida. O bloqueio ainda usado para controle de concorrncia. Se uma
transao for revertida, ela manter seu timestamp antigo quando for reiniciada. So propostos dois esquemas
diferentes de preveno de deadlock usando timestamp:
1. O esquema esperar-morrer (wait-die) tem por base uma tcnica de no-preempo. Quando uma
transao Ti solicita um item de dado mantido por Tj, Ti pode esperar somente se possuir um timestamp
menor que o de Tj (isto , Ti mais antiga que Tj). Caso contrrio, Ti ser revertida (morta). Por exemplo,
suponha que as transaes T22, T23 e T24 tenham timestamps 5, 10 e 15, respectivamente. Se T24 solicita
um item de dado mantido por T23, ento T24 ser desfeita. Se T24 solicitar um item de dado mantido por
T23, ento T24 esperar.
Sempre que as transaes forem revertidas, importante garantir que no haja inanio (starvation)
isto , que nenhuma transao seja desfeita continuamente e jamais possa continuar seu processamento.
Ambos os esquemas, esperar-morrer e ferir-esperar, evitam a inanio: qualquer que seja o momento,
possvel encontrar a transao com menor timestamp. Essa transao no ser revertida em nenhum dos
esquemas. Uma vez que os timestamps sempre crescem, e dado que as transaes no recebem dois novos
timestamps se foram revertidas, a transao revertida, em determinado momento, ter o menor timestamp.
Assim, ela no ser revertida novamente.
H entretanto, diferenas significativas entre as formas dos dois esquemas operar.
No esquema esperar-morrer, a transao mais antiga precisar esperar at que a mais nova libere seus
itens dados. Assim, quanto mais antiga a transao, maior a possibilidade de esperar. Em contraste, no
esquema ferir-esperar, a transao mais antiga nunca espera a mais nova.
No esquema esperar-morrer, se uma transao Ti morre e desfeita porque solicitou um item de dado
preso por uma transao Tj, ento Ti pode reemitir a mesma sequncia de solicitaes quando for
reiniciada. Se os itens de dados ainda estiverem presos por Tj, ento Ti morrer novamente. Assim, Ti
poder morrer diversas vezes antes de conseguir o item de dados necessrio. Compare essa srie de
eventos com o que acontece no esquema ferir-esperar. A transao Ti ser ferida e revertida porque Tj
solicitou um item de dados preso por ela. Quando Ti reinicia e solicita o item de dado preso por Tj, Ti
esperar. Com isso, deve haver menos reverses do esquema ferir-esperar.
O maior problema com ambos os esquemas que podem ocorrer rollbacks desnecessrios.
Esquemas com Base em Tempo Esgotado (Timeout)
Outro enfoque simples para o tratamento de deadlocks tem por base o tempo esgotado para o bloqueio
(lock timeouts). Dessa forma, uma transao que tenha solicitado um bloqueio espera por ele determinado
perodo de tempo. Se o bloqueio no for conseguido dentro desse intervalo, dito que o tempo da transao est
esgotado, assim ela mesma se reverte e se reinicia. Se de fato estiver ocorrendo um deadlock, uma ou mais
transaes nele envolvidas tero seu tempo esgotado e se revertem, permitindo a continuao de outras. Esse
294

esquema pode ser considerado alguma coisa entre preveno de deadlock, dado que o deadlock nunca ocorre, e
deteco e recuperao, j discutidas.
O esquema de tempo esgotado particularmente fcil de ser implementado, trabalha bem se as
transaes forem curtas e longas esperas so frequentemente em funo dos deadlocks. Entretanto, em geral
difcil decidir por quanto tempo a transao deve esperar. Esperas muito longas implicam atrasos desnecessrios,
dado que esteja ocorrendo um deadlock. Esperas muito curtas resultam em transaes sendo revertidas mesmo
sem deadlock, desperdiando recursos. A inanio tambm possvel nesse esquema. Ento ocorre a aplicao
limitada do esquema com base em tempo esgotado.
Deteco de Deadlock e Recuperao
Se um sistema no usa um protocolo resistente ao deadlock, ou seja, que garanta que deadlocks no
aconteam, ento um esquema para deteco e recuperao precisa ser aplicado. Um algoritmo que examina o
estado do sistema evocado periodicamente para determinar se um deadlock est ocorrendo. Se estiver, ento o
sistema precisa tentar recuperar-se. Para isso, ele precisa:
Manter informaes sobre a alocao corrente dos itens de dados para transaes, assim como qualquer
solicitao de itens de dados pendente.
Proporcionar um algoritmo que use essas informaes para determinar se o sistema entrou em estado de
deadlock.
Recuperar-se de um deadlock quando o algoritmo de deteco determinar que ele ocorreu.
Deteco de Deadlock
Os deadlocks podem ser precisamente descritos em, termos de um grfico chamado grfico de espera.
Esse grfico consiste em um par G=(V,E), em que V um conjunto de vrtices e E, um conjunto de arestas. O
conjunto de vrtices consiste em todas as transaes do sistema. Cada elemento do conjunto E de arestas um
par ordenado TiTj. Se TiTj est em E, ento o sentido da aresta, da transao Ti para Tj, implica que a
transao Ti est esperando que a transao Tj libere o item de dado de que ela precisa.
Quando a transao Ti solicita um item de dado que est preso pela transao Tj, ento a aresta TiTj
inserida no grfico de espera. Essa aresta removida somente quando a transao Tj no estiver mais esperando
um item de dado necessrio transao Ti.
H um deadlock no sistema se, e somente se, o grfico de espera contiver um ciclo. Cada transao
envolvida em um ciclo est em deadlock. Para detectar deadlocks, o sistema precisa manter o grfico de espera e,
periodicamente, evocar um algoritmo que verifique a existncia de ciclos.
Para ilustrar esses conceitos, considere o grfico de espera da fig. 14.13, que exibe a seguinte situao:
A transao T25 est esperando as transaes T26 e T27.
A transao T27 est esperando a transao T26.
A transao T26 est esperando a transao T28.

Uma vez que no h ciclos, o sistema no est em estado de deadlock.


Suponha agora que a transao T28 esteja solicitando um item preso por T27. A aresta T28T27 ser
adicionada ao grfico de espera, alterando o estado do sistema, como mostrado na fig. 14.14. A essa altura, o
grfico contm o ciclo:
implicando que as transaes T26, T27 e T28 esto todas em deadlock.
295

Consequentemente, impe-se a questo: quando evocaremos o algoritmo de deteco ser evocado com
mais frequncia que o usual. Os itens de dados alocados nas transaes em deadlock no estaro disponveis para
outras transaes at que o deadlock seja resolvido. Alm disso, o nmero de ciclos no grfico pode crescer
tambm. Na pior das hipteses, evocaramos o algoritmo de deteco sempre que uma solicitao de alocao
no puder ser atendida imediatamente.
Recuperao aps um Deadlock
Quando um algoritmo de deteco determina a existncia de um deadlock, o sistema precisa recuperarse desse deadlock. A soluo mais comum reverter uma ou mais transao para quebrar o deadlock. Devem ser
tomadas trs aes:
1. Selecionar uma vtima. Dado um conjunto de transaes em deadlock, precisamos determinar quais
transaes (ou transao) sero desfeitas para quebrar o deadlock. Poderamos reverter as transaes
que representam o menor custo. Infelizmente, o termo mnimo custo no preciso. Muitos fatores
podem determinar o custo de um rollback, incluindo:
a. A quanto tempo a transao est em processamento e quanto tempo ser ainda necessrio para
que a tarefa seja completada.
b. Quantos itens de dados a transao usou.
c. Quantos itens ainda a transao usar at que se complete.
d. Quantas transaes sero envolvidas no rollback.
2. Rollback. Uma vez decidido que uma transao em particular ser revertida, precisamos determinar at
que ponto ela dever ser revertida. A soluo mais simples revert-la totalmente: abort-la para depois
reinici-la. Entretanto, mais eficaz reverter a transao somente o suficiente para a quebra do deadlock.
Mas esse mtodo exige que o sistema mantenha informaes adicionais sobre o estado de todas as
transaes em execuo.
3. Inanio. Em um sistema no qual a seleo de vtimas tem por base fatores de custo, pode acontecer de
uma mesma transao ser sempre escolhida vtima. Assim, essa transao nunca se completa. Essa
situao chamada de inanio. Precisamos garantir que uma transao seja escolhida vtima somente
um nmero finito (pequeno) de vezes. A soluo mais comum incluir o nmero de reverso no fator de
custos.
Operaes de Insero e Remoo
At agora restringimos nossa ateno a operaes read e write. Essas restries limita a ao das
transaes sobre os itens de dados existentes no banco de dados. Algumas transaes precisam no somente de
acesso a itens de dados existentes, mas tambm da capacidade de criar novos itens de dados. Outras precisam
remover itens de dados. Para examinar como tais transaes afetam o controle de concorrncia, introduzimos as
seguintes operaes adicionais:
delete(Q) remove o item de dados Q do banco de dados.
insert(Q) insere um novo item de dados Q em um banco de dados e designa um valor inicial para ele.
Uma transao Ti que queira operar uma read(Q) depois da remoo de Q resulta em erro lgico em Ti.
Analogamente, se uma transao Ti quiser realizar uma operao de read(Q) antes da insero de Q, tambm
haver erro lgico em Ti. Tambm ser um erro lgico tentar remover um item de dados inexistente.
296

Remoo
Para entender como uma instruo de remoo (delete) afeta o controle de concorrncia, precisamos
definir quando ela entra em conflito com outra instruo. Seja Ii e Ij instrues de Ti e Tj, respectivamente, que
aparecem nessa ordem na escala de execuo S. Seja Ii= delete(Q). Consideremos as seguintes instrues Ij.
Ij = read(Q). Ii e Ij entram em conflito. Se Ii comeou antes de Ij, Tj incorrer em erro lgico. Se Ij comeou
antes de Ii, Tj poder executar a operao read com sucesso.
Ij = write(Q). Ii e Ij entram em conflito. Se Ii comeou antes de Ij, Tj incorrer em erro lgico. Se Ij comeou
antes de Ii, Tj poder executar a operao write com sucesso.
Ij = delete(Q). Ii e Ij entram em conflito. Se Ii comeou antes de Ij, Tj incorrer em erro lgico. Se Ij comeou
antes de Ii, Ti incorrer em erro lgico.
Ij = insert(Q). Ii e Ij entram em conflito. Suponha que o item de dado Q no exista antes da execuo de Ii e
Ij. Ento, se Ii comeou antes de Ij, ocorrer erro lgico em Ti. Se Ij comeou antes de Ii no ocorrer
nenhum erro lgico. Da mesma forma, se Q existir antes da execuo de Ii e Ij, poder ocorrer erro lgico
se Ij comeou antes de Ii, caso contrrio no.
Podemos concluir que, se o bloqueio em duas fases for usado, preciso um bloqueio exclusivo sobre o
item de dados antes que ele possa ser removido. Sob o protocolo de ordenao por timestamp, um teste que ele
possa ser removido. Sob o protocolo de ordenao por timestamp, um teste similar ao indicado para a write
precisar ser realizado. Suponha que a transao Ti emita um delete(Q).
Se TS(Ti)<R-timestamp(Q), ento o valor de Q que Ti removeu j havia sido lido pela transao Tj com
TS(Tj)>TS(Ti). Ento, a operao delete ser rejeitada e Ti ser revertida.
Se TS(Ti)<W-timestamp(Q), ento uma transao Tj com TS(Ti)>TS(Tj) j gravou Q. Com isso, essa operao
delete ser rejeitada e Ti ser desfeita.
De outro modo a operao delete ser executada.
Insero
Vimos que uma operao insert(Q) entra em conflito com uma operao delete(Q). Analogamente,
insert(Q) entra em conflito com uma operao read(Q) ou uma operao write(Q). nenhuma read ou write pode
ser realizada sobre um item de dados antes que ele exista.
Uma vez que insert(Q) estabelea um valor para o item de dado Q, a insert tratada de modo similar
write para efeito de controle de concorrncia:
Sob o protocolo de bloqueio em duas fases, se Ti realizar uma operao insert(Q), Ti estar impondo um
bloqueio exclusivo para o novo item de dado Q criado.
Sob o protocolo de ordenao por timestamp, se Ti realizar uma operao insert(Q), os valores de Rtimestamp(Q) e W-timestamp(Q) sero registros em TS(Ti).
O Fenmeno do Fantasma
Considere a transao T29 que executa a consulta SQL a seguir:

A transao T29 obriga o acesso a todas as tuplas da relao conta pertencentes a agncia Perryridge.
Seja T30 uma transao que executa a seguinte insero SQL:

Seja S uma escala de execuo envolvendo T29 e T30. Esperamos um conflito em potencial pelas seguintes
razes:
Se T29 usar a tupla recentemente inserida por T30 para calcular sum(saldo), ento T29 ler o valor inserido
por T30. Assim, em uma escala de execuo serializada equivalente a S, T30 deve comear antes de T29.
297

Se T29 no usar a tupla recentemente inserida por T30 para calcular sum(saldo) em uma escala de
execuo serializada equivalente a S, T29 deve comear antes de T30.
O segundo caso curioso. T29 e T30 no acessam a nenhum tupla em comum, ainda assim entram em
conflito. Com efeito, T29 e T30 entram em conflito com uma tupla fantasma. Assim, o fenmeno que acabamos de
descrever chamado de fenmeno do fantasma. Se o controle de concorrncia feito com granularidade de
tupla, esse conflito pode no ser detectado.
Para prevenir esse fenmeno, fazemos com que T29 evite que outras transaes criem novas tuplas na
relao conta com nome_agncia= Perryridge.
Para encontrar todas as tuplas de conta com nome_agncia = Perryridge, T29 precisa pesquisar toda a
relao conta, ou ao menos um ndice na relao. At agora, consideramos de modo implcito que os itens de
dados aos quais a transao mantm acesso sejam somente tuplas. Entretanto, T29 um exemplo de transao
que procura a informao de quantas tuplas h na relao e T30 exemplifica uma transao que atualiza essa
informao. lgico que no suficiente bloquear as tuplas que sofrem acesso; o bloqueio tambm necessrio
para informaes sobre os quais tuplas esto na relao.
A soluo mais simples para esse problema seria associar um item de dado prpria relao. Transaes,
como a T29, que leem informaes acerca de quais tuplas esto na relao deveriam, ento, bloquear no modo
compartilhado o item de dado correspondente relao conta. Transao, com a T30, que atualizam as
informaes acerca de quais tuplas esto na relao deveriam bloquear o item de dado no modo exclusivo. Desse
modo, T29 e T30 entram em conflito devido a itens de dados reais, e no fantasmas.
No confunda o bloqueio de uma relao inteira, como no bloqueio de granularidade mltipla, com o
bloqueio de um item de dado correspondente relao. Por meio do bloqueio do item de dado, uma transao
impede somente que outras transaes alterem informaes sobre as tuplas que pertencem relao. O
bloqueio das tuplas ainda necessrio. As transaes que mantm acesso direto a uma tupla podem conseguir o
bloqueio de uma tupla mesmo que outra transao tenha bloqueio exclusivo sobre um item de dado
correspondente quela transao propriamente dita.
A maior desvantagem do bloqueio de um item de dado correspondente a uma relao o baixo grau de
concorrncia duas transaes que inserem tuplas diferentes em uma relao no podem ser concorrentes.
Uma soluo melhor a tcnica do bloqueio de ndices. Qualquer transao que inserir uma tupla em
uma relao deve inserir informaes em todos os ndices mantidos pela relao. Eliminamos o fenmeno do
fantasma por meio da imposio de um protocolo de bloqueios para os ndices.
Todo valor da chave de pesquisa est associado a um registro do ndice ou a um bucket. Uma consulta,
normalmente, usar um ou mais ndices para o acesso relao. Uma consulta, normalmente, usar um ou mais
ndices para o acesso relao. Uma insero precisar introduzir uma nova tupla em todos os ndices de uma
relao.
Em nosso exemplo, assumimos que h um ndice em conta para nome_agncia. Logo, T30 precisa
modificar o bucket de Perryridge. Se T29 l o bucket de Perryridge para localizar todas as tuplas pertencentes
agncia Perryridge, ento T29 e T30 entraro em conflito naquele bucket.
O protocolo de bloqueio de ndices possui a vantagem de criar ndices sobre uma relao por meio da
troca de instncias do fenmeno de fantasmas por conflito de bloqueios em ndices bucket. O protocolo opera da
seguinte forma:
Toda relao precisa ter ao menos um ndice.
Uma transao Ti pode bloquear em modo S uma tupla ti de uma relao somente se ela possui um
bloqueio modo S sobre o ndice bucket que contm um ponteiro para ti.
Uma transao Ti pode bloquear em modo X uma tupla ti de uma relao somente se ela possui um
bloqueio modo X sobre o ndice bucket que contm um ponteiro para ti.
Uma transao Ti no pode inserir uma tupla ti em uma relao r sem atualizar todos os ndices de r. Ti
precisa obter um bloqueio modo X sobre todos os ndices bucket que ela modifica.
preciso observar as regras do protocolo de bloqueio em duas fases.

298

H variante da tcnica de bloqueio de ndices para a eliminao do fenmeno do fantasma em outros


protocolos de controle de concorrncia j apresentados.
Concorrncia em Estruturas de ndices
possvel tratar do acesso s estruturas de ndices como qualquer outra estrutura de um banco de dados
e aplicar as tcnicas de controle de concorrncia discutidas anteriormente. Entretanto, uma vez que os ndices
tm acesso frequente, eles se tornam ponto de grande conteno de bloqueios, originando um baixo nvel de
concorrncia. Felizmente, os ndices no tem de receber o mesmo tipo de tratamento das demais estruturas do
banco de dados, j que no proporcionam um alto nvel de abstrao para o mapeamento de chaves de pesquisa
de tuplas do banco de dados. perfeitamente aceitvel que uma transao verifique um ndice duas vezes e
perceba que essa estrutura de ndice foi alterada nesse meio tempo, contanto que o ndice aponte um conjunto
correto de tuplas. Assim, aceitvel manter acesso concorrente no-seriado em um ndice, contanto que a
preciso do ndice seja mantida.
Mostramos a tcnica para o gerenciamento de acessos concorrentes em rvores-B+.
As tcnicas que apresentamos para rvores-B+ tm por base o bloqueio, mas nem o bloqueio em duas
fases nem o protocolo de rvore so empregados.

299

Sistema de Recuperao
Um sistema de computador, como qualquer outro equipamento mecnico ou eltrico, est sujeito a
falhas. H grande variedade de falhas, incluindo quebra de disco, falha de energia, erro de software, fogo na sala
de equipamento ou mesmo sabotagem. Em cada um desses casos, informaes podem ser perdidas. Portanto, o
sistema de banco de dados deve precaver-se para garantir que as propriedades de atomicidade e durabilidade
das transaes sejam preservadas, a despeito de tais falhas. Uma parte integrante de um sistema de banco de
dados o esquema de recuperao que responsvel pela restaurao do banco de dados para um estado
consistente que havia antes da ocorrncia da falha.
Classificao de Falha
Vrios tipos de falhas podem ocorrer em um sistema, cada um dos quais exigindo um tratamento
diferente. O tipo de falha mais simples de tratar aquele que no resulta na perda de informao no sistema. As
falhas mais difceis de tratar so aquelas que resulta em perda de informao. Vamos considerar somente os
seguintes tipos de falha:
Falha de transao. Dois tipos de erros podem causar uma falha de transao:
o Erro lgico. A transao no pode mais continuar com sua execuo normal devido a alguma
condio interna, como uma entrada inadequada, um dado encontrado, overflow ou limite de
recurso excedido.
o Erro de sistema. O sistema entrou em um estado inadequado (por exemplo, deadlock), com isso,
uma transao no pode continuar com sua execuo normal. A transao, entretanto, pode ser
reexecutada posteriormente.
Queda do sistema. H algum mau funcionamento de hardware ou um bug no software de banco de
dados ou no sistema operacional que causou a perda do contedo no armazenamento voltil e fez o
processamento da transao parar. O contedo de armazenamento no-voltil permanece intato e no
corrompido.
A condio originada por erros de hardware e bugs no software que fazem o sistema parar, mas no
corrompem o contedo do armazenamento no-voltil, conhecida como condio falhar-parar. Sistemas bem
projetados tm numerosas verificaes internas em nvel de hardware e software que fazem o sistema parar
quando h um erro. Consequentemente, a condio falhar-parar uma condio razovel.
Falha de disco. Um bloco de disco perde seu contedo em funo da quebra do cabeote ou da falha
durante uma operao de transferncia de dados. So usadas, para recuperao do sistema aps a falha,
as cpias dos dados em outros discos ou backups de arquivos em meios tercirios, como fitas.
Para determinar como o sistema deve recuperar-se das falhas, necessitamos identificar os modos de falha
possveis dos equipamentos usados para armazenar dados. Depois, devemos considerar como esses modos de
falha afetam o contedo do banco de dados. Ento, poderemos desenvolver algoritmos para assegurar a
consistncia do banco de dados e a atomicidade da transao, a despeito das falhas. Esses algoritmos so
conhecidos como algoritmos de recuperao, embora tenham duas partes:
1. Aes tomadas durante o processamento normal da transao a fim de garantir que haja informao
suficiente para permitir a recuperao de falhas.
2. Aes tomadas em seguida falha, recuperando o contedo do banco de dados para um estado que
assegure sua consistncia, a atomicidade da transao e durabilidade.
Estrutura de Armazenamento
Os vrios itens do banco de dados podem ser armazenados e sofre acesos em diferentes meios de
armazenamento. Para compreender como garantir propriedades de atomicidade e durabilidade de uma
transao, devemos compreender melhor como funcionam esses meios de armazenamento e seus mtodos de
acesso.

300

Tipos de Armazenamento
H vrios tipos de meios de armazenamento; eles so distinguidos por sua velocidade relativa, capacidade
e resistncia falha.
Armazenamento voltil. A informao residente em armazenamento voltil usualmente no sobrevive a
quedas no sistema. Exemplos de tal armazenamento so MP e memria cache. O acesso armazenagem
voltil extremamente rpido, tanto devido velocidade de acesso da memria em si quanto ao acesso
direto a qualquer item de dado possvel no armazenamento voltil.
Armazenamento no-voltil. A informao residente em armazenamento no-voltil sobrevive a quedas
de sistema. Exemplos de tal armazenamento so o disco e fitas magnticas. Os discos so usados para
armazenamento online, ao passo que as fitas so usadas para armazenamento de arquivo. Entretanto,
ambos esto sujeitos falha (por exemplo, quebra de cabeote), que pode resultar em perda de
informao. No atual estado da tecnologia, o armazenamento no-voltil mais lento que o
armazenamento voltil por muitas ordens de magnitude. Essa distino ocorre porque discos e fitas so
equipamentos eletromecnicos, em vez de inteiramente baseados em chips, como o armazenamento
voltil. Outros meios no-volteis so usados, normalmente apenas no backup de dados.
Armazenamento estvel. A informao residente em armazenamento estvel nunca perdida (nunca
entendida aqui como uma agulha no palheiro, j que teoricamente nunca no pode ser garantido por
exemplo, possvel, embora extremamente improvvel, que um buraco negro engula a Terra e destrua
permanentemente todos os dados!). Embora o armazenamento estvel seja teoricamente impossvel de
obter, pode-se chegar perto dele usando tcnicas que torna extremamente improvvel a perda de dados.
Frequentemente, as distines entre os vrios tipos de armazenamento so menos claras na prtica que
em nossa apresentao. Certos sistemas fornecem backup de bateria, de forma que parte da MP pode resistir a
quedas de sistema e falhas de energia. Formas alternativas de armazenamento no-voltil, como meio tico,
fornecem maior grau de confiabilidade que os discos.
Implementao do Armazenamento Estvel
Para implementar o armazenamento estvel, temos de replicar a informao em vrios meios de
armazenamento ano-volteis (usualmente discos), como modos possveis de falha independentes, e controlar a
atualizao das informaes, garantindo que uma eventual falha durante a transferncia de dados no danifique
as informaes.
Os sistemas RAID garantem que a falha de um nico disco (mesmo durante a transferncia de dados) no
resulte em perda de dados. A forma mais simples e mais rpida de RAID o disco espelhado, que mantm duas
cpias de cada bloco em discos separados. Outras formas de RAID oferecem custos menores, mas com menor
desempenho.
Os sistemas RAID, entretanto, no podem se proteger contra perda de dados devido a desastres como
incndios ou enchentes. Muitos sistemas armazenam backups em fitas e diferentes locais para proteger-se contra
tais desastres. Entretanto, j que as fitas no podem ser transportadas continuamente, as atualizaes ocorridas
entre o desastre e o ltimo backup podem ser perdidas. Sistemas mais seguros mantm uma cpia de cada bloco
de armazenamento estvel em um site remoto, enviando-a por uma rede de computadores, alm de armazenar o
bloco em um sistema de disco local. J que os blocos so enviados ao sistema remoto, como e quando so
enviados para o armazenamento local, uma vez completada a operao de sada, essa sada no perdida,
mesmo na ocorrncia de um desastre, como um incndio ou uma enchente.
Vamos discutir como o meio de armazenamento pode ser protegido de uma falha durante a transferncia
de dados. A transferncia de blocos entre a memria e o armazenamento de disco pode resultar em:
Concluso bem-sucedida. A informao transferida chegou de forma segura ao seu destino.
Falha parcial. Uma falha ocorreu no meio de transferncia e o bloco de destino contm informao
incorreta.
301

Falha total. A falha ocorreu cedo o suficiente, de modo que o bloco de destino permanece intato.
Exigimos que, se uma falha na transferncia de dados ocorrer, o sistema a detecte e chama um
procedimento de recuperao para restabelecer o bloco, levando-o a um estado consistente. Para isso, o sistema
deve manter dois blocos fsicos para cada bloco lgico do banco de dados; no caso de discos espelhados, ambos
os blocos ento no mesmo local; no caso de backup remoto, um dos blocos local, enquanto o outro est em um
site remoto. Uma operao de sada executa como segue:
1. Escreve a informao dentro do primeiro bloco fsico.
2. Quando a primeira escrita se completar com sucesso, escreve a mesma informao no segundo bloco
fsico.
3. A sada completada somente aps a segunda escrita completar-se com sucesso.
Durante a recuperao, cada par de blocos fsico examinado. Se ambos so iguais e no h erro detectvel,
ento nenhuma ao adicional necessria. Se um bloco contm um erro detectvel, ento trocamos seu
contedo pelo contedo do segundo bloco. Se ambos os blocos no contm erros detectveis, mas diferem em
contedo, ento trocamos o contedo do primeiro bloco pelo valor do segundo. Esse procedimento de
recuperao assegura que uma escrita em armazenamento estvel seja bem-sucedida (isto , atualize todas as
cpias), ou no resulte em mudana alguma.
Exigir a comparao entre cada par de blocos correspondentes durante a recuperao custoso.
Podemos reduzir consideravelmente o custo mantendo uma varredura de escritas de bloco que esto em
progresso, usando uma pequena quantidade de RAM no-voltil.
Os protocolos para escrita de um bloco em um site remoto so similares aos protocolos para escrita de
blocos em sistema de disco espelhado.
Podemos facilmente expandir esse procedimento para que permita o uso de um nmero arbitrariamente
grande de cpias de cada bloco de armazenamento estvel. Embora o uso de um nmero grande de cpias
reduza a probabilidade de uma falha para muitos menos que quando se usam duas cpias, em geral suficiente
simular o armazenamento estvel somente com duas cpias.

Acesso de dados
O sistema de banco de dados reside permanentemente em armazenamento no-voltil (usualmente
discos) e particionado em unidades de armazenamento de comprimento fixo chamadas de blocos. Os blocos
so unidades de transferncia de dados para e a partir do disco e podem conter vrios itens de dados. Assumimos
que nenhum item de dado abrange dois ou mais blocos. Essa premissa verdadeira para a maioria das aplicaes
de processamento de dados, como em nosso exemplo bancrio.
As transaes transferem informaes do disco para a MP e, ento, reenviam essas informaes de volta
para o disco. As operaes de entrada e sada (entrar e sair da memria) so feitas em unidades de bloco. Os
blocos residentes no disco so chamados de blocos fsicos; os blocos residentes temporariamente na MP so
chamados de blocos de buffer. A rea de memria na qual os blocos residem temporariamente chamada de
buffer de disco.
Movimentos de bloco entre disco e memria principal so iniciados por meio de duas operaes
seguintes:
1. input(B) transfere o bloco fsico B para a MP.
2. output(B) transfere o bloco de buffer B para o disco e troca-o, no disco, pelo fsico apropriado.
Esse esquema ilustrado na fig. 15.1.

302

Cada transao Ti tem uma rea de trabalho privada na qual cpias de todos os itens de dados acessados
e atualizados so mantidas. Essa rea de trabalho criada quando a transao iniciada; ele removida quando
a transao iniciada; ela removida quando a transao efetivada ou abortada. Cada item de dados x mantido
na rea de trabalho da transao Ti denotado por xi. A transao Ti interage com o sistema de banco de dados
pela transferncia de dados para e de sua rea de trabalho at o buffer de sistema. Transferimos os dados usando
as duas operaes a seguir:
1. read(X) designa o valor do item de dado X para a varivel local xi. Essa operao executada como segue:
a. Se o bloco Bx no qual reside X no est na memria principal, ento emitido um input(Bx).
b. Designa a xi o valor de X a partir do bloco de buffer.
2. write(X) designa o valor da varivel local xi para o item de dado X no bloco de buffer. Essa operao
executada como segue:
a. Se o bloco Bx no qual reside X no est na memria principal, ento emite um input(Bx).
b. Designa o valor de xi para X no buffer Bx.
Observe que ambas as operaes podem exigir a transferncia de um bloco do disco para a MP.
Entretanto, elas no exigem a transferncia de um bloco da MP para o disco.
O bloco de buffer ser eventualmente escrito no disco se o gerenciador de buffer necessitar de espao
em memria para outros propsitos ou porque o sistema de banco de dados deseja refletir a mudana em B
sobre o disco. Dizemos que o sistema de banco de dados fora sadas do buffer B se ele emite um output(B).
Quando uma transao necessita do acesso a um item de dado X pela primeira vez, ela deve executar
read(X). Todas as atualizaes de X so, ento, realizadas sobre xi. Aps o ltimo acesso X feito pela transao, ela
executar um write(X) para refletir a mudana em X no banco de dados propriamente dito.
A operao output(Bx) para o buffer de bloco Bx em que X reside no precisa ter efeito imediato aps a
execuo do write(X), j que o bloco Bx pode conter outros itens de dados que ainda esto sendo acessados.
Ento, a sada real aparecer mais tarde. Observe que, se o sistema cair aps a operao write(X) ter sido
executada, mas antes do output(Bx), o novo valor de X nunca ser escrito no disco e, portanto, perdido.
Recuperao e Atomicidade
Considere novamente nosso sistema bancrio simplificado e a transao Ti transfere 50 dlares da conta
A para a conta B, com valores iniciais de A e B sendo mil e dois mil dlares, respectivamente. Suponha que uma
queda de sistema tenha ocorrido durante a execuo de Ti, aps output(BA), mas antes do output(BB), em que BA
e BB denotam os blocos de buffer em que A e B residem. J que os contedos de memria foram perdidos, no
sabemos o destino da transao; ento, poderamos chamar um dos dois possveis procedimentos de
recuperao:
Reexecutar Ti. Este faz com que o valor de A torne-se 900 dlares, em vez de 950 dlares. Ento, o
sistema entra em um estado inconsistente.
No reexecutar Ti. No estado corrente do sistema, os valores A e B so de 950 e 2000 dlares,
respectivamente. Ento, o sistema entra em um estado inconsistente.
Em ambos os casos, o banco de dados deixado em estado inconsistente, logo esse esquema de recuperao
simples no funciona. Essa dificuldade ocorre porque modificamos o banco de dados sem ter certeza de que a
303

transao ser efetivada de fato. Entretanto, se Ti realizou diversas modificaes no banco de dados, podem ser
necessrias vrias operaes de sada e pode ocorrer uma falha aps algumas dessas modificaes terem sido
feitas, mas antes de todas serem realizadas.
Para atingir nosso objetivo de atomicidade, primeiro devemos mandar informaes que descrevam essas
modificaes para um armazenamento estvel, sem modificar o banco de dados em si. Como veremos, esse
procedimento nos permitir enviar todas as modificaes feitas por uma transao efetivada, apesar de possveis
falhas. H duas maneiras de realizar tais sadas. Vamos assumir que as transaes so executadas serialmente,
isto , somente uma nica transao est ativa de cada vez.
Recuperao Baseada em Log
A estrutura mais usada para gravar modificaes no banco de dados o log (dirio). O log uma
sequncia de registros de log que mantm um arquivo atualizado das atividades no banco de dados. H vrios
tipos de registros de log que mantm um arquivo atualizado das atividades no banco de dados. H vrios tipos de
registro de log. Um registro de atualizao de log descreve uma nica escrita do banco de dados e tem os
seguintes campos:
Identificador de transao um identificador nico da transao que realiza operao de escrita (write).
Identificao de item de dado um identificador nico do item de dado escrito. Normalmente, a
localizao do item de dado no disco.
Valor antigo o valor do item de dado anterior escrita.
Valor novo o valor que o item de dado ter aps a escrita.
H outros registros de log para arquivar eventos significativos durante o processamento de transao,
como o incio da transao, sua efetivao ou aborto. Indicamos os vrios tipos de registros de log como seguem:
<Ti start>. A transao Ti comeou.
<Ti, Xj, V1, V2>. A transao Ti foi efetivada.
<Ti abort>. A transao Ti foi abortada.
Sempre que uma transao realiza uma escrita, essencial que o registro de log para aquela escrita seja
criado antes do banco de dados ser modificado. Havendo o registro de log, podemos enviar a modificao ao
banco de dados quando ela for conveniente. Tambm conseguiremos inutilizar (undo) uma modificao que j
tenha sido enviada ao banco de dados. Podemos desfaz-la usando o campo de valor antigo do registro de log.
Para que os registros de log sejam teis na recuperao aps falhas de sistema e disco, o log deve residir
em armazenamento estvel. Por enquanto, assumiremos que todo registro de log ser escrito no final do arquivo
de log em armazenamento estvel, to logo seja criado. Veremos quando seguro afrouxar essa exigncia para
reduzir o overhead imposto ao registro em log. Introduziremos tambm duas tcnicas de uso de log para garantir
atomicidade de transaes apesar das falhas. Repare que o log contm um registro completo de toda atividade
do banco de dados. Com isso, o volumo de dados armazenado no log pode tornar-se absurdamente grande.
Mostraremos quando seguro apagar informaes de log.
Modificaes adiadas do banco de dados
A tcnica de adiar modificaes garante a atomicidade de transaes quando todas as modificaes do
banco de dados so escritas no log, adiando a execuo de todas as operaes write de uma transao at sua
efetivao parcial. Lembre-se de que uma transao considerada parcialmente efetivada quando a ltima ao
da transao tiver sido executada. A verso da tcnica de modificao que descrevemos aqui pressupe que as
transaes sejam executadas serialmente.
Quando uma transao parcialmente efetivada, as informaes no log associadas quela transao so
usadas para a execuo das escritas adiadas. Se o sistema cair antes de completar a transao ou se a transao
for abortada, ento as informaes do log sero simplesmente ignoradas.

304

A execuo da transao Ti funciona como segue. Um registro <Ti start> escrito no log antes de Ti ter
incio. Uma operao write(X) feita por Ti resulta na escrita de um novo registro no log. Finalmente, quando Ti
parcialmente efetivada, um registro <Ti commit> escrito no log.
Quando uma transao Ti parcialmente efetivada, os registros no log a ela associados so usados para
execuo das escritas adiadas. Como uma falha pode ocorrer enquanto essa execuo est em andamento,
devemos ter certeza, antes de comea-la, de que todos os registros de log estejam escritos em armazenamento
estvel. Uma vez escritas, as atualizaes reais podem ocorrer de fato e a transao entra no estado de
efetivao.
Observe que somente o novo valor do item de dado necessrio para a tcnica de modificao adiada.
Logo, podemos simplificar a estrutura geral do registro de atualizao do log, que vimos anteriormente, por meio
da omisso do campo de valor antigo.
Para ilustrao, reconsidere nosso exemplo de sistema bancrio simplificado. Seja T0 uma transao que
transfere 50 dlares da conta A para a conta B. Essa transao definida como segue:

Seja T1 uma transao que debita cem dlares da conta C. Essa transao definida como:

Suponha que essas transaes sejam executadas serialmente, T0 seguida por Ti e os valores das contas
A, B e C antes da execuo, eram de 1000, 2000 e 700 dlares, respectivamente. A poro do log contendo as
informaes relevantes sobre essas duas transaes apresentada 15.2.

Como resultado da execuo de T0 e T1, h vrias ordens possveis em que as sadas reais podem ocorrer,
tanto para o sistema de banco de dados como para o log. Tal ordem apresentada na fig. 15.3. Note que o valor
de A alterado somente aps o registro <T0, A, 950> ter sido colocado no log.

Usando o log, o sistema pode lidar com qualquer falha que resulte em perda de informao no
armazenamento voltil. O esquema de recuperao usa o seguinte procedimento:
redo(Ti) define o valor de todos os itens de dados atualizados pela transao Ti para os novos valores.
O conjunto de itens de dados atualizados por Ti e seus respectivos novos valores podem ser encontrados
no log.
305

A operao redo (refazer) deve ser idempotente, isto , execut-la vrias vezes deve ser equivalente a
execut-la uma vez s. Essa caracterstica exigida se formos garantir comportamento correto, mesmo que uma
falha ocorra durante o processo de recuperao.
Aps a ocorrncia de uma falha, o subsistema de recuperao consulta o log para determinar quais
transaes tm de ser refeitas. A transao Ti dever ser refeita se, e somente se, o log contiver os registros <Ti
start> e <Ti commit>. Assim, se o sistema cair depois que a transao completar sua execuo, as informaes no
log sero usadas na restaurao do sistema para o estado consistente anterior.
Como ilustrao, retornemos a nosso exemplo bancrio com as transaes T0 e T1 executadas uma aps a
outra, T0 seguida por T1. A figura 15.2 mostra o log resultante da execuo completa de T0 e T1.
Suponhamos que o sistema caia antes que as transaes terminem, de forma que possamos ver como a
tcnica de recuperao restabelece o banco de dados para um estado consistente. Assuma que a queda logo aps
o registro de log do passo write (B) da transao T0 ter sido escrito em armazenamento estvel. O log, no
momento da queda, mostrado na fig. 15.4a. Quando o sistema retorna, nenhuma ao refazer tem de ser
tomada, j que nenhum registro de efetivao aparece no log. Os valores das contas A e B permanecem mil e dois
mil dlares, respectivamente. Os registros de log da transao incompleta T0 podem ser removidos do log.

Agora, assumamos que a queda venha logo aps o registro de log para o passo write(C) da transao T1
ter sido escrito em armazenamento estvel. Nesse caso, o log, no momento da queda, est como na fig. 15.4.
Quando o sistema retorna, a operao redo (T0) realizada, j que o registro <T0 commit> aparece no log em
disco. Aps essa operao, os valores das contas A e B so 950 e 2050 dlares, respectivamente. O valor da conta
C permanece 700 dlares. Como antes, os registros de log da transao incompleta T1 podem ser removidos do
log.
Por ltimo, assumamos que uma queda ocorra logo aps o registro de log <T1 commit> ser escrito em
armazenamento estvel. O log, no momento dessa queda, est como mostra a fig. 15.4c. Quando o sistema
retorna, dois registros de efetivao esto no log: um para T0 e um para T1. Portanto, as operaes redo(T0) e
redo(T1) devem ser processadas. Aps essas operaes, os valores das contas A, B e C so, respectivamente, 950,
2050 e 600 dlares.
Finalmente, consideremos o caso em que uma segunda queda de sistema ocorre durante a recuperao
da primeira queda. Algumas mudanas devem ter sido feitas no banco de dados como resultado das operaes
redo, mas pode ser que nem todas as alteraes tenham ocorrido. Quando o sistema retornar da segunda queda,
a recuperao se dar exatamente como nos exemplos anteriores.
Para cada registro de efetivao <Ti commit> encontrado no log, a operao redo(Ti) ser processada. Em
outras palavras, as aes de recuperao so reinicializadas a partir do comeo. J que redo escreve valores no
banco de dados independente de seus valores correntes, o resultado de uma segunda tentativa de redo ser igual
ao alcanado caso o redo seja bem-sucedido j na primeiro vez.
Modificao Imediata de Banco de Dados
A tcnica de atualizao imediata permite que as modificaes no banco de dados sejam enviadas
enquanto as transaes ainda esto no estado ativo. As escritas emitidas por transaes ativas so chamadas de
modificaes no-efetivadas. Na ocorrncia de uma queda ou de uma falha de transao, o sistema dever usar o
campo relativo ao valor antigo dos registros de log para restaurao dos itens de dados modificados, levando-os
306

ao valor anterior ao incio da transao. Essa restaurao conseguida por meio da operao undo (desfazer)
descrita a seguir.
Antes que uma transao Ti inicie sua execuo, o registro <Ti start> escrito no log. Durante sua
execuo, qualquer operao write(X) feita por Ti precedida pela escrita apropriada do novo registro corrente
no log. Quando Ti parcialmente efetivada, o registro <Ti commit> escrito no log.
J que as informaes do log so usadas na reconstruo do estado do banco de dados, no podemos
permitir que a atualizao real do banco de dados ocorra antes da escrita correspondente, em armazenamento
estvel, do registro de log. Portanto, exigimos que, antes da execuo de uma operao output(B), os registros de
log correspondentes a B sejam escritos em armazenamento estvel.
Como ilustrao, reconsideremos nosso sistema bancrio simplificado, com transaes T0 e T1 executadas
uma aps a outra com T0 seguida por T1. A poro do log contendo as informaes importantes relativas a essas
duas transaes apresentada na fig. 15.5.

Uma ordem possvel de ocorrncia das sadas reais, tanto para o sistema de banco de dados quanto para
o log, resultantes da execuo de T0 e T1, descrita na fig. 15.6. Observe que essa ordem no poderia ser obtida
na tcnica de modificao adiada.

Usando o log, o sistema pode tratar de qualquer falha que no resulte na perda de informao em
armazenamento no-voltil. O esquema de recuperao usa dois procedimentos de recuperao:
undo(Ti) retorna aos valores antigos todos os itens de dados atualizados pela transao Ti.
redo(Ti) ajusta os valores de todos os itens de dados atualizados pela transao Ti para os valores novos.
O conjunto de itens de dados atualizados por Ti e seus respectivos valores antigos e novos podem ser
encontrados no log.
As operaes undo e redo devem ser idempotentes para garantir o comportamento correto mesmo se
uma falha ocorrer durante o processo de recuperao.
Aps a falha, o esquema de recuperao consulta o log para determinar quais transaes necessitam ser
refeitas e quais necessitam ser inutilizadas. Essa classificao de transaes conseguida como segue:
A transao Ti tem de ser inutilizada se o log contm o registro <Ti start>, mas no contm o registro <Ti
commit>.
A transao Ti tem de ser refeita se o log contm tanto o registro <Ti start> quanto o registro <Ti commit>.
Como ilustrao, retornaremos a nosso exemplo bancrio, com as transaes T0 seguida por T1. Suponhamos
que o sistema caia antes do trmino das transaes. Deveremos considerar trs casos. O estado dos logs para
cada um desses casos mostrado na fig. 15.7.
307

Primeiro, assumamos que a queda ocorra logo aps o registro de log para o passo write(B) da transao
T0 ter sido escrito em armazenamento estvel (fig. 15.7a). quando o sistema retorna, ele encontra o registro <T0
start> no log, mas nenhum registro <T0 commit> correspondente. Ento, a transao T0 dever ser inutilizada, de
modo que um undo(T0) ser processado. Como resultado, os valores nas contas A e B (no disco) so restaurados
em mil e dois mil dlares, respectivamente.
A seguir, assumamos que a queda venha logo aps o registro de log para o passo write(C) da transao T1
ter sido escrito em armazenamento estvel (fig. 15.7b). Quando o sistema retornar, duas aes de recuperao
necessitam ser tomadas. A operao undo (T1) deve ser realizada, j que o registro <T1 start> aparece no log, mas
no h o registro <T1 commit>, e a operao redo(T0) tambm deve ser realizada, j que o log contm tanto o
registro <T0 start> como o registro <T0 commit>. No fim do processo de recuperao completo, os valores das
contas A, B e C sero 950, 2050 e 700 dlares, respectivamente. Observe que a operao undo(T1) realizada
antes de redo(T0). Nesse exemplo, o resultado seria o mesmo se a ordem fosse revertida. Entretanto, fazer
primeiro as operaes undo e depois as operaes redo importante no algoritmo de recuperao que veremos
adiante.
Finalmente, assumamos que a queda ocorra logo aps o registro de log <T1 commit> ter sido escrito em
armazenamento estvel (fig. 15.7c). Quando o sistema retorna, tanto T0 como T1 necessitam ser refeitas, j que os
registros <T0 start> e <T0 commit> aparecem no log, assim como os registros <T1 start> e <T1 commit>. Aps os
procedimentos de recuperao redo(T0) e redo(T1), os valores nas contas A, B e C sero 950, 2050 e 600 dlares,
respectivamente.
Checkpoints
Quando uma falha de sistema ocorre, devemos consultar o log para determinar aquelas transaes que
necessitam ser refeitas e aquelas que necessitem ser inutilizadas. A princpio, para isso, deveramos pesquisar
todo o log. H duas grandes dificuldades nessa abordagem:
1. O processo de pesquisa consome tempo.
2. Muitas das transaes que, de acordo com nosso algoritmo, necessitam ser refeitas j escreveram suas
atualizaes no banco de dados. Embora refaz-las no cause dano algum, a recuperao torna-se mais
longa.
Para reduzir esses tipos de overhead, introduzimos os checkpoints (pontos de controle). Durante a
execuo, o sistema mantm o log usando uma das duas tcnicas descritas anteriormente. Alm disso, o sistema
cria checkpoints periodicamente, que exigem a execuo da seguinte sequncia de aes:
1. Sada, para armazenamento estvel, de todos os registros residentes na memria principal;
2. Sada, para disco, de todos os blocos de buffer modificados.
3. Sada, para armazenamento estvel, de um registros de log <checkpoint>.
No permitido s transaes processar quaisquer aes de atualizao, como escrever em um bloco de
buffer ou escrever um registro de log, enquanto um checkpoint est em progresso.
A presena de um registro <checkpoint> no log permite que o sistema dinamize seu procedimento de
recuperao. Considere uma transao Ti efetivada antes do checkpoint. Para tal transao, o registro <Ti
commit> aparece no log antes do registro <checkpoint>. Quaisquer modificaes feitas por Ti ou j foram escritas
no banco de dados antes do checkpoint ou o foram como parte do checkpoint propriamente dito. Ento, no
momento de recuperao, no haver necessidade de uma operao redo sobre Ti.
308

Essa observao permite-nos refinar nossos esquemas de recuperao anteriores (continuamos a assumir
que as transaes so executadas serialmente). Aps uma falha, o esquema de recuperao examina o log para
determinar a ltima transao Ti anterior ao checkpoint mais recente. Isso poder ser feito por uma pesquisa
retroativa no log, a partir de seu final at o primeiro registro <checkpoint> (j que estamos pesquisando em
ordem cronolgica inversa, o registro encontrado ser o ltimo registro <checkpoint> do log); ento o sistema
continuar a pesquisar retroativamente at encontrar o prximo registro <Ti start>. Esse registro identifica uma
transao Ti.
Uma vez identificada a transao Ti, as operaes redo e undo devem ser aplicadas transao Ti e a
todas as transaes Tj que comearam depois da dela. Indiquemos essas transaes pelo conjunto T. O restante
(parte anterior) do log pode ser ignorado e at mesmo apagado, se for conveniente. Quais operaes de
recuperao devem, exatamente, ser processadas depender da tcnica de modificao em uso, se imediata ou
adiada. As operaes de recuperao exigidas, se a tcnica de modificao imediata empregada, so as
seguintes:
Para todas as transaes Tk em T que no tm nenhum registro <Tk commit> no log ser executado
undo(Tk).
Para todas as transaes Tk em T tais que o registro <Tk commit> aparece no log ser executado redo(Tk).
Obviamente, a operao undo no ser aplicada caso a tcnica de modificao adiada esteja em uso.
Como ilustrao, considere o conjunto de transaes {T0,T1,..., T100} executado na ordem dos subescritos.
Suponha que o checkpoint mais recente tenha ocorrido durante a execuo da transao T67. Ento, somente as
transaes T67, T68, ..., T100 necessitam ser consideradas durante o esquema de recuperao. Cada uma delas ser
refeita se tiver sido efetivada; caso contrrio, ser inutilizada.
Paginao Shadow
Uma alternativa s tcnicas de recuperao de queda baseada em log a paginao shadow (sombra). A
tcnica de paginao shadow essencialmente uma melhoria de tcnica de cpia shadow. Sob certas
circunstncias, a paginao shadow pode exigir menos acessos a disco que os mtodos baseados em log que
acabamos de discutir. Entretanto, tambm h desvantagens nessa abordagem, como veremos. Por exemplo,
difcil aplicar a paginao shadow pode exigir menos acessos a disco que os mtodos baseados em log que
acabamos de discutir. Entretanto, tambm h desvantagens nessa abordagem, como veremos. Por exemplo,
difcil aplicar a paginao shadow em transaes concorrentes.
Como antes, o banco de dados particionado em um nmero de blocos de comprimento fixo, chamados
de pginas. O termo pgina emprestado dos sistemas operacionais, j que estamos usando um esquema de
paginao para gerenciamento de memria. Assumamos que haja n pginas, numeradas de 1 at n. (Na prtica, n
pode ser da ordem de centenas de milhares.) Essas pginas no necessitam ser armazenadas em alguma ordem
particular no disco (h muitas razes para que isso no acontea). Entretanto, deve haver uma forma de
encontrar, para um i qualquer, a i-sima pgina do banco de dados. Usamos, para esse proposito, uma tabela de
pgina, como mostrado na fig. 15.8. A tabela de pgina tem n entradas uma para cada pgina do banco de
dados. Cada entrada contm um ponteiro para uma pgina no disco. A primeira entrada contm um ponteiro
para a primeira pgina do banco de dados, a segunda entrada aponta para a segunda pgina e assim por diante. O
exemplo da fig. 15.8 mostra que a ordem lgica das pginas do banco de dados no necessita corresponder
ordem fsica em que as pginas esto armazenadas no disco.
A ideia bsica da tcnica de paginao shadow manter duas tabelas de pgina durante o processamento
da transao: a tabela de pginas atuais e a tabela de pginas shadow. Quando a transao comea, ambas as
tabelas so idnticas. A tabela de pgina shadow no alterada durante toda a durao da transao. A tabela de
pgina atual alterada quando a transao processa uma operao write. Todas as operaes de entrada (input)
e sada (output) usam a tabela de pginas atuais para localizar pginas do banco de dados no disco.

309

Suponha que a transao processe uma operao write(X) e que X resida na i-sima pgina. A operao
write executada como segue:
1. Se a i-sima pgina (isto , a pgina em que X reside) ainda no est na MP, ento ser emitido um
input(X).
2. Se essa a primeira escrita processada na i-sima pgina por essa transao, ento a tabela de pginas
atuais ser modificada conforme segue:
a. Encontra-se uma pgina sem uso no disco. Normalmente, o sistema de banco de dados tem
acesso a uma lista de pginas sem uso (livres).
b. Remove-se a pgina encontrada no passo 2a a partir da lista de quadros de pginas livres.
c. Modifica-se a tabela de pginas atuais, tal que a i-sima entrada aponte para a pgina encontrada
no passo 2a.
3. Designa-se o valor de xj para X na pgina de buffer.

Comparemos a ao precedente para a operao write com aquela j descrita. A nica diferena
adicionamos um novo passo. Os passos 1 e 3 anteriores correspondem aos passos 1 e 2 descritos anteriormente.
O passo adicional, passo 2, manipula a tabela de pginas atuais. A fig. 15.9 mostra as tabelas, shadow e atual,
para uma transao que realize uma escrita na quarta pgina de um banco de dados constitudo de dez pginas.
Intuitivamente, a abordagem de recuperao por meio de pginas shadow consiste em manter uma
tabela de pginas atuais. A fig. 15.9 mostra as tabelas, shadow e atual, para uma transao que realize uma
escrita na quarta pgina de um banco de dados constitudo de dez pginas.
Intuitivamente, a abordagem de recuperao por meio de pginas shadow consiste em manter uma
tabela de pginas shadow em armazenamento no-voltil, tal que se possa recuperar o estado do banco de dados
anterior execuo da transao, devido a uma queda ou aborto da transao. Quando uma transao
efetivada, a tabela de pginas atuais escrita em armazenamento no-voltil. A tabela de pginas atuais torna-se,
ento, a nova tabela de pginas shadow e, ento, uma nova transao pode comear. importante que a tabela
de pginas shadow seja armazenada em meio no-voltil, j que ela fornece o nico meio de localizao das
pginas do banco de dados. A tabela de pginas atuais pode ser mantida na MP (armazenamento voltil). No
importa se a tabela de pginas atuais perdida em uma queda, j que o sistema se recupera usando a tabela de
pgina shadow.

310

Uma recuperao bem-sucedida exige que, aps uma queda, encontremos a tabela de pginas shadow no
disco. Uma forma simples de encontra-la manter, em uma localizao fixa de armazenamento estvel, o
endereo em disco da tabela de pgina shadow. Quando o sistema retornar aps uma queda, copiamos a tabela
de pginas shadows na MP e a usamos para o processamento subsequente da transao. Devido a nossa
definio de operao write, garantimos que a tabela de pginas shadow apontar para as pginas do banco de
dados que correspondem ao estado do banco de dados anterior a qualquer transao ativa no momento da
queda. Ento, o aborto de transaes automtico. Ao contrrio dos esquemas baseados em log, nenhuma
operao undo precisa ser chamada.
Para efetivar uma transao, devemos fazer o seguinte:
1. Garantir que todas as pginas de buffer da MP que foram alteradas pela transao sejam enviadas para a
sada em disco. (Observe que essas operaes de sada no alteraro as pginas do banco de dados
apontadas pela tabela de pginas shadow.)
2. Enviar a tabela de pginas atuais para sada em disco. Observe que no devemos sobrescrever a tabela de
pginas atuais, j que poderemos precisar dela para a recuperao aps uma queda.
3. Enviar os endereos de disco da tabela de pgina atuais para a localizao fixa em armazenamento
estvel que contm o endereo da tabela de pginas shadow. Essa ao sobrescreve o endereo da tabela
de pginas shadow antiga. Portanto, a tabela de pginas atuais tornou-se a tabela de pginas shadow e a
transao foi efetivada.
Se uma queda ocorrer antes do trmino do passo 3, reverteremos ao estado anterior ao da execuo da
transao. Se a queda ocorrer aps o trmino do passo 3, os efeitos da transao ainda assim sero preservados;
nenhuma operao redo precisar ser atividade.
A paginao shadow oferece diversas vantagens sobre as tcnicas baseadas em log. O overhead relativo
ao envio dos registros de log eliminado e a recuperao de falhas significativamente mais rpida (j que
nenhum operao undo e redo necessria). Entretanto, h tambm inconvenientes nessa tcnica.
Overhead de efetivao. A efetivao de uma nica transao usando paginao shadow exige que
diversos blocos sejam enviados blocos de dados reais, tabela de pginas atuais e o endereo de disco da
tabela de pginas atuais. Os esquemas baseados em log precisam enviar somente os registros de log que,
para as pequenas e mais comuns transaes, cabem dentro de um bloco.
Fragmentao de dado. Consideramos estratgias para manter prximas no disco as pginas do banco de
dados relacionadas fisicamente. Essa proximidade permite maior rapidez na transferncia de dados. A
paginao shadow gera alteraes na localizao das pginas do banco de dados quando elas sofrem
311

atualizaes. Com isso, ou perdemos a proximidade das pginas ou precisaremos recorrer a esquemas
mais complexos, com maior overhead para gerenciamento do armazenamento fsico.
Coleta de lixo. Cada vez que uma transao efetivada, as pginas do banco de dados contendo a verso
antiga do dado, alterado pela transao, tornam-se inacessveis. Na fig. 15.9, a pgina apontada pela
quarta entrada da tabela de pginas shadow se tornar inacessvel se a transao daquele exemplo for
efetivada. Tais pginas so consideras lixo, j que elas no fazem parte do espao livre nem contm
informao til. O lixo tambm pode ser um efeito colateral das quedas. Periodicamente, necessrio
encontrar todas as pginas lixo e adicion-las lista de pginas livres. Esse processo, chamado de coleta
de lixo, impe overhead e complexidade adicionais ao sistema. H vrios algoritmos-padro para coleta
de lixo.
Alm dos inconvenientes que mencionamos, a adaptao da paginao shadow a sistemas com
transaes concorrentes mais difcil do que registro de log. Em tais sistemas, algum tipo de registro de log
normalmente necessrio, mesmo que a paginao shadow seja usada. O prottipo do Sistema R, por exemplo,
usava uma combinao de paginao shadow com um esquema de registro de log similar ao j apresentado.
relativamente simples ampliar os esquemas de recuperao baseados em log para que trabalhem com transaes
concorrentes. Por essas razes, a paginao shadow no to usada.
Recuperao com Transaes Concorrentes
At agora, consideramos a recuperao em um ambiente no qual uma nica transao executada por
vez. Agora, discutiremos como modificar o esquema de recuperao baseado em log para tratar de diversas
transaes concorrentes. Independente do nmero de transaes concorrentes, o sistema tem um nico buffer
de disco e um nico log. Os blocos de buffer so compartilhados por todas as transaes. Permitiremos, alm de
atualizaes imediatas, que um bloco de buffer tenha itens de dados atualizados por uma ou mais transaes.
Interao com Controle de Concorrncia
O esquema de recuperao depende muito do esquema de controle de concorrncia em uso. Para
reverter (rollback) uma transao com falha, devemos inutilizar as atualizaes processadas por ela. Suponha que
uma transao T0 tenha de ser desfeita e um item de dado Q que foi atualizado por T0 tenha de recuperar seu
valor antigo. Usando os esquemas baseados em log, recuperamos esses valor usando as informaes undo de um
registro de log.
Suponha agora que uma segunda transao T1 tenha tambm processado uma atualizao sobre Q antes
de T0 ser desfeita. Ento, a atualizao processada por T1 ser perdida quando T0 for revertida.
Portanto, exigimos que, se uma transao T atualizou um item de dado Q, nenhuma outra transao
consiga atualizar o mesmo item de dado at que T tenha sido efetivada ou revertida. Podemos facilmente cumprir
essa exigncia pelo bloqueio em duas fases severo isto , bloqueio em duas fases com bloqueios exclusivos
mantidos at o final da transao.
Reverso de Transao
Revertemos uma transao com falha, Ti, usando o log. O log reexaminado, do fim para o comeo; e
para cada registro da forma <Ti, Xj, V1, V2> encontrado, o item de dado Xj restaurado em seu valor antigo V1.
Esse exame termina quando o registro de log <Ti, start> encontrado.
Reexaminar o log de trs para frente importante, j que uma transao pode ter atualizado um item de
dados mais de uma vez. Como ilustrao, considere o par de registros de log:

Os registros de log representam uma modificao do item de dado A por Ti, seguido de outra modificao
de A por Ti. Reexaminar o log do final para o comeo ajusta A corretamente para 10. Se os logs fossem
examinados no sentido inverso, A seria ajustado para 20, cujo valor incorreto.
312

Se o bloqueio em duas fases severo usado para controle de concorrncia, os bloqueios mantidos pela
transao T podem ser liberados somente aps a transao ter sido revertida, como descrito. Uma vez que uma
transao T (que revertida) tenha atualizado um item de dado, nenhuma outra transao poder atualizar o
mesmo item de dado, devido s exigncias de controle de concorrncia mencionadas anteriormente. Portanto, a
recuperao do valor antigo do item de dado no apagar os efeitos de qualquer transao.
Checkpoints
Usamos checkpoints para reduzir o nmero de registros de log que devem ser examinados quando o
sistema se recupera de uma queda. J que no tnhamos levado qualquer ocorrncia em conta, foi necessrio
considerar somente as seguintes transaes durante a recuperao:
Aquelas transaes que iniciaram aps o checkpoint mais recente.
Aquela transao, se houver alguma, que estava ativa no momento da escrita do checkpoint mais
recente.
A situao mais complexa quando as transaes podem ser executadas de modo concorrente, j que
vrias transaes poderiam estar ativas no momento em que o checkpoint mais recente foi gerado.
Em um sistema com processamento de transaes concorrentes, exigimos que o registro de log relativo
ao checkpoint seja da forma <checkpoint L>, em que L a lista de transaes ativas no momento do checkpoint.
Novamente, assumimos que as transaes no processam atualizaes tanto nos blocos de buffer como no log
enquanto o checkpoint est em andamento.
A exigncia de que as transaes no devem realizar quaisquer atualizaes nos blocos de buffer, ou no
log, durante o checkpoint pode ser preocupante, j que o processamento de transao ter de parar enquanto
um checkpoint estiver em progresso. Um fuzzy checkpoint aquele que permitido s transaes processarem
atualizaes mesmo quando os blocos de buffer esto sendo escritos.
Recuperao por Reincio
Quando um sistema se recupera de uma queda, ele constri duas listas: a lista inutilizar (undo-list), que
consiste em transaes a serem inutilizadas, e a lista refazer (redo-list), que consiste em transaes a serem
refeitas.
Essas duas listas so construdas na recuperao como segue. Inicialmente, ambas esto vazias.
Examinando o log de trs para frente, cada registro, at que seja encontrado o primeiro registro <checkpoint>:
Para cada registro da forma <Ti commit> encontrado, adicionamos Ti lista refazer.
Para cada registro da forma <Ti start> encontrado, se Ti no estiver na lista refazer, ento adicionamos Ti
na lista inutilizar.
Quando todos os registros de log apropriados tiverem sido examinados, checamos a lista L no registro de
checkpoint em questo. Para cada transao Ti em L, se Ti no estiver na lista refazer, ento ser adicionada lista
inutilizar.
Uma vez construdas as listas refazer e inutilizar, os procedimentos de recuperao prosseguem como
segue:
1. Reexaminar o log a partir do registro mais recente e processar um undo para cada registro de log
pertencente transao Ti na lista inutilizar. Os registros de log de transaes na lista refazer sero
ignorados nessa fase. O exame para quando os registros <Ti start> so encontrados para cada
transao Ti na lista inutilizar.
2. Localizar o registro <checkpoint L> mais recente no log. Note que este passo pode implicar exame do
log na ordem cronolgica crescente, se o registro de checkpoint foi ultrapassado no passo 1.
3. Examinar o log a partir do registro <checkpoint L> mais recente at o final e processar redo para cada
registro de log pertencente a uma transao Ti que est na lista refazer. Ignorar os registros de log de
transaes na lista inutilizar nessa fase.

313

importante processar o log no passo 1, na ordem cronolgica decrescente, para garantir que o estado
resultante do banco de dados estar correto.
Aps desfazer todas as transaes da lista inutilizar, as transaes da lista refazer so refeitas.
importante, nesse caso, processar o log na ordem cronolgica crescente. Completado o processo de recuperao,
o processamento da transao reassumido.
Quando se usa o algoritmo precedente, importante inutilizar uma transao da lista inutilizar antes de
refazer transaes da lista refazer. De outra forma, o seguinte problema pode ocorrer. Suponha que o item de
dado A tenha inicialmente o valor 10. Suponha que uma transao Ti tenha atualizado o item de dado A para 20 e
depois foi abortada; a reverso da transao restauraria A para o valor 10. Suponha, ento, que outra transao Tj
tenha atualizado o item de dado A para 30 e tenha sido efetivada; em seguida, o sistema cai. O estado do log no
momento da queda :

Se o passo redo processado primeiro, A ser ajustado para 30; ento, no passo undo, A ser ajustado
para 10, o que est errado. O valor final de Q deveria ser 30, que podemos alcanar processando undo antes de
redo.
Gerenciamento de Buffer
Vamos considerar diversos detalhes sutis, embora essenciais, para a implementao de um esquema de
recuperao de queda que garanta consistncia de dados e imponha uma quantidade mnima de overhead
devido a interaes com o banco de dados.
Bufferizao de Registro de Log
Anteriormente, assumimos que qualquer registro de log enviado para a sada de armazenamento
estvel no momento em que criado. Essa situao impe grande overhead execuo do sistema pelas
seguintes razes. Normalmente, a sada para armazenamento estvel ocorre em unidades de blocos. Em muitos
casos, um registro de log muito menor que um bloco. Ento, a sada de cada registro de log se traduz em uma
sada muito maior no nvel fsico. Alm do mais a sada de um bloco para armazenamento estvel pode significar
vrias operaes de sada no nvel fsico.
O custo relativo ao processamento de uma sada de bloco para armazenamento estvel suficientemente
alto; melhor que saiam diversos registros de log de uma s vez. Para isso, escrevemos os registros de log em um
buffer de log na MP, onde permanecem temporariamente, at serem enviados para armazenamento estvel.
Mltiplos registros de log podem ser reunidos no buffer de log e enviados para armazenamento estvel em uma
nica operao de sada. A ordem dos registros de log no armazenamento estvel deve ser exatamente a mesma
na qual foram escritos no buffer de log.
Em consequncia do uso da bufferizao do log, um registro de log pode residir somente em MP
(armazenamento voltil) por um tempo considervel antes de ser enviado para a sada em armazenamento
estvel. J que tais registros de log so perdidos se os sistema cair, devemos impor exigncias adicionais s
tcnicas de recuperao para garantia de atomicidade da transao:
A transao Ti entra em estado de efetivao aps o registro de log <Ti commit> ter sido enviado para
sada em armazenamento estvel.
Antes do registro de log <Ti commit> sofrer armazenamento estvel, todos os registros de log
pertencentes transao Ti devero ter sido enviados para armazenamento estvel.
Antes de um bloco de dados na MP podem ser enviado para o banco de dados (em armazenamento novoltil), todos os registros de log pertencentes a dados naquele bloco devem ter sido enviados para
armazenamento estvel.

314

Antes de um bloco de dados na MP poder ser enviado para o banco de dados (em armazenamento novoltil), todos os registros de log pertencentes a dados naquele bloco devem ter sido enviados para
armazenamento estvel.
A ltima regra chamada de regra write-ahead logging (WAL). (Precedncia de escrita do log, a regra WAL exige
somente a informao undo no log tenha sido enviada para sada em armazenamento estvel, permitindo que a
informao redo seja escrita mais tarde. A diferena relevante em sistemas nos quais a informao redo e undo
armazenada em registros de log separados.)
Escrever o log bufferizado no disco s vezes chamado de forar o log (log force). As regras precedentes
criam situaes em que certos registros de log devem ser enviados para sada em armazenamento estvel. No
h problema decorrente do envio dos registros de log mais cedo que o necessrio. Logo, quando o sistema achar
necessrio enviar um registro de log para armazenamento estvel, ele enviar um bloco inteiro de registros de
log, se houver registros de log suficientes na MP para preencher um bloco. Se os registros de log forem
insuficientes na MP para preencher um bloco. Se os registros de logo forem insuficientes para preencher o bloco,
os registros de log na MP sero combinados a um bloco parcialmente completo e sero enviados para sada em
armazenamento estvel.

Bufferizao de Banco de Dados


J descrevemos a hierarquia de armazenamento em dois nveis. O banco de dados est armazenado em
armazenamento no-voltil (disco) e os blocos de dados so levados MP quando necessrio. J que a MP
normalmente muito menor que o banco de dados inteiro, pode ser necessrio sobrescrever um bloco B1 na MP
quando outro bloco B2 necessitar ser levado memria. Se B1 tiver sido modificado, ele dever ser enviado para o
banco de dados antes da entrada de B2. Essa hierarquia de armazenamento o conceito-padro de sistema
operacional de memria virtual.
As regras para a sada de registros de log limitam a liberdade do sistema para sada de blocos de dados. Se
a entrada do bloco B2 fizer com que o bloco B1 seja selecionado para a sada, todos os registros de log
pertencentes aos dados em B1 devem ser enviados para armazenamento estvel antes de B1 ser enviado para
sada. Ento, a sequncia de aes pelo sistema, seria como segue:
Enviar registros de log para armazenamento estvel at acabarem os registros de log pertencentes ao
bloco B1.
Enviar o bloco B1 para sada no disco.
Enviar o bloco B2 do disco para a entrada em MP.
importante que nenhuma gravao no bloco B1 esteja em progresso enquanto a sequncia precedente
de aes estiver em execuo. Essa condio satisfeita quando se usa um meio especial de bloqueio, como
segue. Antes que uma transao escreva um item de dado, ela deve adquirir um bloqueio exclusivo sobre o bloco
no qual o item de dados reside. O bloqueio poder ser liberado imediatamente aps a atualizao. Antes de um
bloco ser enviado para a sada, o sistema obtm um bloqueio exclusivo sobre o bloco, para garantir que nenhuma
transao o altere. Completada a sada do bloco, o bloqueio liberado. Os bloqueios que so mantidos por pouco
tempo so frequentemente chamados de trancas (latches). As trancas so tratadas de forma distintas dos
bloqueios usados pelo sistema de controle de concorrncia. Com isso, elas podem ser liberadas sem considerar
qualquer protocolo de bloqueio, como bloqueio em duas fases, exigido pelo sistema de controle de concorrncia.
Para ilustrar a necessidade da sequncia anterior de aes, consideremos nosso exemplo bancrio com as
transaes T0 e T1. Suponha que o estado do log seja:

e que a transao T0 emita uma read(B). Assuma que o bloco em que B reside no est na MP e que a MP esteja
completa. Suponha que o bloco em que reside A seja escolhido para ser enviado ao disco. Se o sistema envia esse
bloco para sada no disco e, ento, o sistema cai, os valores no banco de dados para as contas A, B e C so 950,
2000 e 700 dlares, respectivamente. Esse estado do banco de dados inconsistente. Entretanto, devido s
exigncias precedentes, o registro de log <T0, A, 1000, 950> dever ser enviado para armazenamento estvel
315

antes da sada do bloco em que A reside. O sistema pode usar o registro de log durante a recuperao para levar
o banco de dados de volta a um estado consistente.
Regra de Sistema Operacional em Gerenciamento de Buffer
Podemos gerenciar o buffer do banco de dados usando uma das duas abordagens:
1. O sistema de banco de dados reserva parte da MP para servir como um buffer gerenciado por ele, e no
pelo sistema operacional. O sistema de banco de dados gerencia a transferncia de bloco de dados, de
acordo com as exigncias que j discutimos.
Essa abordagem tem o inconveniente de limitar a flexibilidade de uso da MP. O buffer deve ser mantido
pequeno o suficiente para que outras aplicaes tenha MP suficiente para sua necessidades. Entretanto, mesmo
quando outras aplicaes no estiverem rodando, o banco de dados no poder fazer uso de todas a memria
disponvel. Da mesma forma, aplicaes que no sejam banco de dados podem no usar aquela parte da MP
reservada para o buffer de banco de dados, mesmo se algumas pginas no buffer do banco de dados no
estiverem em uso.
2. O sistema de banco de dados implementa seu buffer dentro da memria virtual do sistema operacional.
J que o sistema operacional possui informaes sobre as exigncias de memria de todos os processos
no sistema, idealmente ele deveria estar capacitado a decidir quais blocos de buffer devem ser forados
sada para o disco e quando isso deve ser feito. Mas, para atender precedncia de escrita do log que
discutimos, o sistema operacional no poderia escrever pginas de buffer no banco de dados por si s,
mas, ao contrrio, solicitar que o sistema de banco de dados forasse a sada dos blocos do buffer. O
sistema de banco de dados, por sua vez, s foraria a sada dos blocos do buffer para o banco de dados
aps escrever os registros de log relevantes em armazenamento estvel.
Infelizmente, quase todos os sistemas operacionais da gerao atual mantm controle completo sobre a
memria virtual. O sistema operacional reserva espao em disco para armazenar pginas de memria virtual que
no esto na MP; este espao chamado de espao de swap (troca). Se o sistema operacional decidir retirar da
memria um bloco Bx, ele ser enviado para o espao de swap no disco, e no h nenhuma forma do sistema de
banco de dados conseguir controle dessa sada de blocos do buffer.
No entanto, se o buffer de banco de dados estiver na memria virtual, as transferncias entre arquivos de
banco de dados e o buffer na memria virtual so gerenciadas pelo sistema de banco de dados, que cumprir as
exigncias de precedncia de escrita do log que discutimos.
Essa abordagem pode implicar sadas extras de dados para o disco. Se um bloco Bx retirado pelo sistema
operacional, esse bloco no ser enviado para o banco de dados. Ao contrrio, ele ser enviado para o banco de
dados. Quando o sistema de banco de dados tiver de enviar Bx para o disco, pode ser que o sistema operacional
tenha de, primeiro, retirar Bx de seu espao de swap. Ento, ao contrrio de uma nica sada de Bx da memria,
exigiremos duas sadas de Bx (uma pelo sistema operacional, e outra pelo sistema de banco de dados), alm de
uma entrada extra de Bx na memria.
Embora ambas as abordagens padeam de alguns inconvenientes, uma ou outra dever ser escolhida, a
menos que o sistema operacional seja projetado para aceitar as exigncias de log do banco de dados. Somente
uns poucos sistemas operacionais atuais, como o sistema operacional Mach, aceitam tais exigncias.
Falha com Perda de Armazenamento No-voltil
At agora, consideramos somente falhas que tm como consequncia a perda de informaes residentes
em armazenamento voltil; o contedo do armazenamento no-voltil permanece intacto. Embora as falhas com
perda de armazenamento no-voltil sejam raras, precisamos estar preparados para trata-las. Vamos discutir, por
enquanto, apenas armazenamento em disco. Nossas discusses se aplicam tambm a outros tipos de
armazenamento no-voltil.
O esquema bsico descarregar (dump) todo contedo do banco de dados para armazenamento estvel
periodicamente digamos, uma vez por dia. Por exemplo, podemos descarregar o banco de dados para uma ou
316

mais fitas magnticas. Se ocorrer uma falha que resulte na perda de blocos fsicos do banco de dados, a descarga
mais recente ser usada na restaurao do banco de dados para seu ltimo estado consistente possvel. Uma vez
completada essa restaurao, o sistema usa o log para trazer o sistema de banco de dados para um estado
consistente recente.
Mais precisamente, nenhuma transao pode estar ativa durante o procedimento de descarga, e um
procedimento similar para checkpoint (pontos de controle) deve ocorrer:
1. Enviar todos os registros de log residentes em MP para sada de armazenamento estvel.
2. Enviar todos os blocos de buffer para sada em disco.
3. Copiar o contedo do banco de dados em armazenamento estvel.
4. Enviar um registro de log <dump> para sada em armazenamento estvel.
Os passos 1, 2 e 4 correspondem aos trs passos usados para checkpoints anteriormente.
Para se recuperar da perda de armazenamento no-voltil, restauramos o banco de dados em disco
usando a descarga (dump) mais recente. O log , ento, consultado e todas as transaes que foram efetivadas
desde a ltima descarga so refeitas. Observe que nenhuma operao undo precisa ser executada.
Uma descarga do contedo do banco de dados tambm chamada de archival dump (descarga histrica),
j que podemos arquivar as descargas e us-las mais tarde para examinar informaes antigas do banco de
dados. Descargas de um banco de dados e checkpoints dos buffers so similares.
O procedimento de descarga simples aqui descrito oneroso pelas seguintes razes. Primeiro, todo o
banco de dados dever ser copiado em armazenamento estvel, resultando em considervel transferncia de
dados. Segundo, j que o processamento das transaes suspenso durante a descarga, ciclos de CPU so
perdidos. Tm sido desenvolvidos esquemas de fuzzy dump (descarga indistinta) que permitem a existncia de
transaes ativas enquanto a descarga est em progresso. So similares a esquemas de checkpoints.
Tcnicas de Recuperao Avanadas
As tcnicas de recuperao j descritas requerem que, enquanto uma transao atualizao um item de
dado, nenhuma outra transao consiga atualizar o mesmo item de dado, at que a primeira seja efetivada ou
revertida. Satisfazemos essa condio por meio do bloqueio em duas fases severo. Embora o bloqueio em duas
fases severo seja aceitvel para os registros de relaes ele causa um significativo decrscimo de concorrncia
quando aplicado a certas estruturas especiais, como pginas de ndice de rvore-B+.
Para aumentar a concorrncia, podemos usar o algoritmo de controle e de concorrncia rvore-B+
permitindo que os bloqueios sejam liberados mais cedo, sem usar duas fases. Como isso, entretanto, as tcnicas
de recuperao estudadas tornam-se inaplicveis. Vrias tcnicas de recuperao alternativas tm sido propostas
tornam-se inaplicveis. Vrias tcnicas de recuperao alternativas tm sido propostas, aplicveis mesmo com
liberao prematura de bloqueio. Descrevemos uma dessas tcnicas de recuperao agora.
Log com Undo Lgico
Para aes nas quais os bloqueios so liberados mais cedo, no podemos processar as aes undo
simplesmente regravando o valor antigo dos itens de dados. Considere uma transao T que insira uma entrada
em uma rvore-B+ e, seguindo o protocolo de controle de concorrncia rvore-B+, libere alguns dos bloqueios
aps o trmino da operao de insero, mas antes da transao ser efetivada. Aps a liberao dos bloqueios,
outras transaes podem realizar inseres ou remoes adicionais, causando desse modo mudanas adicionais
nas pginas da rvore B+.
Mesmo que a operao libere alguns dos bloqueios previamente, ela dever reter bloqueios suficientes
para garantir que no seja permitido a nenhuma outra transao executar qualquer operao conflitante (como
ler ou remover o valor inserido). Por essa razo, o protocolo de controle de concorrncia rvore-B+ mantm os
bloqueios no nvel de folha da rvore-B+ at o fim da transao.
Agora vamos considerar como processar os rollbacks de transaes. Se os valores antigos dos ns
internos da rvore-B+ (antes da operao de insero ser executada) forem restaurados durante a reverso da
317

transao, algumas das atualizaes processadas pelas ltimas operaes de insero ou excluso executadas por
outras transaes poderiam ser perdidas. Em vez disso, a operao de insero tem de ser inutilizada logicamente
isto , pela execuo de uma operao de remoo.
Portanto, quando a ao de insero for completada, antes de liberar qualquer bloqueio, ela dever
gravar um registro de log <Oi, operation-end, U>, em que U indica a informao de inutilizao e Oi indica um
identificador para a operao. Por exemplo, se a operao inseriu uma entrada em uma rvore-B+, a informao
undo U indicaria o que remover da rvore-B+. Esse log de informao sobre operaes chamado de log fsico e
os correspondentes registros de log so chamados de registros de log fsicos.
As operaes de insero e remoo so exemplos de uma classe de operaes que exige operaes undo
lgicas, j que liberam os bloqueios previamente; chamamos tais operaes de operaes lgicas. Antes que uma
operao lgica tenha incio, ela escreve um registro de log <Oi, operation-begin>, em que Oi o identificador
para a operao. Enquanto a operao est sendo executada, o log feito da maneira convencional para todas as
atualizaes processadas pela operao. Ento, as informaes usuais dos valores antigos e novos so escritos
para cada atualizao. Quando a operao termina, um registro de log de final de operao (operation-end)
escrito como explicado anteriormente.
Reverso de Transao
Vamos considerar primeiro a reverso de transaes durante operao normal (isto , no durante a
recuperao do sistema aps uma falha). O log examinado de trs para a frente (ordem cronolgica
decrescente) e os registros de log pertencente transao so usado para restaurar os valores antigos dos itens
de dados. Ao contrrio de antes, escrevemos registros especiais de log somente redo da forma <Ti, Xj, V> com o
valor V sendo sobreposto ao item de dado Xj durante a reverso. Esses registros de log algumas vezes so
chamados de registros de log de compensao. Sempre que um registro de log <Oi, operation-end, U>
encontrado, aes especiais so tomadas:
1. Revertemos a operao usando a informao undo U do registro de log. As atualizaes processadas
durante a reverso da operao so registradas no log exatamente da mesma forma que as atualizaes
processadas quando a operao foi executada primeiro. Alm do mais, registros de log referentes ao
incio e ao final da operao so gerados exatamente como durante a execuo normal da operao.
2. Quando a verificao retroativa do log continua, saltamos todos os registros de log da transao at
encontrados o registro de log <Oi, operation-begin>. Aps o registro de log de incio da operao ser
encontrado, os registros de log da transao so processados novamente de maneira usual.
Quando a transao Ti for revertida, um registro <Ti abort> ser adicionado ao log.
Se ocorrerem falhas enquanto uma operao lgica est em progresso, o registro de logo de fim de
operao para aquela operao no ser encontrado quando a transao for revertida. Entretanto, para cada
atualizao processada pela operao, a informao undo na forma do valor antigo nos registros de log fsicos
est disponvel no log. Observe que saltar os registros de log fsicos, quando o registro de log de fim de operao
encontrado durante a reverso, garante que os valores antigos do registro de log fsico no sejam usados na
reverso, uma vez que a operao terminou.
Se o bloqueio usado para controle de concorrncia, os bloqueios mantidos por uma transao T podem
ser liberados somente aps a transao tiver sido revertida, conforme descrito.
Checkpoints
Os checkpoints so processados conforme j descrito. Atualizaes no banco de dados so
temporariamente suspensas e as seguintes aes so executadas:
1. Enviar para sada em armazenamento estvel todos os registros de log residentes na memria principal.
2. Enviar para sada em armazenamento estvel um registro de log <checkpoint L>, em que L uma lista de
todas as transaes ativas.
3. Enviar para sada em disco todos os blocos de buffer modificados.
318

Recuperao de Reincio
As aes de recuperao, quando o sistema de banco de dados reiniciado aps uma falha, so
executadas em duas fases:
1. Na fase redo, reexecutamos as atualizaes de todas as transaes pela varredura do log avanando a
partir do ltimo checkpoint. Os registros de log que sero reexecutados englobam os registros de log das
transaes que foram revertidas antes do sistema cair e aquelas que no foram efetivas quando ocorreu
a queda do sistema. Os registros de log reexecutados incluem os registros de log usuais da forma <Ti, Xj,
V1, V2> e os registros de log especiais da forma <Ti, Xj, V2>; o valor V2 escrito para o item de dados Xj em
qualquer caso. Essa fase tambm determina todas as transaes que esto na lista de transaes no
registro de checkpoint ou que foram iniciadas mais tarde, mas no tm nenhum registro <Ti abort> ou <Ti
commit> no log. Todas essas transaes tm de ser revertidas e seus identificadores de transao so
colocados em uma lista undo.
2. Na fase undo, refazemos todas as transaes da lista undo. Processamos a reverso reexaminando o log
do final para o comeo. Sempre que um registro de log pertencente a uma transao da lista undo
encontrado, as aes undo so processadas exatamente como se o registro de log fosse encontrado
durante a reverso de uma transao que falhou. Ento, os registros de log de uma transao anteriores a
um registro final de operao, mas aps o correspondente registro de incio de operao, so ignorados.
Quando um registro de log <Ti start> encontrado para uma transao Ti na lista undo, um registro de log
<Ti abort> escrito no log. O exame do log para quando registros de log <Ti start> so encontrados para todas as
transaes na lista undo.
A fase redo da recuperao de reincio reexecuta todos os registros de log fsico, a partir do mais recente
registro de checkpoint. Em outras palavras, essa fase de recuperao de reincio repete todas as aes de
atualizao que foram executadas aps o checkpoint e cujos registros de log alcanaram log estvel. Essas aes
incluem as transaes incompletas e as aes executadas para reverter transaes com falha. As aes so
repetidas na mesma ordem em que foram executas; consequentemente, esse processo chamado de histria
repetitiva (repeating history). A histria repetitiva simplifica enormemente os esquemas de recuperao.
Fuzzy Checkpoint
A tcnica checkpoint descrita exige que todas as atualizaes ao banco de dados sejam temporariamente
suspensas enquanto o checkpoint est em progresso. possvel modificar a tcnica para permite que as
atualizaes iniciem no momento em que o registro checkpoint escrito, mas antes dos blocos de buffer
modificados serem escritos no disco. Ento, o checkpoint gerado um fuzzy checkpoint (ponto de controle
indistinto).
A ideia a seguinte. Em vez de reexaminar o log de trs para frente a fim de encontrar um registro de
checkpoint, armazenamos a localizao em log do ltimo registro de checkpoint em uma posio fixa no disco.
Entretanto, essa informao no atualizada quando o registro checkpoint escrito. Ao contrrio, antes do
registro checkpoint ser escrito, uma lista com todos os blocos de buffer modificados criada. A informao ltimo
checkpoint atualizada somente aps todos os blocos de buffer, da lista de blocos de buffer modificados, terem
sido escritos no disco. O protocolo de precedncia de escrita do log deve ser seguido quando os blocos de buffer
so enviados para sada.
Observe que, em nosso esquema, o registro de log lgico usado somente para propsitos de undo, ao
passo que o registro de log fsico usado para propsitos redo (refazer) e undo (inutilizar). H esquemas de
recuperao que usam registro de log lgico para propsitos redo. Entretanto, tais esquemas no podem ser
usados com fuzzy checkpoint e, portanto, no so muito empregados.

319

Você também pode gostar