You are on page 1of 186

Modelagem

de Banco
de Dados
Paulo Henrique Cayres

A RNP Rede Nacional de Ensino


e Pesquisa qualificada como
uma Organizao Social (OS),
sendo ligada ao Ministrio da
Cincia, Tecnologia e Inovao
(MCTI)

responsvel

pelo

Programa Interministerial RNP,


que conta com a participao dos
ministrios da Educao (MEC), da
Sade (MS) e da Cultura (MinC).
Pioneira no acesso Internet no
Brasil, a RNP planeja e mantm a
rede Ip, a rede ptica nacional
acadmica de alto desempenho.
Com Pontos de Presena nas
27 unidades da federao, a rede
tem mais de 800 instituies
conectadas. So aproximadamente
3,5 milhes de usurios usufruindo
de uma infraestrutura de redes
avanadas para comunicao,
computao e experimentao,
que contribui para a integrao
entre o sistema de Cincia e
Tecnologia, Educao Superior,
Sade e Cultura.

Ministrio da
Cultura
Ministrio da
Sade
Ministrio da
Educao
Ministrio da
Cincia, Tecnologia
e Inovao

Modelagem

de Banco
de Dados

Paulo Henrique Cayres

Modelagem

de Banco
de Dados

Paulo Henrique Cayres

Rio de Janeiro
Escola Superior de Redes
2015

Copyright 2015 Rede Nacional de Ensino e Pesquisa RNP


Rua Lauro Mller, 116 sala 1103
22290-906 Rio de Janeiro, RJ

Diretor Geral
Nelson Simes
Diretor de Servios e Solues
Jos Luiz Ribeiro Filho

Escola Superior de Redes


Coordenao
Luiz Coelho
Edio
Lincoln da Mata
Coordenador Acadmico da rea de Desenvolvimento de Sistemas
John Lemos Forman
Equipe ESR (em ordem alfabtica)
Adriana Pierro, Celia Maciel, Cristiane Oliveira, Derlina Miranda, Edson Kowask,
Elimria Barbosa, Evellyn Feitosa, Felipe Nascimento, Lourdes Soncin, Luciana Batista,
Luiz Carlos Lobato, Renato Duarte e Yve Abel Marcial.
Capa, projeto visual e diagramao
Tecnodesign
Verso
1.0.0
Este material didtico foi elaborado com fins educacionais. Solicitamos que qualquer erro encontrado ou dvida com relao ao material ou seu uso seja enviado para a equipe de elaborao de
contedo da Escola Superior de Redes, no e-mail info@esr.rnp.br. A Rede Nacional de Ensino e
Pesquisa e os autores no assumem qualquer responsabilidade por eventuais danos ou perdas, a
pessoas ou bens, originados do uso deste material.
As marcas registradas mencionadas neste material pertencem aos respectivos titulares.
Distribuio

Escola Superior de Redes

Rua Lauro Mller, 116 sala 1103


22290-906 Rio de Janeiro, RJ
http://esr.rnp.br
info@esr.rnp.br

Dados Internacionais de Catalogao na Publicao (CIP)


C385m
Cayres, Paulo Henrique

Modelagem de banco de dados / Paulo Henrique Cayres. Rio de Janeiro: RNP/ESR, 2015.

182 p. : il. ; 28 cm.

ISBN 978-85-63630-50-6


1. Modelagem de dados. 2. Banco de dados. 3. Sistema de gerenciamento de banco de

dados (SGBD). 4. PostgreSQL. I. Titulo.

CDD 005.743

Sumrio
Escola Superior de Redes
A metodologia da ESRix
Sobre o curso x
A quem se destinax
Convenes utilizadas neste livroxi
Permisses de usoxi
Sobre o autorxii

1. Modelagem e uso de Bancos de Dados Viso geral


Exerccio de nivelamento Modelagem de dados1
Introduo a Banco de Dados1
Sistema Gerenciador de banco de dados3
Arquitetura de um SGBD3
Organizao de SGBDs4
Modelo hierrquico4
Modelo em rede5
Modelo relacional5
Modelo Orientado a Objetos6
Modelo Objeto-Relacional6
Modelo NoSQL6
Sistema de Informao7
Desenvolvimento de SI8
Desenvolvimento de software x SGBD8

iii

Modelos de Sistema9
Funcional9
De dados10
Comportamental 10
Projeto de banco de dados10
Etapas da modelagem do banco de dados11
Primeira Etapa Anlise de Requisitos12
Exemplo de Minimundo: EMPRESA13
Segunda Etapa Anlise e projeto 13
Atividade de Fixao 13

2. Modelo conceitual: DER


Diagrama Entidade Relacionamento: DER15
Componentes do DER16
Relacionamentos19
Ferramentas CASE24
Notaes25
A ferramenta brModelo26
Refinamento do modelo conceitual27
Generalizao/especializao27
Tipos de generalizao/especializao 29
Entidade associativa31
Dados Temporais32
Normalizao33
Exerccios de Fixao Refinamento do Modelo Conceitual - DER40

3. O Modelo Lgico
Decises sobre o modelo41
Somente entidade tem atributos?41
Atributo multivalorado?42
Quando transformar um atributo em entidade?42
Relacionamentos 43
Coleo de Relaes44
Restries de Integridade45
Modelo Conceitual (DER) x Modelo Lgico46
Entidades e atributos47

iv

Relacionamentos binrios47
Relacionamento n-rio, onde n > 249
Relacionamento unrio (ou recursivo)49
Generalizao ou especializao50
Atributo multivalorado51
Quadro resumo51
Exerccios de Fixao Comandos DDL para criao do Banco de Dados53

4. Modelo Fsico
O modelo fsico55
Structured Query Language (SQL)57
PostgreSQL58
Caractersticas do PostgreSQL59
Criao do banco de dados59
Alterao do banco de dados64
Excluso do banco de dados65
Esquema de banco de dados65
Criando tabelas no banco de dados67
Alterao de tabelas no banco de dados72
Excluso de tabelas no banco de dados73
Domnios74
Sequncia74
Script SQL/DDL do banco de dados77
Exerccios de Fixao Comandos DDL para criao do banco de dados78

5. Comandos DML CRUD


e operaes sobre conjuntos
Operaes CRUD79
INSERT80
Uso do campo serial81
Validao de chave primria81
Validao da chave estrangeira82
Validao da restrio NOT NULL82
Validao da restrio de domnio (tipo de dado)83
UPDATE84

DELETE84
TRUNCATE85
SELECT85
Operadores86
Operadores negativos87
Comandos especiais87
ORDER BY88
LIMIT89
Juno de tabelas89
Juno Interna90
Juno Cruzada91
Juno natural92
Autojunes92
Junes equivalentes x no equivalentes93
Juno externa95
Operaes sobre conjuntos95

6. Funes agregadas e nativas


Exerccio de nivelamento 99
Funes agregadas99
Agrupamento101
Funes Nativas104
Informaes do sistema e de sesso104
Manipulao de data/hora104
Manipulao de String107
Manipulao de nmeros108
Outras funes110
Atividade de Fixao 111

7. Subconsultas, ndices e vises


Exerccio de nivelamento 113
Subconsultas113
Subconsulta Escalar114
Subconsulta NICA LINHA116
Clusulas IN116
Clusulas NOT IN116

vi

Clusulas ANY/SOME117
Clusula ALL118
Consultas aninhadas correlacionadas118
Subconsulta TABELA119
Inserir dados recuperados de uma tabela em outra (uso do SELECT)120
ndices121
Criando, renomeando e removendo ndices124
Vises125
Criao de viso126
Executando uma viso127
Alterando e removendo uma viso128

8. Introduo programao SQL (pl/pgsql)


Exerccio de nivelamento 129
PL/pgSQL129
Funes130
Criao funes130
Declarao, inicializao e atribuio132
Declarao de parmetros134
Varivel composta heterognea (ou tipo-linha)137
Varivel tipo RECORD (Registro)138
Clusula RETURNING139
Estruturas de controle139
Condicional IF140
Condicional CASE141
Repetio143

9. Stored Procedures
Exerccio de nivelamento 147
Tratamento de erros147
Clusula UNIQUE_VIOLATION149
Clusula FOUND150
Comando RAISE (levantar)150
Cursor151
Trigger155
Exerccio de Fixao 158
vii

10. Transaes
Exerccio de nivelamento 159
Concorrncia159
Bloqueios161
Granularidade dos Bloqueios161
MVCC162
Bloqueios e impasses162
Transaes163
Bloqueios no PostgreSQL165
Log e Savepoints167
Exerccio de Fixao Transaes168

viii

Escola Superior de Redes


A Escola Superior de Redes (ESR) a unidade da Rede Nacional de Ensino e Pesquisa (RNP)
responsvel pela disseminao do conhecimento em Tecnologias da Informao e Comunicao (TIC). A ESR nasce com a proposta de ser a formadora e disseminadora de competncias
em TIC para o corpo tcnico-administrativo das universidades federais, escolas tcnicas e
unidades federais de pesquisa. Sua misso fundamental realizar a capacitao tcnica do
corpo funcional das organizaes usurias da RNP, para o exerccio de competncias aplicveis ao uso eficaz e eficiente das TIC.
A ESR oferece dezenas de cursos distribudos nas reas temticas: Administrao e Projeto
de Redes, Administrao de Sistemas, Segurana, Mdias de Suporte Colaborao Digital e
Governana de TI.
A ESR tambm participa de diversos projetos de interesse pblico, como a elaborao e
execuo de planos de capacitao para formao de multiplicadores para projetos educacionais como: formao no uso da conferncia web para a Universidade Aberta do Brasil
(UAB), formao do suporte tcnico de laboratrios do Proinfo e criao de um conjunto de
cartilhas sobre redes sem fio para o programa Um Computador por Aluno (UCA).

A metodologia da ESR
A filosofia pedaggica e a metodologia que orientam os cursos da ESR so baseadas na
aprendizagem como construo do conhecimento por meio da resoluo de problemas tpicos da realidade do profissional em formao. Os resultados obtidos nos cursos de natureza
terico-prtica so otimizados, pois o instrutor, auxiliado pelo material didtico, atua no
apenas como expositor de conceitos e informaes, mas principalmente como orientador do
aluno na execuo de atividades contextualizadas nas situaes do cotidiano profissional.
A aprendizagem entendida como a resposta do aluno ao desafio de situaes-problema
semelhantes s encontradas na prtica profissional, que so superadas por meio de anlise,
sntese, julgamento, pensamento crtico e construo de hipteses para a resoluo do problema, em abordagem orientada ao desenvolvimento de competncias.
Dessa forma, o instrutor tem participao ativa e dialgica como orientador do aluno para as
atividades em laboratrio. At mesmo a apresentao da teoria no incio da sesso de aprendizagem no considerada uma simples exposio de conceitos e informaes. O instrutor
busca incentivar a participao dos alunos continuamente.

ix

As sesses de aprendizagem onde se do a apresentao dos contedos e a realizao das


atividades prticas tm formato presencial e essencialmente prtico, utilizando tcnicas de
estudo dirigido individual, trabalho em equipe e prticas orientadas para o contexto de atuao do futuro especialista que se pretende formar.
As sesses de aprendizagem desenvolvem-se em trs etapas, com predominncia de tempo
para as atividades prticas, conforme descrio a seguir:
Primeira etapa: apresentao da teoria e esclarecimento de dvidas (de 60 a 90 minutos).
O instrutor apresenta, de maneira sinttica, os conceitos tericos correspondentes ao tema
da sesso de aprendizagem, com auxlio de slides em formato PowerPoint. O instrutor levanta
questes sobre o contedo dos slides em vez de apenas apresent-los, convidando a turma
reflexo e participao. Isso evita que as apresentaes sejam montonas e que o aluno se
coloque em posio de passividade, o que reduziria a aprendizagem.
Segunda etapa: atividades prticas de aprendizagem (de 120 a 150 minutos).
Esta etapa a essncia dos cursos da ESR. A maioria das atividades dos cursos assncrona e
realizada em duplas de alunos, que acompanham o ritmo do roteiro de atividades proposto no
livro de apoio. Instrutor e monitor circulam entre as duplas para solucionar dvidas e oferecer
explicaes complementares.
Terceira etapa: discusso das atividades realizadas (30 minutos).
O instrutor comenta cada atividade, apresentando uma das solues possveis para resolv-la,
devendo ater-se quelas que geram maior dificuldade e polmica. Os alunos so convidados a
comentar as solues encontradas e o instrutor retoma tpicos que tenham gerado dvidas,
estimulando a participao dos alunos. O instrutor sempre estimula os alunos a encontrarem
solues alternativas s sugeridas por ele e pelos colegas e, caso existam, a coment-las.

Sobre o curso
Apresenta de forma clara e objetiva o processo de modelagem, criao e manuteno de
banco de dados relacionais. Apresenta uma viso geral sobre bancos de dados, bem como
conceitos e metodologias para modelagem conceitual, lgica e fsica de banco de dados relacionais. Aborda as principais caractersticas e funcionalidades de um sistema gerenciador de
bancos de dados usando como base o PostgreSQL.
Estas prticas e regras, para a correta implementao de projetos de banco de dados relacionais, so ferramentas utilizadas no curso e que se aplicam a qualquer sistema baseado na
linguagem SQL.
Cada sesso apresenta um conjunto de exemplos e atividades prticas que permitem a prtica das habilidades apresentadas.

A quem se destina
Pessoas interessadas em trabalhar com bancos de dados, se familiarizando com tcnicas de
modelagem, projeto e manipulao de banco de dados relacionais. uma porta de entrada
para quem quer se aprofundar no assunto e considera trabalhar como analista de dados,
administrador de bancos de dados ou tambm para programadores interessados em conhecer o processo de modelagem de dados e a linguagem SQL.

Convenes utilizadas neste livro


As seguintes convenes tipogrficas so usadas neste livro:
Itlico
Indica nomes de arquivos e referncias bibliogrficas relacionadas ao longo do texto.

Largura constante
Indica comandos e suas opes, variveis e atributos, contedo de arquivos e resultado da sada
de comandos. Comandos que sero digitados pelo usurio so grifados em negrito e possuem
o prefixo do ambiente em uso (no Linux normalmente # ou $, enquanto no Windows C:\).

Contedo de slide q
Indica o contedo dos slides referentes ao curso apresentados em sala de aula.

Smbolo w
Indica referncia complementar disponvel em site ou pgina na internet.

Smbolo d
Indica um documento como referncia complementar.

Smbolo v
Indica um vdeo como referncia complementar.

Smbolo s
Indica um arquivo de adio como referncia complementar.

Smbolo !
Indica um aviso ou precauo a ser considerada.

Smbolo p
Indica questionamentos que estimulam a reflexo ou apresenta contedo de apoio ao
entendimento do tema em questo.

Smbolo l
Indica notas e informaes complementares como dicas, sugestes de leitura adicional ou
mesmo uma observao.

Smbolo
Indica atividade a ser executada no Ambiente Virtual de Aprendizagem AVA.

Permisses de uso
Todos os direitos reservados RNP.
Agradecemos sempre citar esta fonte quando incluir parte deste livro em outra obra.
Exemplo de citao: TORRES, Pedro et al. Administrao de Sistemas Linux: Redes e Segurana.
Rio de Janeiro: Escola Superior de Redes, RNP, 2013.

xi

Comentrios e perguntas
Para enviar comentrios e perguntas sobre esta publicao:
Escola Superior de Redes RNP
Endereo: Av. Lauro Mller 116 sala 1103 Botafogo
Rio de Janeiro RJ 22290-906
E-mail: info@esr.rnp.br

Sobre o autor
Paulo Henrique Cayres possui graduao no curso Superior de Tecnologia em Processamento de Dados pela Universidade para o Desenvolvimento do Estado e da Regio do
Pantanal (UNIDERP), especializao em Anlise de Sistemas pela Universidade Federal de
Mato Grosso do Sul (UFMS) e mestrado em Cincias da Computao pela Universidade
Federal do Rio Grande do Sul (UFRGS). Atuou como coordenador curso de Bel. em Sistemas de Informao e Superior de Tecnologia em Redes de Computadores na Faculdade da
Indstria do Sistema FIEP, onde tambm coordenou as atividades do SGI - Setor de Gesto
de Informaes. Atualmente coordenador do Ncleo de Educao a Distncia - NEaD da
Faculdade da Indstria do Sistema FIEP. Scio-diretor da CPP Consultoria e Assessoria em
informtica Ltda. Tem experincia na rea de Cincia da Computao, com nfase em Engenharia de Software, atuando principalmente nos seguintes temas: linguagens de programao, engenharia de software, modelagem de sistemas, desenvolvimento de aplicaes para
web e gerncia de projetos. Professor titular em cursos de graduao e ps-graduao
ministrando disciplinas de desenvolvimento de sistemas desde 1995. Instrutor de treinamento na linguagem Java de programao junto ao CITS em Curitiba e na ESR-RNP.
John Lemos Forman Mestre em Informtica (nfase em Engenharia de Software) e
Engenheiro de Computao pela PUC-Rio, com ps-graduao em Gesto de Empresas
pela COPPEAD/UFRJ. vice-presidente do Sindicato das Empresas de Informtica do Rio de
Janeiro TIRIO, membro do Conselho Consultivo e de normas ticas da Assespro-RJ e Diretor da Riosoft. scio e Diretor da J.Forman Consultoria e coordenador acadmico da rea
de desenvolvimento de sistemas da Escola Superior de Redes da RNP. Acumula mais de
29 anos de experincia na gesto de empresas e projetos inovadores de base tecnolgica,
com destaque para o uso das TIC na Educao, mdias digitais e Sade.

xii

1
Aprender sobre bancos de dados e sistemas gerenciadores de bancos de dados;
Entender o conceito de sistema de informao e modelos de sistemas, e etapas
da modelagem do banco de dados.

conceitos

Banco de dados; SGBD; SI; Minimundo; Modelos conteitual, lgico e fsico.

Exerccio de nivelamento e
Modelagem de dados
O que voc entende por modelagem de dados?

Introduo a Banco de Dados


Banco de dados: coleo de dados relacionados que podem ser inseridos, atualizados,

e recuperados e que possuem um significado implcito.


11 Dado x informao.
11 Exemplos: agenda de celular, catlogo de livros, planilha oramentria etc.
11 Desafios: volume de dados, evitar redundncia e inconsistncia, acesso, segurana,
integridade e migrao.
Juntamente com a chegada dos computadores, comearam a ser criados sistemas para
atender as necessidades de processamento crescente do volume de dados das empresas.
Nessa poca, a manipulao de informaes era implementada atravs de mdulos isolados
que atendiam uma determinada necessidade e que, com o passar do tempo, foram sendo
incrementados com novos mdulos sobre os j existentes. O problema que, muitas vezes,
os novos mdulos eram escritos por outros programadores, que por sua vez no utilizavam
as mesmas linguagens. Mais do que isso, os sistemas eram ainda muito primitivos, trabalhando com os sistemas de arquivos disponveis na poca, os quais no controlavam o
acesso concorrente por vrios usurios ou processos. Com todas essas divergncias aconte-

Captulo 1 - Modelagem e uso de Bancos de Dados Viso geral

objetivos

Modelagem e uso de Bancos


de Dados Viso geral

ciam diversos problemas, desde a redundncia at o isolamento de dados.


1

Dados podem ser vistos como uma representao de fatos, conceitos ou instrues de
uma maneira normalizada, podendo ser adaptados comunicao, interpretao e processamento. J a informao pode ser vista como todo o conjunto de dados devidamente
ordenados e organizados de forma significativa. Os bancos de dados, por sua vez, foram
concebidos com o objetivo de possibilitar o armazenamento de informaes em sistemas
de arquivos permanentes, com o intuito de possibilitar posteriores acesso e manipulao de
informaes, de forma organizada e estruturada.
Os principais desafios a serem alcanados atravs de um Sistema de banco de dados eram:
11 Gerenciamento de grande quantidade de informao: um Sistema de banco de
dados teria de possibilitar o armazenamento de informaes tanto de sistemas simples,
como uma agenda telefnica, quanto de sistemas mais complexos, como um sistema de
reserva de passagens areas. Em ambos os casos o Sistema de banco de dados teria de
ser capaz de prover segurana e confiabilidade, independente da quantidade de informaes que iria armazenar;
11 Evitar redundncia e inconsistncia de dados: um Sistema de banco de dados teria de
ter a capacidade de reduzir ao mximo, ou mesmo eliminar, a redundncia da informao
em lugares diferentes, muito comum nos Sistemas de Arquivos existentes at ento. Um
dos problemas da redundncia que podemos atualizar um determinado dado de um
arquivo e essa atualizao no ser feita em todo o sistema esse problema chamado
de inconsistncia;
11 Facilidade de acesso: um Sistema de banco de dados deveria facilitar ao mximo o
acesso aos dados, se preocupando com um possvel acesso concorrente, onde podemos
ter a mesma informao sendo compartilhada por diversos usurios;
11 Segurana de Dados: o Sistema de banco de dados deveria garantir a segurana de
acesso aos dados por meio da implementao de usurios e senhas de acessos;
11 Garantia de Integridade: fazer com que os valores dos dados atribudos e armazenados em um banco de dados devam satisfazer certas restries para manuteno de
consistncia e coerncia;
11 Facilidade de Migrao: um Sistema de banco de dados deveria garantir a possvel
transferncia de dados entre Banco de dados. Ao ato de transferir as informaes de um
banco de dados para outro banco de dados deu-se o nome de Migrao.
Histrico.

11 Incio da computao:
22 Dados guardados em arquivos de texto.
22 Problemas nesse modelo:

Modelagem de Bancos de Dados

33 Redundncia e inconsistncia no controlada de dados.

33 Aplicaes devem se preocupar com a forma de armazenamento dos dados.


22 Incio dos anos 60: primeiros SGBDs.
O primeiro Sistema Gerenciador de banco de dados (SGBD) comercial surgiu no final de
1960, levando em considerao todos os desafios propostos para um sistema de banco de
dados. Os SGBDs representaram uma evoluo considervel em relao aos sistemas de
arquivos de armazenamento em disco, criando novas estruturas de dados com o objetivo de
armazenar informaes.

Sistema Gerenciador de banco de dados


Caractersticas de um SGBD:

11 Gerenciamento de grande quantidade de dados.


11 Evitar redundncia e inconsistncia de dados.
11 Concorrncia de acesso.
11 Facilidade de acesso.
11 Segurana de dados.
11 Garantia de integridade.
11 Facilidade de migrao.
11 Suporte a Transaes.
11 Exemplos: PostgreSQL, MySQL, OracleDB, MS SQLServer etc.
Um Sistema de Gerenciamento de banco de dados (SGBD) um software que incorpora e
facilita as funes de definio, recuperao e alterao de dados em um Banco de Dados.
Tem a funo de proteo (contra falhas de hardware e software) e de segurana (acessos
no autorizados ou maliciosos) dos dados nele armazenados, ao mesmo tempo em que
permite o compartilhamento desses dados entre vrios usurios e aplicaes.

Arquitetura de um SGBD
De forma simplificada, um SGBD faz a interface entre a camada fsica de armazenamento dos
dados (discos, storage, mtodos de acesso, clustering de dados etc.) e a sua organizao lgica
(instncias) atravs de um determinado modelo de organizao (esquema ou subesquema).
Linguagens de programao e ferramentas front-end visuais grficas so algumas solues de
software que auxiliam usurios na construo, manuteno e manipulados dos dados armazenados em bancos de dados nos SGBDs. Internamente, um SGBD apresenta linguagens especficas para trabalhar com seus de dados, cuidando da sua definio (Data Definition Language

Captulo 1 - Modelagem e uso de Bancos de Dados Viso geral

DDL), manipulao (Data Manipulation Language DML) e consultas (Query Language).

Linguagem de

Ferramenta frontend

Programao

(manipulao grca
dos dados)

Usurios/Programadores

Programas de aplicaes/consultas (Queries)

Sistema de banco
de dados

Sistema de banco

Software SGBD

de dados

Programa para processamento


de consultas/programas

Software para acesso aos


dados armazenados

Denio
dos dados

arm

d os

Banco de

azena
(me
tadados)

dados
arm
azenados

Esquema do BD

Instncias

Organizao de SGBDs
Os principais modelos de organizao de SGBDs atualmente existentes so:

Figura 1.1
Arquitetura
de um SGBD
e ferramentas
complementares.

11 Modelo Hierrquico.
11 Modelo de Rede.
11 Modelo Relacional.
11 Modelo Orientado a Objetos.
11 Modelo Objeto-Relacional.
11 Modelo NoSQL (Not only SQL).

Modelagem de Bancos de Dados

A modelagem de dados representa a descrio formal da estrutura de um SGBD. A evoluo


tecnolgica, tanto de hardware como de software, permitiu que diferentes alternativas para
a organizao da estrutura de SGBDs fossem testadas e aprimoradas.

Modelo hierrquico
O modelo hierrquico foi o primeiro a ser reconhecido como um modelo de dados. Seu
desenvolvimento somente foi possvel devido consolidao dos discos de armazenamento
endereveis, pois esses discos possibilitaram a explorao de sua estrutura de endereamento fsico para viabilizar a representao hierrquica das informaes. Nesse modelo
de dados, os dados so estruturados em hierarquias ou rvores. Os ns das hierarquias

Saiba mais
O sistema comercial
mais divulgado no
modelo hierrquico
foi o Information
Management System
da IBM Corp (IMS).

contm ocorrncias de registros, onde cada registro uma coleo de campos (atributos),
cada um contendo apenas uma informao. O registro da hierarquia que precede a outros
o registro-pai, os outros so chamados de registros-filhos.
Grande parte das restries e consistncias de dados estava contida dentro dos programas
escritos para as aplicaes. Era necessrio escrever programas na ordem para acessar o
banco de dados.

Modelo em rede
O modelo em redes surgiu como uma extenso ao modelo hierrquico, eliminando o conceito
de hierarquia e permitindo que um mesmo registro estivesse envolvido em vrias associaes.
No modelo em rede, os registros so organizados em grafos, onde aparece um nico tipo de
associao (set) que define uma relao 1:N entre 2 tipos de registros: proprietrio e membro.
O gerenciador Data Base Task Group (DBTG), da Committee on Data Systems and Languages
(CODASYL) estabeleceu uma norma para esse modelo de banco de dados, com linguagem
prpria para definio e manipulao de dados.
Os dados tinham uma forma limitada de independncia fsica. A nica garantia era a de
que o sistema deveria recuperar os dados para as aplicaes como se eles estivessem

No Modelo em Rede,
o sistema comercial
mais divulgado o
CA-IDMS da Computer
Associates.

tambm definiram sintaxes para dois aspectos chaves dos sistemas gerenciadores de dados:
concorrncia e segurana. O mecanismo de segurana fornecia uma facilidade na qual parte
do banco de dados (ou rea) pudesse ser bloqueada para prevenir acessos simultneos,
quando necessrio. A sintaxe da segurana permitia que uma senha fosse associada a cada
objeto descrito no esquema.
Ao contrrio do Modelo Hierrquico, em que qualquer acesso aos dados passa pela raiz, o
modelo em rede possibilita acesso a qualquer n da rede sem passar pela raiz.

Modelo relacional
O modelo relacional apareceu devido s seguintes necessidades:
11 Aumentar a independncia de dados nos sistemas gerenciadores de banco de dados;
11 Prover um conjunto de funes apoiadas em lgebra relacional para armazenamento e
recuperao de dados;
11 Permitir processamento dedicado e exclusivo.
O modelo relacional, tendo por base a teoria dos conjuntos e lgebra relacional, foi resultado de um estudo terico realizado por um pesquisador da IBM chamado Ted Codd, que
escreveu um artigo na dcada de 70 propondo um novo modelo para armazenamento e
recuperao de dados.
O modelo relacional revelou-se ser o mais flexvel e adequado ao solucionar os vrios
problemas que se colocam no nvel da concepo e implementao das bases de dados.
A estrutura fundamental do modelo relacional a relao (tabela). Uma relao constituda por um ou mais atributos (campos) que traduzem o tipo de dados a armazenar.
Cada instncia do esquema (linha) chamada de tupla (registro).
O modelo relacional no tem caminhos predefinidos para se fazer acesso aos dados como
nos modelos que o precederam. O modelo relacional implementa estruturas de dados

Captulo 1 - Modelagem e uso de Bancos de Dados Viso geral

Saiba mais

armazenados na maneira indicada nos esquemas. Os geradores de relatrios da CODASYL

organizadas em relaes. Porm, para trabalhar com essas tabelas, algumas restries
5

precisaram ser impostas para evitar aspectos indesejveis, como: repetio de informao,
incapacidade de representar parte da informao e perda de informao. Essas restries
so: integridade referencial, chaves e integridade de junes de relaes.
Banco de dados relacional:

11 Item de dado: campo, coluna, atributo;


11 Registro: linha, tupla;
11 Tabela;
11 Manipulao com SQL: operaes CRUD.

Modelo Orientado a Objetos


Os bancos de dados Orientados a Objeto comearam a se tornar comercialmente viveis em
meados de 1980. A motivao para seu surgimento est em funo dos limites de armazenamento e representao semntica impostas no modelo relacional. Alguns exemplos so os
sistemas de informaes geogrficas (SIG), os sistemas CAD e CAM, que so mais facilmente
construdos usando tipos complexos de dados. A habilidade para criar os tipos de dados
necessrios uma caracterstica das linguagens de programao orientadas a objetos.
Contudo, esses sistemas necessitam guardar representaes das estruturas de dados que
utilizam no armazenamento permanente. A estrutura padro para os bancos de dados
orientados a objeto foi feita pelo Object Database Management Group (ODMG). Esse grupo
formado por representantes dos principais fabricantes de banco de dados orientados a
objeto disponveis comercialmente. Membros do grupo tm o compromisso de incorporar o
padro em seus produtos.
Quando os bancos de dados orientados a objetos foram introduzidos, algumas das falhas
perceptveis do modelo relacional pareceram ter sido solucionadas com essa tecnologia e
acreditava-se que tais bancos de dados ganhariam grande parcela do mercado. Hoje, porm,
acredita-se que os bancos de dados Orientados a Objetos sero usados em aplicaes especializadas, enquanto os sistemas relacionais continuaro a sustentar os negcios tradicionais,
onde as estruturas de dados baseadas em relaes so suficientes. O diagrama de classes
UML serve geralmente como o esquema para o modelo de dados Orientado a Objetos.

Modelo Objeto-Relacional
Alguns bancos de dados relacionais adicionaram a seus produtos a capacidade de incorporar objetos mais complexos, como imagem, som e vdeo, bem como alguns recursos de
orientao a objetos.
No entanto, isso no os torna sistemas puramente orientados a objetos, apesar da deno Modelagem de Bancos de Dados

minao Object-Relational Database Management System (ORDMS). Esse modelo prev a

implementao de uma camada de abstrao de dados em cima dos mtodos relacionais, o


que torna possvel a manipulao de dados mais complexos.

Modelo NoSQL
Um dos grandes desafios atualmente na rea de computao a manipulao e processamento de grande quantidade de dados no contexto de Big Data.
NoSQL (Not only SQL: No s SQL) um termo utilizado para definir um tipo de banco de
dados que no segue normas de tabelas (schemas) presente no banco de dados relacional.

Saiba mais
O termo Modelo Orientado a Objetos usado
para documentar o
padro que contm
a descrio geral das
facilidades de um
conjunto de linguagens de programao
orientadas a objetos e
a biblioteca de classes
que pode formar a
base para o sistema de
banco de dados.

A quantidade de dados gerada diariamente em vrios domnios de aplicao como, por


exemplo, da web, rede sociais, redes de sensores, dados de sensoriamento, entre diversos
outros, esto na ordem de algumas dezenas, ou centenas, de Terabytes.
Uma das tendncias para solucionar os diversos problemas e desafios gerados pelo contexto Big Data o movimento denominado NoSQL. NoSQL promove diversas solues inovadoras de armazenamento e processamento de grande volume de dados. Essas solues
foram inicialmente criadas para solucionar problemas gerados por aplicaes, por exemplo,
web 2.0, que na sua maioria necessitam operar com grande volume de dados, tenham uma
arquitetura que escale com grande facilidade de forma horizontal, permitam fornecer
mecanismos de insero de novos dados de forma incremental e eficiente, alm da necessidade de persistncia dos dados em aplicaes nas nuvens (cloud computing).

Sistema de Informao
Um Sistema de Informao (SI) um conjunto de elementos ou componentes inter-relacionados que coleta (entrada), manipula (processo), armazena e dissemina dados (sada)
e informaes, alm de fornecer um mecanismo de realimentao (ao corretiva) para
garantir a realizao de um determinado objetivo.
Informaes so resultados obtidos pela seleo, sumarizao e apresentao de dados de uma
forma que seja til aos interessados. Geralmente obtida quando alguma atividade mental
humana (observao e anlise) realizada com sucesso sobre dados para revelar seu significado
ou sentido. Assim, vale novamente tecer algumas consideraes sobre Dados x Informao.
Dados x Informao:

11 Dados: fatos que podem ser armazenados. Exemplo: cor dos olhos, idade, sexo etc.
11 Informao: realidade observada sobre os dados. Exemplo: quantidade de pessoas
com cor dos olhos castanho, a mdia de idade das pessoas do sexo masculino.
22 Importncia da Informao: necessidade de qualidade, eficcia, informaes
mais confiveis e rpidas para a tomada de deciso.
22 Uso de recursos da TI: envolve hardware, software, pessoas, banco de dados,

Os dados so constitudos de fatos crus, geralmente representando dados do mundo real,


como o nmero de um funcionrio ou total de horas trabalhadas, podendo ser de vrios
tipos: numricos, alfanumricos, imagem, vdeo, som etc. O processo de organizao desses
fatos crus de forma significativa os tornam uma informao.
Informao um conjunto de fatos organizados de tal maneira que possuem valor adicional,
alm do valor dos fatos individuais (crus). Por exemplo, os gerentes de vendas de uma
determinada empresa podem crer que conhecer o total de vendas de sua empresa em um
determinado perodo seja mais importante do que o nmero de vendas de cada um de seus
funcionrios. J o funcionrio deve se preocupar com o seu total de vendas frente a uma
possvel meta a ser alcanada.
Transformar dados em informao um processo, ou um conjunto de tarefas logicamente
relacionadas realizada para alcanar um resultado definido.
Atualmente esse conjunto de tarefas envolve um conjunto de pessoas, procedimentos, softwares, hardwares, bancos de dados e mecanismos para criar, armazenar e usar o conhecimento e a experincias existentes nas organizaes.

Captulo 1 - Modelagem e uso de Bancos de Dados Viso geral

redes, procedimentos

Desenvolvimento de SI
O desenvolvimento de sistemas envolve criar ou modificar os sistemas de negcio existentes. As principais etapas desse processo e seus objetos incluem investigao de sistemas
(ter entendimento claro de qual o problema), anlise de sistemas (definir o que o sistema
deve fazer para resolver o problema), projeto de sistema (determinar exatamente como o
sistema vai funcionar para atender as necessidades do negcio), implantao do sistema
(criar ou adquirir os vrios componentes do sistema definidos nas etapas de projeto) e
manuteno e reviso do sistema (manter e depois modificar o sistema para que ele continue a atender as necessidades evolutivas do negcio).
Para que essas etapas possam ser alcanadas, podemos partir de um plano de que prope
um ciclo de vida com vistas organizao para o processo de desenvolvimento de um SI,
quais sejam:
Desenvolvimento de um SI: informalmente, iniciado como resultado de um entendi-

mento verbal entre o contratante e o desenvolvedor.


11 Plano de desenvolvimento (organizao): CICLO DE VIDA.
22 Definir atividades a serem executadas;
22 Verificar consistncia entre as atividades;
22 Introduzir pontos de verificao e validao.
Nesse ponto temos de ter em mente que h uma diferena entre Sistemas de Informaes
e o software propriamente dito. O primeiro formado de partes que interagem entre si,
visando um objetivo comum, tais como software, hardware e recursos humanos. O segundo
um conjunto de instrues de programas desenvolvidas para resolver um problema com o
uso da computao.
Outra necessidade importante a de entendermos o papel do DBA e do Analista de Dados
no processo de desenvolvimento de um SI. DBA (DataBase Administrator) o profissional
responsvel por gerenciar, instalar, configurar, atualizar e monitorar um banco de dados
ou sistemas de bancos de dados, ao passo que o Analista de Dados o profissional responsvel por atuar com administrao de banco de dados, desenvolver melhorias, identificar e
solucionar problemas.

Desenvolvimento de software x SGBD


Um SGBD, que um tipo especial de software, um componente importante de um sistema
ou aplicao que far uso dos dados nele armazenados. O SGBD em si ser um componente
que no precisar ele prprio ser desenvolvido, mas a organizao de como os dados sero

Modelagem de Bancos de Dados

criados e armazenados depender diretamente dos objetivos pretendidos para o sistema ou

aplicao que ser desenvolvido.


Existem vrias metodologias (modelos gerais, paradigmas) de desenvolvimento de
software, mas em geral poderemos sempre identificar as seguintes fases:
11 Especificao (dos requisitos);
11 Anlise e Projeto (construo dos modelos);
11 Implementao (desenvolvimento/codificao);
11 Testes/Homologao (implantao);
11 Manuteno.

Ainda que faa parte do escopo desse curso descrever em detalhes diferentes metodologias
de desenvolvimento de software, importante relembrar essas etapas, com destaque para
a primeira etapa.
As especificaes de requisitosso objetivos ou restries estabelecidas por clientes e
usurios do sistema que definem suas diversas propriedades. Os requisitosde software so,
obviamente, aqueles entre os requisitos de sistema que dizem respeito a propriedades do
software. Dessa forma a especificao de requisitos envolve as atividades de determinar os
objetivos de um software e as restries associadas a ele. Ela deve tambm estabelecer o
relacionamento entre esses objetivos e restries e a especificao precisa do software.
Tradicionalmente, os requisitos de software so separados em requisitos funcionais, com a
descrio das diversas funes que clientes e usurios querem ou precisam que o software
oferea, e no funcionais, com as qualidades globais de um software, como manutenibilidade,
usabilidade, desempenho, custos e vrias outras.
Entrevista, observao in-loco e encontros so vistos como algumas das tcnicas que podem
ser utilizadas na fase de especificao de requisitos.
As demais fases de anlise e projeto, implementao, teste e manuteno, que complementam um ciclo tradicional de desenvolvimento de software, buscam traduzir o conjunto
de requisitos levantados em uma implementao que permita atingir os objetivos propostos
(na etapa de manuteno o ciclo se repete de modo a permitir que seja incorporadas ao
sistema possveis melhorias que se fizerem necessrias).
Nosso interesse est com foco na etapa inicial, j que a modelagem do banco de dados depender diretamente do levantamento dos requisitos que o futuro sistema ter de atender.

Modelos de Sistema
Tipos de Modelos:

11 Funcional (processos).
11 De Dados.

Antes de construir um SI, deve-se elaborar um modelo (planta) que seja capaz de expressar, com
a mxima fidelidade e simplicidade possveis, o ambiente no qual ele se insere visando satisfazer
todos os requisitos identificados. Isso nos possibilita ter um maior domnio sobre o problema,
uma vez que o modelo facilita e diminui os custos de possveis adequaes do projeto.
Cada um dos modelos recm citados busca retratar diferentes aspectos ou dimenses do
sistema a ser desenvolvido, sendo vistos como um mecanismo eficaz de comunicao entre
tcnicos e usurios. Esses modelos lidam tambm com a questo da complexidade atravs
de nveis de abstrao, tornando mais fceis (e tambm mais baratas) as discusses em
torno da adequao do sistema que ser construdo. A seguir detalhamos um pouco mais
cada um desses modelos.

Funcional
Pode ser visto como sendo formado por uma representao grfica, acompanhada de uma
descrio de cada funo e das suas interfaces. Costuma ser expressa por meio de Diagrama
de Fluxo de Dados (DFD).

Captulo 1 - Modelagem e uso de Bancos de Dados Viso geral

11 Comportamental (tempo-dependente).

De dados
Mtodo da anlise de sistemas que busca especificar, a partir de fatos relevantes que
estejam associados ao domnio de conhecimento analisado, a perspectiva dos dados, permitindo organiz-los em estruturas bem definidas, estabelecendo as regras de dependncia
entre eles, produzindo um modelo expresso por uma representao, ao mesmo tempo
descritiva e diagramtica.

Comportamental
Descreve de que maneira o sistema, enquanto um conjunto de elementos inter-relacionados,
reage, internamente, com um todo organizado, aos estmulos externos. Preocupa-se em
mostrar as aes que o sistema deve executar para responder adequadamente aos eventos
previstos no modelo ambiental.

Projeto de banco de dados


Trs nveis de abstrao (necessrio realizar o mapeamento entre os trs modelos):

11 Modelo Conceitual (DER).


11 Modelo Lgico (Esquema do BD).
11 Modelo Fsico (Script do BD em SQL).
O projeto de concepo e implementao do banco de dados que vai dar suporte ao sistema
sendo desenvolvido deve, igualmente, passar por diferentes estgios de abstrao. So
enormes as presses para que a equipe de informtica possa responder o mais rapidamente possvel s demandas para colocar em funcionamento o novo sistema. Assim, no
incomum tomar conhecimento de projetos de desenvolvimento onde as etapas de levantamento de requisitos e modelagem so relegadas a um segundo plano. Esse um erro
comum que costuma cobrar seu preo, em geral muito significativo, nas etapas seguintes
do processo de desenvolvimento. Nossa recomendao no negligenciar nenhuma das
seguintes etapas ao projetar um banco de dados.
11 Modelo Conceitual (DER): tambm conhecido como Diagrama Entidade-Relacionamento,
um modelo de dados abstrato que descreve a estrutura de um banco de dados independe de sua implementao;

cdigo
descrio

cdigo

quantidade
preo

Modelagem de Bancos de Dados

Produto

10

(1, n)

nome

tem

(1, 1)

Categoria

11 Modelo Lgico (Esquema do BD): tem como objetivo transformar o modelo conceitual
em um modelo que define como o banco de dados ser implementado em um SGBD
especfico. Deve representar relaes e restries do modelo de dados que representa a
estrutura de um BD e o Esquema do Banco de Dados;

Figura 1.2
Exemplo de um
Modelo Conceitual.

Categoria (@codCat: inteiro, nomeCat: literal[30])


Produto (@codProd: inteiro, descProd: literal[50],
quantProd: real, precoProd:real, codCatProd: inteiro)

Produto

Categoria

cdigo: inteiro

cdigo: inteiro

descrio: Texto (30)


quantidade: real

(1,n)

nome: Texto (30)


(1,1)

preo: real

Figura 1.3
Exemplo de um
Modelo Lgico.

cdigoCat: inteiro
11 Modelo Fsico (Script do BD em SQL): nessa fase, o modelo do banco de dados enriquecido com detalhes que influenciam no desempenho do banco de dados, mas no
interferem na sua funcionalidade. Script do banco de dados em SQL representa os detalhes dos dados internamente ao BD (campo, tipo/domnio, restries).

CREATE TABLE PRODUTO (


codprod INTEGER PRIMARY KEY,
quantprod REAL,
precoprod REAL,
descrprod VARCHAR(30),
codcatprod INTEGER
);
CREATE TABLE CATEGORIA (
codcat INTEGER PRIMARY KEY,

);
ALTER TABLE PRODUTO ADD FOREIGN KEY(codcatprod) REFERENCES
CATEGORIA (codcat);

Etapas da modelagem do banco de dados


A figura a seguir ilustra o esquema geral das diferentes etapas que sero percorridas ao
longo do desenvolvimento de um novo banco de dados no contexto do desenvolvimento de
um novo sistema ou aplicao.

Captulo 1 - Modelagem e uso de Bancos de Dados Viso geral

nomecat VARCHAR(30)

11

Mini-Mundo

Obteno e anlise de requisitos

Requisitos da base de dados

Projeto conceitual

Esquema conceitual
(em um modelo de dados de alto-nvel)

Independente de qualquer SGBD


Mapeamento do modelo de dados
SGBD especco
Esquema conceitual
(em um modelo de dados de um SGBD especco)

Projeto fsico
Figura 1.4
Esquema geral
de modelagem
de dados com o
uso de ER.

Esquema interno
(para o mesmo SGBD)

Primeira Etapa Anlise de Requisitos


Levantamento/Estudo de Viabilidade:

11 Identificar usurios responsveis e definir escopo.


11 Identificar as deficincias no sistema atual (justificativa).
11 Estabelecer metas e objetivos para o novo sistema.
11 Determinar se possvel informatizar (viabilidade).
Modelagem de Bancos de Dados

11 Fazer estimativas (clculo de Custo/Benefcio).

12

11 Preparar um cronograma.
indispensvel que o profissional ou equipe envolvidos com o projeto do banco de dados
tenha um bom domnio do negcio da sua organizao ou empresa. Para tanto, pode e deve
fazer uso de diferentes ferramentas para a coleta de dados, tais como entrevistas, anlise de
procedimentos e documentos, questionrio etc. O objetivo identificar requisitos de dados
(fatos do mundo real) que devero ser observados ou atendidos.

Essa uma etapa pr-modelagem, onde o mais comum elaborar a especificao formal
dos dados no formato de um texto descritivo, tambm chamado de minimundo ou Universo
de Discurso, que pode ser validado pelos futuros usurios do sistema em desenvolvimento.
A seguir, apresentamos um exemplo de minimundo.

Exemplo de Minimundo: EMPRESA


A empresa est organizada em departamentos. Cada departamento tem um nome,
um nmero nico e um empregado que gerencia o departamento. Armazena-se a
data em que o empregado comeou a gerenciar o departamento. Um departamento
pode ter diversas localizaes;
Um departamento controla inmeros projetos, sendo que cada um tem um nome,
um nmero nico e uma localizao;
Do empregado armazena-se o nome, o nmero do seguro social, endereo, salrio,
sexo e data de nascimento. Todo empregado alocado em um departamento, mas
pode trabalhar em diversos projetos, que no so necessariamente controlados pelo
mesmo departamento. Armazena-se, tambm, o nmero de horas semanais que o
empregado trabalha em cada projeto. Mantm-se, ainda, a indicao do supervisor
direto de cada empregado;
feito um controle sobre os dependentes de cada empregado para fins de seguro.
De cada dependente registrado o nome, sexo, data de nascimento e o parentesco
com o empregado.
FONTE: ELMASRI, R.; NAVATHE, S. B. Sistemas de banco de dados. 4. ed. So Paulo:
Pearson, 2005.

Segunda Etapa Anlise e projeto


11 Projeto do BD.

11 1) Modelo Conceitual (DER).

11 3) Modelo Fsico (Script do BD/Tabelas-Restries).


Com base no texto descritivo, ou minimundo, gerado na primeira etapa, inicia-se o processo
de modelagem propriamente dito, indo do mais abstrato para o mais concreto. Assim, os
modelos vo se sucedendo conforme indicado na figura 1.4. Nas prximas sesses, cada um
desses modelos sero tratados separadamente.

Atividade de Fixao e
Descreva com suas palavras. Qual o principal objetivo de se utilizar o processo de modelagem de dados no processo de desenvolvimento de sistemas?

Captulo 1 - Modelagem e uso de Bancos de Dados Viso geral

11 2) Modelo Lgico (Esquema do BD/Relaes).

13

14

Modelagem de Bancos de Dados

2
Conhecer os conceitos de Diagrama Entidade Relacionamento (DER) e o processo de
construo de um DER, fazendo uso de ferramenta CASE e tcnicas de normalizao.

Diagrama Entidade Relacionamento: DER


De forma resumida, o DER tem as seguintes caractersticas:

conceitos

DER; EER; Entidades; Atributos; Relacionamentos; CASE; Dado temporal e normalizao.

11 Tambm conhecido como Modelo E-R.


11 Definido por Peter Chen (1976), com base na teoria relacional criada por E. F. Codd (1970).
11 Estudiosos (Theorey, Fry, James Martin e outros) evoluram e expandiram o meta-modelo
(viso moderna) > Engenharia da Informao.
11 Objetivo: apresentar uma viso nica, no redundante e resumida, dos dados de
uma aplicao.
O Diagrama Entidade-Relacionamento (DER) um modelo conceitual de alto nvel, criado
na dcada de 70, e que empregado no desenvolvimento de projetos de aplicaes que
vo manipular Banco de Dados. Seu objetivo o de facilitar a compreenso por parte do
usurio, sendo visto como uma ferramenta til durante o processo de projeto da base de
dados, descartando detalhes de como os dados sero armazenados.
A figura 2.1 apresenta uma soluo proposta de modelagem de alto nvel utilizando o DER
para o estudo de caso EMPRESA apresentado na sesso de aprendizagem 1.
Captulo 2 - Modelo conceitual: DER

objetivos

Modelo conceitual: DER

15

Pnome

Mnome

Snome

Nome

Endereo

Nss

Sexo

Nmero
Nome
N

Salrio

EMPREGADO
DataNasc

TRABALHA PARA

supervisor

SUPERVISIONA

GERENCIA

supervisiona

DEPARTAMENTO

NmeroDeEmpregados

DataInicio

Localizao

CONTROLA
Horas

TRABALHA EM

PROJETO
Nome

DEPENDENTE DE

Localizao

Nmero

DEPENDENTE
Nome

Sexo

DataNasc

Figura 2.1
DER estudo de caso
empresa.

Relao

Componentes do DER
Um DER composto pelos seguintes elementos:

11 Entidades: objeto do mundo real com identificao distinta e com um significado


prprio.
11 Atributos: qualificadores de uma entidade (caractersticas que a descrevem).
11 Relacionamentos: dependncia entre entidades associadas: quando um atributo de
uma entidade refere-se a outra.
22 Restries em relacionamentos: limitam a possibilidade de combinaes de entidades que podem participar do relacionamento (restries estruturais).
A seguir, analisamos cada um deles com detalhes.

Entidades
Modelagem de Bancos de Dados

Uma entidade tem as seguintes caractersticas:


11 Representa uma classe de dados. Suas instncias (ocorrncias) so a representao
desses dados.
11 Representao: retngulo com nome em seu interior, sendo que o nome deve estar
no singular, representando o conjunto (de instncias).
11 Possui atributos: qualificadores de uma entidade (caractersticas que a descrevem).
22 Notao original (Chen, 1976): elipses.
Uma entidade por ser vista como um conjunto de objetos do mundo real que est sendo
modelado e sobre o qual desejamos manter informaes em um banco de dados.
16

Em um DER, uma entidade representada por meio de um retngulo que contm o nome da
Figura 2.2
Representao
grfica de entidade
no DER.

entidade que se deseja modelar, conforme ilustrado na figura 2.2.


DEPARTAMENTO

EMPREGADO

Uma Entidade pode ser um objeto (livro), uma pessoa (empregado), abstrato (curso), acontecimento (inscrio). O nome depende do contexto (pessoa: Aluno, Professor, Segurado,
Contribuinte, Empregado).

Atributos
O atributo corresponde a uma dado que associado a cada ocorrncia de uma entidade ou
relacionamento. Atributos so representados graficamente conforme ilustrado na figura 2.3.

Pnome

Nss

Snome

Nome

Endereo
Sexo

Salrio

EMPREGADO
DataNasc
Na prtica, muitas vezes os atributos no so representados graficamente para no sobrecarregar os diagramas, j que entidades podem possuir um grande nmero de atributos. Nesses
casos prefervel o uso de representao textual.
importante ressaltar que toda entidade deve ter pelo menos um atributo, sendo que

deve apresentar atributo identificador:


11 Valor sempre distinto para cada instncia, caracterizando que no existem objetos
repetidos;
22 Restrio de unicidade ou chave primria.
11 No pode ser um valor nulo (vazio, desconhecido);
11 Notao original (Chen, 1976): nome sublinhado na elipse.

Captulo 2 - Modelo conceitual: DER

Figura 2.3
Representao
de atributos
da entidade
Empregado.

Mnome

17

Atributos podem ser:


PRIMARY
KEY
Nome
sublinhado
na elipse

TRIGGER
Elipses
com linha
tracejada
FOREIGN
KEY
S aparece
na entidade
de origem
UNIQUE
NOT NULL

Caracterstica

Alternativa

identicador
DEPARTAMENTO: SiglaDepto
(Reconhece uma nica instncia na entidade)

no-identicador
DEPARTAMENTO: NomeDepto
(qualquer outro atributo)

simples
EMPREGADO: Cidade

composto
EMPREGADO: Endereo
(formado de rua, nmero, bairro, cep, etc.)

Elipses
a partir
de elipse

monovalorado
ALUNO: Matrcula

multivalorado
ALUNO: Telefone
(pode ser que tenha mais de um: res, com, cel)

Elipse
com linha
dupla

derivado
NOTA FISCAL: ValorTotal
(obtido a partir de outros atributos)

no-derivado
NOTA FISCAL: Quantidade
(qualquer outro atributo)

relacionante
DEPARTAMENTO E EMPREGADO: SiglaDepto
(elo de relacionamento entre 2 entidades)

descritivo
DEPARTAMENTO: NomeDepto
(qualquer outro atributo)

nico
EMPREGADO: NmeroMatrcula

no-nico
EMPREGADO: Endereo
(empregados que moram na mesma residncia)

obrigatrio
EMPREGADO: Nome

opcional
EMPREGADO: NomeCnjuge
(empregado que no casado)

Atributos Identificadores

Figura 2.4
Tipos de atributos.

Conforme j mencionado, toda entidade tem sempre pelo menos um atributo. Quando o
atributo permite distinguir uma ocorrncia das demais ocorrncias de uma mesma entidade, ele considerado um especial conhecido como atributo identificador de entidade.
Note, contudo, que um atributo identificador corresponde a um conjunto de um ou mais
atributos ou relacionamentos. A figura 2.5 apresenta um atributo concatenado, que um
atributo identificador composto por mais do que um atributo, nesse caso composto pelos
atributos Nome e Nmero.
PROJETO
Nome

Localizao

Modelagem de Bancos de Dados

Nmero

18

Outro aspecto a ser observado a caracterstica do atributo identificador, que pode ser
inerente entidade ou dependente de uma entidade ou relacionamento externo. No primeiro caso, a entidade que possui um atributo identificador prprio chamada de entidade
primria ou entidade forte. J quando a entidade no pode ser identificada somente atravs
de seus prprios atributos, muitas vezes dependendo de um relacionamento para poder ser
identificada, ela chamada de entidade fraca, sendo representada por um retngulo com
linha dupla conforme demonstrado na figura 2.6. A seguir apresentamos alguns exemplos
para ajudar a compreender esses conceitos.

Figura 2.5
Atributo
identificador
concatenado.

11 Entidade primria ou entidade forte:


22 Atributo prprio (CPF, nmero da placa);
22 Cdigo atribudo pelo sistema (Nmero de Matrcula, Cdigo de Fornecedor).
11 Entidade fraca:
22 Um dependente, que precisa do nome do seu pai ou me.
22 Um item em uma Nota Fiscal, que precisa do nmero da Nota Fiscal e possivelmente o cdigo do produto correspondente.
DEPENDENTE
Figura 2.6
Entidade Fraca.

Nome

Sexo

DataNasc

Relao

Relacionamentos
Um Relacionamento a representao de um conjunto de associaes entre as ocorrncias
de entidades. Dessa forma, podemos representar as interaes existentes no mundo real,
que foram identificadas no processo de anlise, entre as entidades. Em um DER, um relacionamento representado por uma linha reta ligando as entidades relacionadas e, em geral,
tem como nome um verbo que represente o contexto da relao em questo. A figura 2.7
apresenta alguns exemplos de relacionamentos utilizando a notao original, onde o nome do
relacionamento aparece dentro de um losango na interligao de suas respectivas entidades.
DEPARTAMENTO
1

orquestra

(0,1)

trabalhaEm

(1.n)

MUSICO

Figura 2.7
Exemplos de
relacionamentos
(notao original).

CONTROLA

PROJETO

Vamos imaginar uma situao onde, aps identificar requisitos de dados (fatos do mundo
real) tenhamos a seguinte situao:

- Pessoas moram em Apartamentos

- Condomnios localizam-se em Ruas ou Avenidas


- Ruas ou Avenidas esto em uma Cidade
Notem que os verbos sublinhados nos orientam no processo de diagramao dos relacionamentos entre as entidades destacadas em itlico. Dessa forma, podemos propor o DER
apresentado na figura 2.8.

Captulo 2 - Modelo conceitual: DER

- Apartamentos formam Condomnios

19

Pessoas

Moram

Aptos

Formam

Condomnios
Figura 2.8
Processo de
identificao de
Relacionamentos
entre entidades.

Localizam-se

Cidade

Esto

Ruas

Restries em relacionamento
No processo de modelagem importante identificar no apenas as entidades e seus relacionamentos, mas tambm estabelecer a quantidade de ocorrncias de cada um desses
relacionamentos. A essa propriedade damos o nome de cardinalidade, que se desdobra em
cardinalidade mxima e a cardinalidade mnima.
Em qualquer relacionamento, deve-se questionar se existem restries estruturais, que
so aquelas que limitam a sua cardinalidade. Tomando como exemplo o relacionamento
entre Mulher e Filho, h que se perguntar se toda mulher ter necessariamente um filho ou
se, tendo filhos, existe um limite superior de filhos que podem ser associados a uma nica
Mulher. Assim, a cardinalidade poder revelar diferentes caractersticas:

11 Mxima: razo de Cardinalidade.


11 Mnima: participao ou dependncia de Existncia.
A cardinalidade mxima, tambm chamada de Razo de Cardinalidade/Conectividade,
informa o nmero de ocorrncias (mximo) de instncias de uma entidade em outra.

representada, na notao original, atravs dos smbolos 1 ou N de cada lado dos losangos
do relacionamento.

Existem 3 variaes possveis:


11 1:1 cada instncia de uma entidade relaciona-se com uma e somente uma instncia
da outra:
22 Motorista possui CNH, Homem casado com Mulher.
11 1:N (ou N:1) uma instncia relaciona-se com vrias na outra entidade, mas cada instncia
da outra entidade s pode estar relacionada a uma nica ocorrncia da primeira entidade:
22 Venda feita para Cliente, Filme tem Gnero.
11 N:N (ou N:M) uma instncia relaciona-se com vrias ocorrncias na outra entidade,
e vice-versa:

Modelagem de Bancos de Dados

22 Estudante cursa Disciplina, Venda contm Produto.

20

DEPARTAMENTO

COMPOSITOR

COMPE

COMPOSIO

CONTROLA

EMPREGADO

1
N

PROJETO

DEPARTAMENTO

DataInicio

GERENCIA

Figura 2.9
Exemplos de
restries de
relacionamento.

Diagrama de ocorrncias
O diagrama de ocorrncias uma ferramenta utilizada na identificao de quantidades em
possveis relaes entre entidades durante o processo de anlise.
No relacionamento de grau 1:1 (Um-para-Um), cada elemento de uma entidade relaciona-se com um e somente um elemento de outra entidade. J no relacionamento de grau 1:N
(Um-para-Muitos), cada elemento da entidade 1 relaciona-se com muitos elementos da
entidade 2. Esse grau de relacionamento o mais comum no mundo real, sendo visto como o
relacionamento bsico entre entidades. Por fim, temos o relacionamento de grau M:N (Muitospara-Muitos), onde cada elemento da entidade 1 relaciona-se com muitos elementos da entidade 2 e cada elemento da entidade 2 relaciona-se com muitos elementos da entidade 1.
Isso ocorre uma vez que em ambos os sentidos de leitura do relacionamento encontra-se um
grau Um-para-Muitos, o que caracteriza um contexto geral de Muitos-para-Muitos.
Na figura 2.10 a seguir, podemos ver exemplos do diagrama de ocorrncias em relacionamentos de diferentes cardinalidades

HOMEM

MULHER

CASADO

A
B
C
D

A1
A2
A3
A4

X
Y
Z
W

B1
B2
B3
B4
B5

CURSA
1
2

ESTUDANTE
E1
E2
E3
E4
E5

3
4
5

DISCIPLINA
D1
D2
D3
D4

6
7
8

Figura 2.10
Diagramas de
ocorrncias..

Voltando ao conceito de Cardinalidade Mnima, j apresentado antes, importante destacar


que essa caracterstica indicar a Participao ou Dependncia de Existncia entre diferentes

Para a cardinalidade mnima, temos duas possibilidades:


11 Total/Obrigatria (dependncia de existncia): Empregado trabalha para Departamento:
22 Representao por linha dupla no relacionamento.
11 Parcial/Opcional: Empregado gerencia Departamento.

q
Captulo 2 - Modelo conceitual: DER

entidades.

21

TRABALHA PARA

obrigatrio

obrigatrio
EMPREGADO

NmeroDeEmpregados

DataInicio

opcional

GERENCIA

DEPARTAMENTO
Figura 2.11
Exemplos de
participao/
dependncia em
relacionamentos.

obrigatrio

CrowsFoot
Nos exemplos apresentados at o momento, temos privilegiado o uso da notao original
empregada quando o DER comeou a ser difundido. Com o passar do tempo, outras notaes foram sendo sugeridas, sempre buscando aprimorar o processo de anlise/confeco
dos Diagramas. Uma notao bastante utilizada e que representa a cardinalidade de relacionamentos de forma diferente a notao CrowsFoot. Na figura a seguir, apresentamos uma
tabela com essa notao.
Extremidade
A

CNJUGE

Mn.

Mx.

Descrio

Cada instncia de A est


associada a uma nica
instncia de B

Cada instncia de A est


associada a uma ou vrias
instncias de B

Cada instncia de A est


associada a zero ou uma
nica instncia de B

Cada instncia de A est


associada a zero, uma ou
vrias instncias de B

EMPREGADO

DEPARTAMENTO

A notao CrowsFoot foi proposta por James Martin sob a tica de engenharia de informao, sendo tambm conhecida como p-de-galinha, onde os relacionamentos so
representados apenas por uma linha.
Nesta notao, podemos representar apenas relacionamentos binrios e a representao
Modelagem de Bancos de Dados

de cardinalidade mxima e mnima so grficas. Sendo assim, o smbolo mais prximo da

22

entidade (retngulo) a representao da cardinalidade mxima e o mais distante da cardinalidade mnima.

Grau do Relacionamento

11 Unrio (grau 1): relacionamento com a prpria entidade, tambm chamado de relacionamento recursivo ou autorrelacionamento.
11 Binrio (grau 2): mais comum.
11 Ternrio (grau 3): maior complexidade.
11 Ou mais...

Figura 2.12
Exemplo de
modelagem com a
notao CrowsFoot.

O grau de um relacionamento corresponde ao nmero de entidades que participam do


relacionamento. Assim, temos relacionamentos unrios, binrios, ternrios e assim sucessivamente, muito embora no seja comum desenvolver diagramas com relacionamentos com
mais de trs entidades envolvidas. Existem outros motivos para isso, que sero apresentados
adiante. Por ora, vamos detalhar um pouco mais os graus de relacionamentos mais comuns.
Um relacionamento unrio utilizado para representar ocorrncias de autorrelacionamento, isto , um relacionamento entre ocorrncias de uma mesma entidade. Nesse caso, o
conceito de papel da entidade no relacionamento auxilia no entendimento e leitura do DER.
Uma dica para ajudar a identificar esse tipo de relacionamento buscar por atributos que
indicam uma ocorrncia da prpria entidade. Esses atributos so chamados de ATRIBUTOS
RELACIONANTES, e um exemplo pode ser visto na figura 2.14. Outra sugesto dar o nome
de papis a esses relacionamentos recursivos.
Empregado: nome, sexo, departamentoLotao, supervisor...
EMPREGADO
supervisor

Figura 2.13
Exemplo de
relacionamento
recursivo ou
autorrelacionamento.

supervisiona

SUPERVISIONA

Um relacionamento binrio aquele cujas ocorrncias contm duas ocorrncias de entidade, como todos os vistos at aqui. Assim, podemos classificar os relacionamentos binrios
de acordo com a sua cardinalidade: N:N, 1:N e 1:1.
A abordagem ER permite que sejam definidos relacionamentos de grau maior do que dois
(ternrio, quaternrio, e assim sucessivamente). No caso do relacionamento ternrio, a
cardinalidade refere-se a pares de entidades. Em um relacionamento R entre trs entidades
CIDADE, PRODUTO e DISTRIBUIDOR, a cardinalidade mxima de CIDADE e PRODUTO dentro
de R indica quantas ocorrncias de DISTRIBUIDOR podem estar associadas a um de ocorrncias de CIDADE e PRODUTO. Exemplo na figura 2.5.
DISTRIBUIDOR

CIDADE
N

DISTRIBUIO
N

PRODUTO

Captulo 2 - Modelo conceitual: DER

Figura 2.14
Exemplo de
relacionamento
ternrio.

23

Relacionamentos com atributos


Uma pergunta comum para quem comea a trabalhar com DER se relacionamentos podem
ter atributos. A resposta sim, pois podem existir dados que so inerentes ao fato que unem
as respectivas entidades e no a qualquer uma das entidades. Alguns exemplos disso so:
11 Empregado gerencia Departamento (data de incio);

11 Empregado trabalha em Projeto (nmero de horas);


11 Paciente consulta Mdico (data/hora);
22 Atributos podem ser omitidos no diagrama desde que especificados no Dicionrio
de Dados (DD) ferramenta textual de apoio aos Diagramas;
22 Escolher nomes apropriados.
Uma boa prtica para melhorar a legibilidade dos DER a escolha de nomes apropriados, ou seja, que carreguem significado para ajudar no entendimento geral
daquilo que est sendo representado no diagrama.
11 Entidade: singular, maisculo (substantivo);
11 Relacionamento: minscula (verbo).

Ferramentas CASE
Ferramentas CASE (Computer-Aided Software Engineering) so ferramentas computadorizadas que contribuem/auxiliam no processo de engenharia de um software. Em outras
palavras, so softwares cuja finalidade ajudar no desenvolvimento de outros softwares.
Em nosso caso, estamos interessados em ferramentas CASE especficas para o processo
de modelagem de sistemas de informao. grande a quantidade de ferramentas desse
tipo disponveis no mercado, mas preciso escolher aquela que ser mais apropriada ao
processo de modelagem sendo utilizado.
Observa-se que muitas dessas ferramentas no possibilitam a construo de modelos
conceituais, partindo diretamente para o modelo lgico (e at fsico) do banco de dados.
Consideramos que isso no desejvel, pois descarta um passo importantssimo, que o
foco desta sesso: a conceitualizao do problema.
Descartar o Modelo Conceitual pode at ser admitido em sistemas pequenos, construdos por profissional com grande experincia em modelagem de dados, mas

Modelagem de Bancos de Dados

inadmissvel na fase de aprendizagem!

24

Exemplos de Ferramentas de Modelagem:


11 DBDesigner;
11 MySQL Workbench Design;
11 PowerArchitect;
11 Oracles Designer;
11 ERWin;
11 brModelo.

Notaes
J foi mencionado que diversas notaes diferentes foram propostas em cima da notao
originalmente idealizada por Peter Chein na dcada de 70. Uma representao de um
modelo chamada esquema do banco de dados. A figura 2.16 apresenta os principais
smbolos utilizados na representao grfica de um esquema ER, tanto na notao original
como na notao IDEFIX proposta por Bachman.
A notao IDEFIX a mais comumente implementada em ferramentas de modelagem, mas
a verdade que cada ferramenta pode trazer caractersticas especficas e pequenas (ou
significativas) variaes em relao a notao original.
Neste curso, ser utilizada a ferramenta brModelo, que ser apresentada com mais detalhes

Figura 2.15
Notaes DER.

a seguir.

Construes do modelo ER
usando a notao de Chen

Construes do modelo ER
usando IDEFIX [Bruc92]

Entidade
Atributo
(sem operao)

Funcionrio

id-func

Entidade
Chave-primria
Atributo de chave
no-primria

nome-func

FUNCIONRIO
id-func
nome-func
classe-cargo

classe-cargo
(a) Entidade com atributos
Departamento

gerenciado-por

Funcionrio

Departamento

-gerenciado-por

Funcionrio

(b) Um-pra-um
Diviso

tem

Departamento

Diviso

tem

Departamento

(c) Um-para-muitos, lados muitos opcional


Escritrio

-ocupado-por

Funcionrio

Escritrio

-ocupado-por

Funcionrio
P

(d) Um para muitos, lado um opcional


M

trabalha-em

Projeto

Funcionrio

trabalha-em

(e) Muitos-para-muitos
-lider-grupo-de
Funcionrio
1

Funcionrio
N

-lider-grupo-de

Projeto

Captulo 2 - Modelo conceitual: DER

Funcionrio

25

A ferramenta brModelo
A brModelo uma ferramenta freeware voltada para o ensino de modelagem em banco
de dados relacional aplicando anotao original proposta por Chen com algumas adaptaes. Assim, pode-se considerar a brModelo como uma ferramenta mais completa, j que a
maioria das ferramentas disponveis no mercado utilizam notaes voltadas basicamente
para a implementao do esquema gerado no SGBD, sem muita preocupao com o modelo
lgico. Algumas dessas ferramentas sequer implementam o modelo conceitual.

Saiba mais
Essa ferramenta foi
desenvolvida por
Carlos Henrique
Cndido sob orientao
do Prof. Dr. Ronaldo
dos Santos Mello
(UFSC), como trabalho
de concluso do curso
de ps-graduao em
banco de dados na
UNVAG: MT e UFSC.

Figura 2.16
Interface grfica do
brModelo.

A figura 2.18 apresenta o DER do Mini-Mundo Empresa que foi apresentado anteriormente.
Pode-se ver a qualidade dos grficos gerados e como os conceitos at aqui apresentados
so nela representados.

pNome
mNome
uNome

SSN
endereo
sexo
salrio

nome

(1,n)
supervisor (0,1)

Modelagem de Bancos de Dados

supervisiona
EMPREGADO
supervisionado (1,n)

26

(1,1) (1,n)

Figura 2.17
DER: Estudo de
caso Empresa.

trabalhaPara

(1,1)
DEPENDENTE

(1,1)

gerencia

(0,1)
dataIni

dependeDe

trabalhaEm

nmero
nome
numEmpregados
localizao (1,n)

(1,1)

controla

numHoras
(0,n)
nome
parentesco
sexo
dataNasc

DEPENDENTE

(0,n)
(1,n)

PROJETO

nmero
nome
localizao

Atividade de Fixao 2.1

Refinamento do modelo conceitual


Tcnicas de refinamento do modelo conceitual foram sendo implementadas para auxiliar no
processo de modelagem de novas solues de software que foram sendo desenvolvidas ao
longo do tempo como, por exemplo, aplicaes que passaram a utilizar o conceito de Orientao a Objetos, presentes em linguagens de programao a partir do final da dcada de 90.
No processo de refinamento do Modelo Conceitual, uma tcnica bastante interessante a
de utilizar os conceitos de orientao a objetos, fazendo uso do Diagrama Entidade-Relacionamento Estendido: EER. Devemos lembrar que o modelo ER no suporta alguns conceitos
semnticos necessrios para modelar bases de dados mais recentes (GIS, CAD/CAM etc.).
O modelo EER uma das alternativas ao modelo ER para modelar esse tipo de bases

de dados.
Para isso, so trabalhados os seguintes conceitos:
11 Herana;
11 Multiplicidade: uso da cardinalidade: [mn, mx], CrowsFoot;
11 Generalizao-especializao (genespec)

Generalizao/especializao
Associado ao conceito de generalizao/especializao, est a ideia de herana de propriedades. Herdar propriedades significa que cada ocorrncia da entidade especializada possui,
alm de suas prprias propriedades, as propriedades da ocorrncia da entidade genrica
correspondente. Assim, segundo o DER da figura 2.19 a seguir, a entidade PESSOA FSICA
possui, alm de seus atributos CPF e sexo, os atributos herdados da entidade CLIENTE (que
so os atributos cdigo e nome), bem como o relacionamento com a entidade FILIAL.
A especializao possibilita a atribuio de propriedades particulares a um subconjunto de
ocorrncias, ditas especializadas, de uma entidade genrica.
FILIAL

(1,1)

(0,n)

CLIENTE

codigo
nome

cpf
sexo

PESSOA
FSICA

PESSOA
JURIDICA

CNPJ
tipoOrganizacao

com base para as especializadas.


Como pode ser visto na figura 2.19, utilizado um tringulo issceles para representar o
smbolo de especializao. Na figura 2.20, veremos que a generalizao representada
atravs de um crculo seguido de linhas com o sinal de contido, reforando quais entidades
so a base para a identificao de uma generalizao. Assim, temos a seguinte simbologia:

Captulo 2 - Modelo conceitual: DER

Figura 2.18
Exemplo de
especializao.

27

a)

Preco

NrdePassageiros

Preco

CARRO

VelocidadeMaxima
IDVeiculo

CAMINHAO
NrLicencaPlaca

b)

NrdeEixos

IDVeiculo

NrLicencaPlaca

Preco

Capacidade

IDVeiculo

NrLicencaPlaca

VEICULO
NrdeEixos

NrdePassageiros

d
CAMINHAO

CARRO

VelocidadeMaxima

com para a genrica;


importante destacar que a rvore resultante do processo de herana, identificada pela

Capacidade

Figura 2.19
Exemplo de
generalizao.

generalizao/especializao a ser modelada, deve ter uma nica entidade raiz, sendo que
esta dever conter o identificador desse tipo de relacionamento. Na figura 2.21, apresentamos um exemplo ilustrando isso.
VECULO

VECULO TERRESTRE

AUTOMVEL

Identicador
de veculo
denido aqui

VECULO AQUTICO

ANFBIO

BARCO

Modelagem de Bancos de Dados

Herana mtipla

28

Alm disso, o identificador deve ser uma chave exclusiva que indica a relao existente entre
a entidade especializada e a entidade genrica. Chamamos a ateno para a impossibilidade
de modelagem de herana com mltiplos identificadores, conforme podemos observar na
figura 2.22.

Figura 2.20
Exemplo de
identificador nico
no processo de
modelagem de
herana.

VECULO TERRESTRE

AUTOMVEL
Figura 2.21
Hierarquia proibida:
herana de vrios
identificadores.

VECULO AQUTICO

ANFBIO

BARCO

Qual seria o identicador


desta entidade?
Finalmente, na figura 2.23 apresentamos um exemplo demonstrando a possibilidade da
recurso tanto na generalizao como na especializao. Nesse exemplo, apresentada a
estrutura hierrquica de uma generalizao.
EMPREGADO

TECNICO

ENGENHEIRO

GERENTE
EMPREGADO ASSALARIADO

Figura 2.22
Estrutura
Hierrquica de
uma generalizao
(recurso).

EMPREGADO HORISTA

GERENTE_ENGENHARIA

Assim, de forma resumida, temos que:


11 Especializadas herdam as propriedades da entidade genrica;

11 Identificador somente na entidade genrica;


11 Permite recurso (estrutura hierrquica): No h limite no nmero de nveis;
11 Permite Herana Mltipla (exemplo: ANFBIO);
11 Uma entidade pode ser especializada em qualquer nmero de entidades, inclusive uma.

Tipos de generalizao/especializao
A generalizao/especializao pode ser classificada como:
11 Total ou parcial: define a obrigatoriedade ou no de ocorrncias da entidade genrica
corresponder a uma ocorrncia da entidade especializada.
11 Exclusiva ou compartilhada: define se uma ocorrncia da entidade genrica pode ser
especializada uma ou mais vezes.
A seguir, analisamos cada um desses tipos separadamente.

Captulo 2 - Modelo conceitual: DER

SECRETARIA

29

Especializao Total (ou disjunta)


Na generalizao/especializao total, cada ocorrncia da entidade genrica dever estar
associada a uma ocorrncia de uma de suas entidades especializadas. Esse tipo de especializao/generalizao simbolizado por um t junto ao tringulo isscele que representa o
relacionamento (generalizao/especializao) entre as entidades.
Assim, para cada ocorrncia da entidade genrica, existe sempre uma ocorrncia em uma das
entidades especializadas. Um exemplo de especializao total apresentado na figura 2.24.

Pode no aparecer o t.
Em outra notao: (d)-disjunto

codigo

CLIENTE

nome
indica que todo CLIENTE
ou PESSOA FSICA
ou PESSOA JURDICA

CPF
sexo

PESSOA
FSICA

PESSOA
JURIDICA

CNPJ
tipoOrganizacao

Figura 2.23
Exemplo de
generalizao/
especializao total.

Especializao Parcial (ou notao linha simples)


J na generalizao/especializao parcial, nem toda ocorrncia da entidade genrica possui
uma ocorrncia em uma de suas entidades especializadas. Esse tipo de especializao/
generalizao simbolizado por um p junto ao tringulo isscele, que representa o relacionamento (generalizao/especializao) entre as entidades. A figura 2.25 apresenta um
exemplo desse tipo.
tipoFuncionario

FUNCIONRIO
P

necessrio em
especializao
parcial
MOTORISTA

indica que nem todo


FUNCIONRIO
MOTORISTA ou
SECRETRIA

SECRETRIA

Especializao Exclusiva (x)


Na generalizao/especializao Exclusiva, uma ocorrncia de entidade genrica especializada no mximo uma vez. Essa relao representada pela notao utilizada na generalizao/especializao total ou parcial, no sendo possvel a ocorrncia de mais de uma
instncia de entidade especializada para uma entidade genrica, conforme ilustrado nas
figuras 2.24 e 2.25.

Modelagem de Bancos de Dados

Compartilhada (c) ou No Exclusiva

30

Na generalizao/especializao Compartilhada, uma ocorrncia da entidade genrica pode


aparecer em vrias de suas entidades especializadas. Esse tipo de especializao/generalizao simbolizado por um c junto ao tringulo isscele que representa o relacionamento
(generalizao/especializao) entre as entidades. A figura 2.26 trs um exemplo desse tipo.

Figura 2.24
Exemplo de
generalizao/
especializao
parcial.

Pode no aparecer o c.
Em outra notao:
(o)-override, sobreposio

PESSOA

indica que uma instncia


de PESSOA pode aparecer
em mais de uma de suas
especializaes

Figura 2.25
Exemplo de
generalizao/
especializao
compartilhada.

PROFESSOR

FUNCIONRIO

ALUNO

De forma resumida, os diferentes tipos de generalizao/especializao so apresentados


na tabela da figura 2.27, onde as combinaes de tipos de entidades so feitas utilizando as
letras que as identificam no DER.

Figura 2.26
Tipos de
generalizao/
especializao.

Total (t)

Parcial (p)

Exclusiva (x)

xt

xp

Compartilhada (c)

ct

cp

Entidade associativa
A entidade associativa nada mais do que a redefinio de um relacionamento que passa a
ser tratado como se fosse uma entidade.
Vale lembrar que na definio do modelo ER no foi prevista a possibilidade de se estabelecer relacionamentos entre relacionamentos, mas apenas entre entidades. Por outro lado,
existem situaes onde parece ser necessrio associar uma entidade com a ocorrncia de
um relacionamento. Nesses casos, deve-se tratar esse relacionamento como se ele fosse
uma entidade (entidade associativa). A notao utilizada para tanto colocar um retngulo
em torno do relacionamento (losango), conforme pode ser visto na figura 2.28.

CONSULTA

(0,n)
Poderia ser um atributo
multivalorado no
relacionamento. Porm, se
necessrio ter o registro
correto do medicamento,
representar em outra entidade

(1,n)

PACIENTE

entidade
associativa

(1,1)
relPacCons

prescrio
(0,n)
MEDICAMENTO

entidade associativa
Figura 2.27
Exemplo de
entidade
associativa.

(0,n)

MDICO
CRM

nome

CONSULTA

data
hora

(0,n)

PACIENTE
cdigo

nome

Outra soluo possvel, demonstrada na figura 2.29, a substituio do relacionamento por


uma entidade (caso no se deseje utilizar o conceito de entidade associativa).

Captulo 2 - Modelo conceitual: DER

(1,n)

MDICO

31

MDICO

PACIENTE

(1,1)

(1,1)
(1,n)

relMedCons

(1,n)

CONSULTA

relPacCons

(0,n)
prescrio
(0,n)

Figura 2.28
Exemplo de
substituio de
relacionamento por
entidade.

MEDICAMENTO

Outro exemplo: adicionar a informao de que itens (quantidade, valor pago,...) de produto
foram vendidos em uma venda. Entidade fraca N:N
ItemNota
CLIENTE

(1,1)

DeUm

bairro
logradouro
nmero

endereo
nome
cdigo
CLIENTE
codigo
nome
endereco
telefone

(0,n)

faz

NOTA
data
nmero

PEDIDO
numero
nmero
dataPed
total

(0,n)

(1,n)

CONTM

quantidadeVendida
preo
quantidadeEstoque
descrio
cdigo

PEDIDO_has_PRODUTO

contm

quantItem
vlrItem

PRODUTO

Um

Dados Temporais
Um modelo deve se ocupar em refletir o aspecto temporal dos dados e informaes que
nele esto sendo modelados. No existe uma regra geral de como proceder nesse caso, mas
possvel identificar alguns padres que se repetem, indicando uma possvel necessidade
de armazenamento temporal de dados e informaes. De um modo geral, dados temporais
tm as seguintes caractersticas:
11 So dados que mudam ao longo do tempo.
Modelagem de Bancos de Dados

22 Atributos cujos valores modificam ao longo do tempo;

32

22 Relacionamentos que modificam ao longo do tempo.


11 So dados para os quais deve-se manter um histrico (motivos legais, auditorias,
tomada deciso atravs de srie temporal etc.).
22 Atributo de status (ativo/inativo);
22 desova do BD (expurgo).
Na figura 2.30, apresentamos alguns exemplos de dados temporais.

PRODUTO

codigo
descricao
quantidade
precoVenda
Figura 2.29
Outro exemplo de
substituio de
relacionamento por
entidade.

EMPREGADO

EMPREGADO

(1,1)

(0,n)

SALRIO

salrio

data

(a) BD contm apenas o salrio atual

(b) BD contm o histrico de salrios

EMPREGADO

EMPREGADO

(0,1)

alocao
data

(0,1)

(0,n)

MESA

Relacionamento
com identicador
(ponto no tempo
ou faixa de tempo)

MESA
(b) BD contm o histrico de alocaes

Normalizao
Em geral, a fonte de informaes para anlise e posterior construo do DER o Minimundo
produzido durante a anlise de requisitos do sistema. Porm, os dados que sero analisados
como ponto de partida para o DER podem estar armazenados em outras fontes de informao, como sistemas legados em bancos no relacionais, ou mesmo em bancos de dados
relacionais, mas sem documentao.
Em uma situao como essa interessante analisar os dados existentes arquivos, tabelas
e/ou formulrios, e tentar construir o modelo conceitual (DER) correspondente. A motivao
para isso no somente gerar um modelo que possa auxiliar a compreender e documentar
o sistema, mas principalmente identificar problemas de desempenho e integridade e, assim,
facilitar a manuteno e evoluo do banco de dados e dos sistemas que dele fazem uso.
A Normalizao a tcnica que foi concebida para ser utilizada justamente em situaes como
essas. Ressaltamos que o processo de normalizao pode ser executado sobre qualquer
tipo de representao de dados: arquivo de computador, leiaute de relatrio/formulrio ou
mesmo de uma tela.
Tomando como base um formulrio qualquer, mas que contenha um grande nmero de
campos, seria at possvel pensar em colocar todos os dados do formulrio em uma nica
grande tabela. Muito provavelmente, contudo, essa abordagem resultar em problemas de
redundncia de dados, que por sua vez implicam na gerao de inconsistncias nos valores
dos dados e tambm no desperdcio de espao para armazenamento dos dados. Isso tudo
acaba aumentando o tempo necessrio para realizar a busca por informaes.
Esses mesmos problemas podem j existir em dados armazenados em sistemas antigos,
produzidos sem mais preocupaes em relao performance ou espao de armazenamento.
Mas o mais comum que a demanda por novas funcionalidades acabe exigindo ajustes na
estrutura do banco de dados que podem resultar em problemas como os recm-relatados.
Assim, preciso buscar desmembrar as informaes e distribu-las em tabelas menores, analisando as interdependncias entre atributos individuais associados a cada uma dessas tabelas.

Captulo 2 - Modelo conceitual: DER

Figura 2.30
Modelagem de
dados temporais
no DER.

Ponto no tempo
ou faixa (intervalo)
de tempo

(0,n)

alocao

(a) BD contm apenas a alocao atual

valor

33

Ou seja, o processo de normalizao pode ser entendido como um conjunto de regras que
visa minimizar as anomalias em torno da modificao dos dados de modo que seja mais fcil
manipular esses dados (manuteno do sistema) sem gerar redundncias ou inconsistncias.
Resumidamente:

Por que normalizar?


11 Minimizao de redundncias e inconsistncias;
11 Facilidade de manipulaes do Banco de Dados;
11 Facilidade de manuteno do Sistema de Informaes.

No custa lembrar que a normalizao aplicada em sistemas pr-existentes (sejam eles j


computadorizados ou no). Para sistemas novos, um projeto bom e bem elaborado de um
modelo conceitual resultar em bancos de dados que j esto normalizados ou que podem
ser facilmente normalizados.
De qualquer modo, analisaremos a seguir as etapas de um processo de normalizao.

Etapas normalizao
A figura 2.32 trs um esquema descrevendo as diferentes etapas de um processo de normalizao.
Etapas:
Esquema na 3FN

Passagem a 3FN

Passagem a 4FN

2 . aplicar formas normais

Esquema na 2FN

Esquema relacional
normalizado

Passagem a 2FN

Esquema de arquivo
ou documento

1. tabela no normalizada

Representao
como tabela N

Esquema na 1FN

Passagem a 1FN
Esquema no
normalizado

um processo cclico, que deve ser usado sempre que um sistema precisa passar por um
processo de manuteno.
O Passo 1 se inicia pela representao da descrio de cada arquivo ou documento existente
na forma de um esquema de uma tabela relacional no normalizada (N). O segundo passo
Modelagem de Bancos de Dados

aplicar o processo de normalizao a esse esquema de tabela no normalizada

34

Tabela no normalizada
Uma tabela no normalizada (N) um conjunto de dados no seu formato original, que
transposto para uma tabela relacional de uma forma direta, sem ainda nenhuma preocupao com questes de redundncia ou performance. Assim, na figura 2.33 temos um
exemplo que ilustra uma tabela N.

Figura 2.31
Etapas do processo
de normalizao.

RELATRIO DE ALOCAO A PROJETO


CDIGO DO PROJETO: LSC001

TIPO: Novo Desenv.

DESCRIO: Sistema de Estoque


CDIGO DO
EMPREGADO

NOME

CATEGORIA
FUNCIONAL

SALRIO

DATA DE INCIO
NO PROJETO

TEMPO ALOCADO
AO PROJETO

2146

Joo

A1

1/11/91

24

3145

Slvio

A2

2/10/91

24

6126

Jos

B1

3/10/92

18

1214

Carlos

A2

4/10/92

18

8191

Mrio

A1

1/11/92

12

CDIGO DO PROJETO: PAG02

TIPO: Manuteno

DESCRIO: Sistema de RH
CDIGO DO
EMPREGADO

NOME

CATEGORIA
FUNCIONAL

SALRIO

DATA DE INCIO
NO PROJETO

TEMPO ALOCADO
AO PROJETO

8191

Mrio

A1

1/05/93

12

4112

Joo

A2

4/01/91

24

6126

Jos

B1

1/11/92

12

Cdproj

LSC001

PAG02

Ao fazer a transposio do conjunto de dados para uma tabela relacional, tomando como
base o conjunto da figura 2.33, chegamos ao resultando apresentado na figura 2.34. Notem
que temos a tabela relacional e tambm uma descrio textual dessa mesma tabela.

Tipo

Descr

Novo
Desenvolvimento

Manuteno

Figura 2.33
Tabela PROJETO
representada de
duas maneiras.

Sistema de Estoque

Sistema de RH

Emp
CodEmp

Nome

Cat

Sal

DataIni

TempAl

2146

Joo

A1

01/11/91

24

3145

Slvio

A2

02/10/91

24

6126

Jos

B1

03/10/92

18

1214

Carlos

A2

04/10/92

18

8191

Mrio

A1

01/11/92

12

8191

Mrio

A1

01/05/93

12

4112

joo

A2

04/01/91

24

6126

Jos

B1

01/11/92

12

PROJETO (@cosProj, descrio, tipo,


@codEmp, nome, cat, sal, dtlni, tAloc)
)

Captulo 2 - Modelo conceitual: DER

Figura 2.32
Exemplo de tabela
no normalizada.

35

Vejam que a tabela Projeto, no normalizada (N), possui uma tabela aninhada dentro de si.
Uma tabela aninhada uma tabela que aparece como valor de campo dentro de
outra tabela, condio que precisa ser ajustada.

Primeira forma normal (1FN)


A passagem para a 1FN pode ser feita pelo processo de decomposio de tabelas, levando-se
em considerao os seguintes passos:
1. Criar uma tabela na 1FN que se refere a tabela no normalizada e que contm apenas as
colunas com valores atmicos, sem as colunas de tabelas aninhadas
2. Criar uma tabela na 1FN para cada tabela aninhada, identificada na forma N, com as
seguintes colunas:
2.1.A chave primria de cada uma das tabelas nas quais a tabela em questo est aninhada
2.2.As colunas da prpria tabela aninhada.
3. Identificar as chaves primrias das tabelas na 1FN que correspondem a tabelas aninhadas.
A figura 2.35 trs uma descrio da primeira forma normal (1FN), bem como a ilustrao da
transposio N > 1FN.
primeira forma normal (1FN)
=
Diz-se que uma tabela est na primeira forma
normal, quando ela no contm tabelas aninhadas
Passagem primeira forma normal (1FN).

N:

Tabela de nvel mais externo:


basta transcrever a chave primria

(@CodProj, Tipo, Descr,


(@CodEmp, Nome, Cat, Sal, DataIni, TempAl))

1FN:

Tabela de nvel mais interno:


Se h repeties distintas, basta acrescentar
a chave primria da tabela aninhada

(@CodProj, Tipo, Descr,

Modelagem de Bancos de Dados

(@CodProj, @CodEmp, Nome, Cat, Sal, DataIni, TempAl))

36

Dependncia funcional
Antes de passarmos para as etapas seguintes do processo de normalizao, fundamental
compreender o conceito de dependncia funcional.
Um atributo ou conjunto de atributos A dependente funcional de outro atributo B da
mesma tabela, se a cada valor de B existir, nas linhas da tabela em que aparece, um nico
valor de A. Assim, A depende funcionalmente de B. A figura 2.36 trs um exemplo de uma
dependncia funcional.

Figura 2.34
Forma N
para 1FN.

B Cdigo

...

A Salrio

...

...

E1

...

10

...

...

E3

...

10

...

...

E1

...

10

...

...

E2

...

...

...

E3

...

10

...

...

E2

...

...

...

E1

...

10

...

Salrio depende funcionalmente do cdigo do empregado.


Cdigo Salrio
Na ocorrncia de chave primria concatenada (mais de um atributo), a Dependncia

Funcional pode ser:


11 Total: a cada valor completo da chave, est associado um valor de atributo;
11 Parcial: quando o valor do atributo depende de parte da chave.
22 Observar cada entidade ou tabela com chave primria concatenada e analisar se
existe algum atributo (ou conjunto de atributos) com dependncia parcial.

Segunda forma normal (2FN)


Uma entidade encontra-se na 2FN, quando, alm de encontrar-se na 1FN, cada uma de suas
colunas que no so chave dependem da chave primria completa. Veja que toda tabela na
1FN que possui apenas uma coluna como chave primria j est na 2FN.

Os passos para se chegar a 2FN so:


1. Copiar para a 2FN cada tabela que tenha chave primria simples.
2. Para cada tabela com chave primria composta, considerando as colunas que no so parte
da chave, fazer a pergunta: A coluna depende de toda a chave ou de apenas parte dela?
22 Se sim, as colunas permanecem na tabela original;
22 Se no, criar outra tabela na 2FN com parte da chave e as colunas da qual dependem.
Na figura 2.37, apresentamos um exemplo de normalizao da 1FN para a 2FN.

Captulo 2 - Modelo conceitual: DER

Figura 2.35
Processo de
identificao de
dependncia
funcional entre
atributos.

...

37

segunda forma normal (2FN)


=
Uma tabela encontra-se na segunda forma normal,
quando, alm de estar na 1FN, no contm dependncias parciais

1FN:
ProjEmp

(@CodProj, @CodEmp, Nome, Cat, Sal, DataIni, TempAl)

1FN:
Proj (@CodProj, Tipo,Descr)
ProjEmp (@CodProj, @CodEmp, Nome, Cat, Sal, DataIni, TempAl))

2FN:
Proj (@CodProj, Tipo,Descr)
ProjEmp (@CodProj, @CodEmp, DataIni, TempAl)
Emp (@CodEmp, Nome, Cat, Sal)

Terceira forma normal (3FN)


Uma tabela encontra-se na 3FN quando, alm de estar na 2FN, toda coluna no chave
depende diretamente da chave primria, isto , quando no h dependncias funcionais
transitivas ou indiretas.
Uma dependncia funcional transitiva ou indireta acontece quando uma coluna no chave primria depende funcionalmente de outra coluna ou combinao de colunas no chave primria.
Assim, para chegar a 3FN, preciso eliminar as dependncias transitivas. Isso feito da
seguinte forma:
1. Colunas que dependem da chave primria permanecem na tabela original.
2. Colunas que dependem de coluna no chave vo para outra tabela.

Modelagem de Bancos de Dados

Na figura 2.38, apresentamos a transformao da 2FN para 3FN.

38

Figura 2.36
Da 1FN para 2FN.

terceira forma normal (3FN)


terceira forma normal (3FN)
=
=
Uma
tabela encontra-se
na terceira
Uma tabela encontra-se
na terceira
forma normal,
quando,forma normal, quando,
almcontm
de estar
na 2FN, notransitivas
contm dependncias transitivas
alm de estar na 2FN, no
dependncias

2FN:

2FN:

Proj (@CodProj, Tipo,Descr)


Proj (@CodProj, Tipo,Descr)
ProjEmp
(@CodProj,
ProjEmp (@CodProj,
@CodEmp,
DataIni,@CodEmp,
TempAl) DataIni, TempAl)
Emp Cat,
(@CodEmp,
Emp (@CodEmp, Nome,
Sal) Nome, Cat, Sal)

3FN:

3FN:

Proj (@CodProj, Tipo,Descr)


Proj (@CodProj, Tipo,Descr)
ProjEmp
(@CodProj,
ProjEmp (@CodProj,
@CodEmp,
DataIni,@CodEmp,
TempAl) DataIni, TempAl)
Emp Cat)
(@CodEmp, Nome, Cat)
Emp (@CodEmp, Nome,
Cat
(@Cat, sal)
Cat (@Cat, sal)
(1,1)

Figura 2.37
Da 2FN para 3FN.

(1,n) (1,1) possui


(1,n) (1,n) PROJ-EMP
(1,1) (1,n) alocado
(1,n) (1,1)
(1,1) (1,n)
possuiPROJ
PROJ-EMP
alocado
CAT tem
EMP
tem EMP

(1,1)

Quarta forma normal (4FN)


Para a maioria dos documentos e arquivos, a decomposio at a 3FN suficiente para
obter o esquema de um BD. Por outro lado, na literatura ainda encontramos a forma normal
de Boyce/Code, que na verdade equivale a 4NF e 5FN.
Uma tabela estar na 4FN quando, alm de estar na 3FN, no possuir mais que uma
dependncia funcional multivalorada. Em outras palavras, uma coluna ou conjunto de
colunas dependem multivaloradamente de uma coluna determinante da mesma tabela
quando um valor do atributo determinante identifica repetidas vezes um conjunto de
valores na coluna dependente.
Para se chegar a 4FN, necessrio eliminar as dependncias multivaloradas, o que equivale
dizer que devemos eliminar eventuais relacionamentos ternrios existentes no modelo.
A figura 2.39 traz um exemplo disso.

Captulo 2 - Modelo conceitual: DER

PROJ

39

CAT

quarta forma normal (3FN)


=
Uma tabela encontra-se na quarta forma normal, quando,
alm de estar na 3FN, no contm dependncias multivaloradas
Dependncia multivalorada
=
Uma dependncia multivalorada ocorre quando um valor do
atributo determinante identica repetidas vezes um conjunto
de valores na coluna dependente

3FN:
Util (@Codproj, @CodEmp, @CodEquip)

4FN:
ProjEmp (@CodProj, @CodEmp)
ProjEquip (@CodProj, @CodEquip)

O processo de refinamento pode continuar com a 5FN, mas na prtica os ganhos alcanados
desse ponto em diante no justificam o trabalho envolvido. Para quem tiver interesse em
conhecer a 5FN, sugerimos consultar o livro Projeto e modelagem de banco de dados, de Toby
Teorey, Sam Lightstone e Tom Nadeau, da editora Elsevier.

Exerccios de Fixao e
Refinamento do Modelo Conceitual - DER
Descreva com suas palavras. Por que devemos nos preocupar com a Normalizao no pro-

Modelagem de Bancos de Dados

cesso de desenvolvimento de sistemas?

40

Figura 2.38
Da 3FN para 4FN.

3
Conhecer um conjunto de regras que auxiliam no processo de converso do modelo
conceitual em Modelo Lgico.

tupla; chave primria; esquema.

conceitos

Modelo Lgico; relaes e restries (de chaves e domnio); atributo multivalorado;

O Modelo Lgico representa o banco de dados como uma coleo de relaes. Informalmente,
cada relao se parece com uma tabela. Dessa forma, podemos utilizar esse modelo para
representar a estrutura de um Banco de Dados Relacional dentro de um SGDB(R).
Deve-se, portanto, construir o modelo lgico tomando como base o modelo conceitual que
idealmente j ter sido validado pelos futuros usurios do sistema e demais atores envolvidos.
Por outro lado, ainda que no seja uma prtica recomendada, sabemos que alguns desenvolvedores preferem pular a etapa de elaborao do modelo conceitual. Nesse caso, no
haver um modelo conceitual para servir de base para a elaborao do modelo lgico. Mais
do que isso, algumas decises de modelagem no tero ainda surgido, e o profissional
pouco experiente poder ser confrontado com situaes que costumam gerar dvidas.
Por conta disso, antes de passarmos a tratar diretamente do modelo lgico, vamos revisitar
questes comuns que se colocam a todos os envolvidos com o processo de modelagem de
um sistema de informaes.

Decises sobre o modelo


Somente entidade tem atributos?
Conforme j mencionado anteriormente, nada impede que um relacionamento tenha atributos. Por outro lado, em vez de desenvolver o modelo desse modo, uma alternativa que
deve ser considerada a criao de uma entidade associativa. A figura 3.1 a seguir traz um
exemplo como este:
11 Empregado trabalhaEm Projeto (numHoras);
11 NotaFiscal contmItensDe Produto (quant, preoUnit).

Captulo 3 - O Modelo Lgico

objetivos

O Modelo Lgico

41

entidade associativa
(0,n)

MDICO
CRM

(0,n)

CONSULTA

data
hora

nome

PACIENTE

cdigo

nome

Figura 3.1
Deciso de se
utilizar entidade
associativa.

Atributo multivalorado?
Tambm possvel desenvolver um modelo onde uma ou mais entidades tenham atributos
multivalorados. Mas o mais apropriado, especialmente quando a quantidade de ocorrncias
desse atributo no for muito grande, preferir a criao de uma entidade relacionada para
armazenar tais atributos. Na figura 3.2, temos mais de um exemplo desse tipo.
11 Cliente com vrios Telefones;
11 Departamento em vrias Localizaes.

CLIENTE

cdigo
nome
cdigo

(1,n)

nome
foneres
fonecel
fonecom

CLIENTE

possui
(0,n)
TELEFONE

Figura 3.2
Deciso entre
entidade
ou atributo
multivalorado.

nmero

Quando transformar um atributo em entidade?


Determinados atributos de uma entidade podem ser modelados como uma entidade autnoma relacionada a essa entidade. Conforme o profissional vai ganhando experincia, essa
deciso torna-se cada vez mais fcil e automtica. Mas para quem ainda est comeando, a
tabela na figura 3.3 pode ser uma boa referncia.

FILME

Modelagem de Bancos de Dados

cdigo

42

FILME

ttulo
(0,n)

cdigo
ttulo
gnero

identicador
eClassicadoEm

(1,1)

descrio
GNERO

Situaes a considerar

Uso

Se este atributo est vinculado a


outros objetos no diagrama

Entidade

Desempenho de buscas

Atributo

Integridade da informao

Entidade

Custo de armazenamento

Entidade
Figura 3.3
Quando
transformar
um atributo em
entidade?

Relacionamentos
As recomendaes que devem ser observadas na modelagem de relacionamentos so as
seguintes:

11 N:N: transformar em entidade associativa;


11 1:1: em dependncia obrigatria/total com cardinalidade mnima 1, optar por:
22 Substituir por uma nica entidade;
22 Criar uma entidade associativa (histrico).
Outro ponto que deve ser observado, j pensando no modelo lgico, utilizar somente

relacionamentos binrios entre as entidades do seu modelo. Assim, caso se depare com um
relacionamento ternrio, a recomendao utilizar uma entidade associativa, conforme
podemos observamos na figura 3.4:

CIDADE

DISTRIBUIDOR
DISTRIBUIO

(0,n)

(1,1)

distribuio
Figura 3.4
Converso de
relacionamento
ternrio em
entidade
associativa.

(0,n)
PRODUTO

J no caso de autorrelacionamentos (relacionamento unrio) existem duas opes para


manter apenas relacionamentos binrios, conforme pode ser visto na figura 3.5.
11 Criao de entidade representativa do papel;
11 Uso de generalizao ou especializao (EER).

CPF

PESSOA

(1,1)

possui

(0,1)

(0,1) marido

eCasadaCom

(0,1) esposa
PESSOA

nome

CASAMENTO

cnjugeMarido
cnjugeEsposa

MARIDO

atributoEspeccoMarido
Figura 3.5
Transformando
relacionamento
unrio em binrio.

CPF
nome

ESPOSA

atributoEspeccoEsposa

Uma ltima dica sobre a modelagem de relacionamentos se refere a entidades que possuem
atributos particulares e que devem ser modelados atravs de genespec (EER). Exemplos
dessa situao quando temos de colocar no modelo tanto carros como motos, ambos
veculos automotores mas com caractersticas especficas. Um outro exemplo muito comum
a modelagem de pessoa fsica versus pessoa jurdica. Isso pode ser melhor entendido
atravs da figura 3.6.

Captulo 3 - O Modelo Lgico

PESSOA

43

cdigo
nome

PESSOA
feitaPara

FISICA

casadaCom

nmero
data
valor

VENDA

(1,1)

(1,1)
JURDICA

(1,n)

(0,n)

tem

(1,1)

PROFISSO

(0,1)
CNPJ

CPF

idprof

descrio

Figura 3.6
Exemplo de
modelagem de
atributos opcionais
de entidades com
EER.

Coleo de Relaes
Conforme j foi mencionado no incio desta sesso, o Modelo Lgico representa o banco de
dados como uma coleo de relaes (tabelas), se aproximando da estrutura que o banco de
dados ter em um SGBD(R).
A base matemtica se traduz pelo uso da teoria de conjuntos e da lgica de predicados de primeira ordem. Assim, uma tabela um conjunto de tuplas, sendo cada tupla entendida como
uma instncia de uma entidade. Outro ponto a ser observado que todas as tuplas em uma
relao so distintas (chave primria). A figura 3.7 refora os conceitos acima descritos.
11 Uma tabela um conjunto de tuplas;

11 Tupla: cada instncia de uma entidade;

Saiba mais

11 todas as tuplas em uma relao so distintas (chave primria).

Esse modelo foi


proposto em 1970
por Ted Codd, sendo
rapidamente aceito em
funo de sua simplicidade e, ao mesmo
tempo, base matemtica (relaes e teoria
de conjuntos).

CATEGORIA

PRODUTO

Figura 3.7
Ocorrncia de
tuplas em uma
tabela.

Outra forma de representar as tabelas que aparecem na figura 3.7, e que j foi utilizada
na sesso anterior, a notao descritiva que aparece na figura 3.8. Essa figura ajuda a
Modelagem de Bancos de Dados

entender os conceitos de Esquema de Relao e Esquema de Banco de Dados.

Esquema de Relao:

R(A1, A2,..., An)


Esquema de um Banco de Dados:

S = {R1, R2,..., Rm} + conjunto RI


Categoria (@codCat, descrCat)
Produto (@codProd, descrProd, precoProd, codCat)
Chave primria: @, Chave estrangeira: sublinhando, Domnio: no Dicionrio de Dados

44

Figura 3.8
Esquema de
Relao.

O Esquema de Relao descrito pela notao R(A1, A2,..., An), onde R o nome da relao
(entidade derivada do DER) e Ai cada um de seus atributos. Assim, podemos entender R
como sendo igual a Categoria, composta, respectivamente, pelos atributos A1 = @codCat e
A 2 = descrCat.
O esquema de relao pode ser interpretado como uma declarao ou um tipo de assero.
Por exemplo, o esquema da relao Categoria declara que, em geral, uma entidade categoria
tem um cdigo e sua descrio. Cada tupla na relao pode ser interpretada como um fato
ou uma instncia em particular da assero.
J o Esquema de Banco de Dados representado por um conjunto de esquemas de relao
atravs da notao S = {R1, R2,..., Rm}. No exemplo da figura 3.8, o banco de dados em
questo composto pelas relaes R1 = Categoria e R 2 = Produto.
A figura 3.8 faz meno tambm a um conjunto RI. Vejam que o esquema de banco de dados
utilizado para verificao do estado de um banco de dados relacional de esquema S, se
preocupando em verificar se os estados de uma determinada relao satisfazem s restries de integridade especificadas no conjunto RI. Dessa forma, um estado de um banco de
dados que no obedece a todas as restries de integridade chamado de estado invlido, e
um estado que satisfaz todas as restries em RI conhecido com estado vlido.

Restries de Integridade
O Modelo lgico, em funo de sua base matemtica, deve observar as seguintes restries
de integridade:
11 Restrio de Chave:

22 Chave primria (@Primary Key);


11 Restrio de Integridade Referencial:
22 Chave estrangeira (Foreign Key);
11 Restrio de Domnio:
22 Tipo do dado: representado no Dicionrio de Dados.
A Restrio de Chave preconiza que o valor de cada chave primria deve ser nico para
todas as tuplas de qualquer relao do esquema (e no podem receber valor nulo). Essa
restrio garante a identificao unvoca de cada tupla em uma relao.
A Restrio de Integridade Referencial faz uso das chaves estrangeiras, j que demanda que
uma tupla de uma relao que se refere a outra relao deve sempre se referir a uma tupla
existente naquela outra relao. Essa restrio classificada entre duas relaes e usada
para manter a consistncia entre as tuplas nas duas relaes.
Finalmente, a Restrio de Domnio demandada especifica que, dentro de cada tupla, o valor

nmeros reais, caracteres, booleanos, datas, horas, timestamp e, em alguns casos, os tipos
de dados de moeda.

Captulo 3 - O Modelo Lgico

de cada atributo A deve ser um valor atmico do domnio dom(A). Os tipos de dados associados aos domnios incluem os tipos de dados numricos para representao de inteiros e

45

Modelo Conceitual (DER) x Modelo Lgico


A construo do esquema de banco de dados deve ser orientada por um conjunto de regras
de auxiliam no mapeamento do Modelo Conceitual (DER) para o Modelo Lgico, mais prximo
da estrutura do banco de dados em um SGBD(R). Esse desafio resumido pela figura 3.9.

PRODUTO

(1,n)

(1,1)

possui

CATEGORIA

DER
preo
descrio
cdigo

Lgico

descrio
cdigo

PRODUTO

CATEGORIA

codProd: Inteiro
(1,n)
descrProd: Texto (30)
preo: Real
codCat: Inteiro

codCat: Inteiro
descrProd: Texto (20)
(1,1)

Categoria (@codCat, descrCat)


Produto (@codProd, descrProd, precoProd, codCat)

Figura 3.9
Converso para
modelo lgico.

Chave primria: @, Chave estrangeira: sublinhando, Domnio: no Dicionrio de Dados

Nesse processo, vamos usar as seguintes regras para converso dos construtores

bsicos do modelo ER em relaes:


11 Entidades e atributos;
11 Relacionamentos binrios (1:1, 1:N, N:N);
11 Relacionamento n-rio;
11 Relacionamento Unrio ou recursivo;
11 Generalizao ou especializao;
11 Atributo multivalorado.
Cada uma dessas regras ser explorada em maior detalhe a seguir. Aps a aplicao de
todas as regras propostas por esse mapeamento teremos, ento, a especificao do banco
de dados. A figura 3.10 trs, como exemplo, o resultado da aplicao das regras acima na
converso de um DER para um conjunto de relaes.

Modelagem de Bancos de Dados

CLIENTE

46

(1,1)

telefone
endereo
nome
cdigo

faz

(1,n)

PEDIDO
total
data
nmero

CLIENTE (@codCli, nomeCli, enderCli, foneCli)


PEDIDO (@numPed, codCli, dataPed, totalPed)
PRODUTO (@codProd, descProd, quantProd, precoVendaProd)
ITEM_PEDIDO (@numPed, @codProd, quantItem, vlrItem)

(0,n)

contem

vlrItem
quantItem

Figura 3.10
Exemplo do uso
das Regras de
Mapeamento.

(1,n)

PRODUTO

preo
quantidade
descrio
cdigo

Entidades e atributos
Essa regra deve ser aplicada para cada entidade no DER.
A primeira providncia para uma entidade forte E criar um esquema de relao R que
inclua todos os atributos de E. Em seguida, escolha um dos atributos identificadores de E
como chave primria de R. A aplicao dessa regra demonstrada na figura 3.11, inclusive a
preocupao com a eventual decomposio de atributos compostos.
Pnome

Nss

Mnome

Snome

Nome

Endereo
Sexo

Salrio

EMPREGADO
DataNasc

Figura 3.11
Regra Entidades
(Fortes) e Atributos.

Exemplo:
EMPREGADO (@SSN, pNome, inicialM, uNome, sexoEmp, endereo, salrio, dataNascEmp)
J para cada entidade fraca F no DER, a mesma providncia inicial deve ser tomada: crie
um esquema de relao R que inclua todos os atributos F. Em seguida, inclua como chave
estrangeira de R os atributos que formam a chave primria do esquema de relao associada entidade forte E de F. A chave primria de R ser a combinao da chave primria de
E com a chave parcial de F. Isso melhor ilustrado na figura 3.12.

DEPENDENTE
Nome

DataNasc

Relao

Exemplo:
EMPREGADO (@SSN, pNome, inicialM, uNome, sexoEmp, endereo, salrio, dataNascEmp)
DEPENDENTE (@SSN, @Nome, SexoDep, dataNascDep, parentesco)

Relacionamentos binrios
A regra para a converso de Relacionamentos binrios tem variaes para cada uma das
possibilidades: 1:1, 1:N e N:M.
Para os relacionamentos 1:1, preciso inicialmente identificar os esquemas de relao S e T
que dele participam. Esses devem ser combinados em uma s relao, mas no sem antes
verificar se so concebidos separadamente no ambiente de negcio ou se h cardinalidade
mnima zero. Isso evitar desperdcio de espao. Outra alternativa escolher um dos relacionamentos, digamos S, e nele incluir como chave estrangeira a chave primria de T
(se houver atributos simples no relacionamento, inclua-os como atributos de S).
A figura 3.13 ilustra a aplicao dessa regra.

Captulo 3 - O Modelo Lgico

Figura 3.12
Regra Entidades
(Fracas) e Atributos.

Sexo

47

EMPREGADO

NmeroDeEmpregados

DataInicio
1

DEPARTAMENTO

GERENCIA

Exemplo:
EMPREGADO (@SSN, pNome, inicialM, uNome, sexoEmp, endereo, salrio, dataNascEmp)
DEPARTAMENTO (@NmDepto, nomeDepto, numEmp, SSNChefe, dataIncio)

Figura 3.13
Regra
Relacionamentos
binrios (1:1).

J para o caso de relacionamentos 1:N, preciso identificar o esquema de relao S que


representa o tipo de entidade do lado n do relacionamento. Feito isso, inclua como chave
estrangeira de S a chave primria do esquema T que representa o outro tipo de entidade
(do lado 1). Se houver atributos simples no relacionamento, inclua-os como atributos de S.
A figura 3.14 exemplifica essa converso.
Nome

Endereo
Sexo

Salrio

Figura 3.14
Regra
Relacionamentos
binrios (1:N).

Nome
N

TRABALHA PARA

NmeroDeEmpregados

EMPREGADO

DEPARTAMENTO

Exemplo:
EMPREGADO (@SSN, pNome, inicialM, uNome, sexoEmp, endereo, salrio, dataNascEmp, NmeroDepto)
DEPARTAMENTO (@NmDepto, nomeDepto, numEmp, SSNChefe, dataIncio)
Por fim, ao lidar com relacionamentos N:N, o passo inicial criar um novo esquema de relao
S para represent-lo. A chave estrangeira de S ser composta pelas chaves primrias dos
esquemas de relaes que representam os tipos de entidade participantes no relacionamento
N:N. Se houver atributos simples no relacionamento, inclua-os como atributos de S. Tenha
em mente que podem no existir relacionamentos N:N no DER se foram utilizadas entidades
associativas. Por isso que se recomenda seu uso, deixando o DER mais prximo do futuro
modelo conceitual. De qualquer modo, a figura 3.15 traz um exemplo da aplicao dessa regra.

EMPREGADO

DataInicio
1

NmeroDeEmpregados
1

GERENCIA

Figura 3.15
Regra
Relacionamentos
binrios (N:N).

DEPARTAMENTO
1

CONTROLA

Modelagem de Bancos de Dados

Horas

48

TRABALHA EM

PROJETO

Exemplo:
EMPREGADO (@SSN, pNome, inicialM, uNome, sexoEmp, endereo, salrio, dataNascEmp, NmeroDepto)
PROJETO (@NumProj, NomeProj, Localizao)
TRABALHA_EM (@SSN, @NumProj, Horas)

Relacionamento n-rio, onde n > 2


Relacionamentos maiores do que relacionamentos binrios devem ser convertidos atravs
da criao de um novo esquema de relao S para represent-los. A chave estrangeira dessa
nova relao S ser composta pelas chaves primrias de todas as entidades que participam
do relacionamento original. Se houver atributos simples nos relacionamentos, inclua-os
como atributos de S. Mais uma vez, podero no existir relacionamentos desse tipo no DER,
especialmente se foram utilizadas entidades associativas ou se o modelo conceitual tiver
passado por um processo de normalizao. A figura 3.16 apresenta um exemplo da aplicao da regra acima.
DISTRIBUIDOR

CIDADE
N

DISTRIBUIO
N

PRODUTO

Exemplo:
DISTRIBUIO (@codDist, @codCid, @codProd, ... )

Relacionamento unrio (ou recursivo)


Essa regra admite trs alternativas de converso:

11 Criar um novo atributo para representar o papel no relacionamento (1:1).


22 Pessoa casada com Pessoa-cnjuge.
11 Criar um novo esquema para representar o relacionamento(1:N).
22 Vendedor gerente de Vendedor: relao Gerncia (numGerente, numGerenciado)
Partir para uma generalizao ou especializao (quando existem atributos diferentes a
serem considerados), seguindo a prxima regra.
A primeira alternativa criar um novo atributo no esquema de relao S para representar o
papel no relacionamento. o mais recomendado quando o relacionamento recursivo 1:1.
A segunda alternativa, mais recomendada para relacionamentos 1:N, criar um novo
esquema de relao S para representar o relacionamento. preciso verificar a cardinalidade
do relacionamento e seguir como definido para relacionamentos binrios.
A terceira e ltima alternativa partir para uma generalizao ou especializao, em geral
quando existem atributos diferentes a serem considerados. Nesse caso, deve-se seguir a
prxima regra, que trata de generalizaes e especializaes.
De qualquer modo, na figura 3.17 apresentamos um exemplo de converso de relacionamento unrio.

Captulo 3 - O Modelo Lgico

Figura 3.16
Regra
Relacionamento
n-rio, onde n > 2.

49

EMPREGADO
supervisor
supervisiona

SUPERVISIONA

Exemplo:
EMPREGADO (@SSN, pNome, inicialM, uNome, sexoEmp, endereo, salrio,
dataNascEmp, NmeroDepto)
SUPERVISO (@SSNsupervisor, @SSNsupervisonado)

Figura 3.17
Converso de
relacionamento
unrio.

Generalizao ou especializao
A primeira providncia verificar se existem relacionamentos com a entidade geral. Em caso
afirmativo, deve-se primeiro criar um esquema de relao L para a entidade geral C (superclasse), com atributos {k, a1, a2,..., an}, sendo k o atributo identificador. Em seguida, crie uma
relao Li para cada entidade especfica Si (subclasses), onde os respectivos atributos sero
k {atributos de Si } (k a chave primria). Finalmente, para facilitar o processo de pesquisa no
banco de dados, recomenda-se a criao de um atributo tipo no esquema de relao L para
identificar a subclasse a que os dados se referem. Essa situao pode ser representada por:

L{k, a1, a2,..., an, t} sendo k o atributo identificador e t um atributo tipo.


Li {k {atributos de Si}}
Por outro lado, se no existe relao com a entidade geral, deve-se ento criar uma relao
Li para cada entidade especfica Si (subclasses). Os atributos de cada relao Li sero a unio
dos atributos com os atributos da entidade geral C (superclasse), incluindo obviamente o seu
identificador/chave. Isso pode ser representado pela expresso:

Li {{k, a1, a2,..., an} Si } sendo k a chave primria de C.


Na figura 3.18 a seguir demonstramos a aplicao dessa regra no caso em que h relacionamento com a entidade geral.

Modelagem de Bancos de Dados

CLIENTE

50

CPF
sexo

PESSOA
FISICA

PESSOA
JURDICA

Exemplo:
CLIENTE (@cdigo, nome, tipo)
PFISICA (@cdigo, CPF, sexo)
PJURDICA (@cdigo, CNPJ, tipoOrganizao)

cdigo
nome

CNPJ
tipoOrganizao

Figura 3.18
Regra
Generalizao ou
especializao.

Atributo multivalorado
Supondo o esquema de relao R{k, a1, a2, A,..., an}, onde A o atributo multivalorado. Se
o nmero de ocorrncias de A fixo, deve-se criar um novo atributo em R para cada uma
dessas ocorrncias de A.
Por outro lado, se a quantidade de ocorrncias de A muito grande, ou varivel, deve-se ento
criar um novo esquema de relao NR, incluindo neste apenas dois atributos: um correspondente ao atributo multivalorado A e o outro correspondente chave primria k de R. A chave
primria de NR ser a combinao de k e A. A seguir, exemplos para ambas as situaes:
Considerando cliente e telefone, onde:

11 O cliente tem sempre um telefone fixo, um celular e um telefone comercial:


22 Cliente(@codcli,..., FoneFixo, FoneCel, FoneComercial)
11 O cliente pode ter uma quantidade ilimitada de telefones:
22 Telefone(@codcli, @numfone)

Quadro resumo
Modelo Relacional

Entidade

Relao

Relacionamento 1 : 1 ou 1 : N

Relao + uma chave estrangeira

Relacionamento M : N

Relao + duas chaves estrangeiras

Atributo composto

Conjunto de atributos

Atributo multivalorado

Relao + uma chave estrangeira

Relacionamento n-rio

Relao + n-chaves estrangeiras

Chave

Chave primrio ou alternativa

Entidade fraca

Relao + chaves estrangeiras

A figura 3.19 traz um quadro resumo com as regras de converso do DER para o modelo
lgico. J a figura 3.20 mostra o resultado da converso do caso EMPRESA, que vem sendo
utilizado ao longo deste curso.

Captulo 3 - O Modelo Lgico

Figura 3.19
Quadro Resumo
com as regras de
converso ER >
Modelo Lgico.

Modelo ER

51

Pnome

Nss

Mnome

Snome

Nome

Endereo
Sexo

Nmero
Nome
N

Salrio

EMPREGADO
DataNasc

TRABALHA PARA

supervisor

SUPERVISIONA

CONTROLA
Horas

Estudo de Caso EMPRESA


DER

GERENCIA

supervisiona

DEPARTAMENTO

NmeroDeEmpregados

DataInicio

Localizao

TRABALHA EM

PROJETO
Nome

DEPENDENTE DE

Localizao

Nmero

DEPENDENTE
Nome

Sexo

DataNasc

Relao

Exemplo:
EMPREGADO (@SSN, pNome, inicialM, uNome, sexoEmp, endereo, salrio, dataNascEmp, NmeroDepto)
SUPERVISO (@SSNsupervisor, @SSNsupervisonado)
DEPENDENTE (@SSN, @Nome, SexoDep, dataNascDep, parentesco)
DEPARTAMENTO (@NmeroDepto, nomeDepto, numEmp, SSNChefe, dataIncio)
LOCALIZAO (@nmeroDepto, @localizao)
PROJETO (@NumProj, NomeProj, Localizao)
Modelo Lgico EMPRESA
TRABALHA_EM (@SSN, @NumProj, Horas)
Finalmente, na figura 3.21, apresentamos o modelo lgico do estudo de caso EMPRESA,
conforme este representado na ferramenta brModelo. Repare que as chaves so indicadas

Modelagem de Bancos de Dados

atravs de um smbolo especfico () e que cada atributo tem seu tipo definido (em alto nvel).

52

Figura 3.20
Converso do caso
EMPRESA.

EMPREGADO
SSN: Texto(9)
endereco: Texto(80)
(1,1)
sexo: Texto(1)
salario: Real
mNome: Texto(4)
pNome: Texto(23)
(1,n)
uNome: Texto(23)
possui_SSN: Texto(9)
numeroDepto: Inteiro(3)
(1,1)

(0,n)
DEPENDENTE
nome: Texto(50)
parentesco: Texto(30)
dataNasc: Data
sexo: Texto(1)
SSN: Texto(9)
Figura 3.21
Modelo Lgico
do estudo de
caso Empresa no
brModelo.

(1,1)

DEPARTAMENTO
numeroDepto: Inteiro(3)
(1,1)
nomeDepto: Texto(50)
SSN: Texto(9)
dataIni: Data

(1,n)

localizao
numeroDepto: Inteiro(3)
Localizacao: Texto(30)

(1,1)
trabalhaEm
(1,n)

numHoras: Inteiro(3)
numeroProj: Inteiro(3)
SSN: Texto(9)
(1,n)

(0,n)
PROJETO
(1,1)

localizao: Texto(30)
nomeProj: Texto(50)
numeroProj: Inteiro(3)
numeroDepto: Inteiro(3)

Exerccios de Fixao e
Comandos DDL para criao do Banco de Dados
Para voc, qual a importncia da criao do modelo conceitual e lgico como base para a
criao do modelo fsico e posterior scritp SQL/DDL a ser utilizado na criao do banco de
dados da aplicao em desenvolvimento?

Captulo 3 - O Modelo Lgico

(1,1)

(0,1)

53

54

Modelagem de Bancos de Dados

4
Apresentar a Structured Query Language (SQL) como ferramenta para a criao
e manuteno de modelos fsicos de bancos de dados, bem como o SGBD PostgreSQL.

conceitos

Modelo fsico; SQL; DDL; DML; DCL; DTL; Views; Triggers e Stored Procedures.

O modelo fsico
Podemos fazer as seguintes afirmaes sobre o modelo fsico:

11 Usa como base o modelo lgico.


11 Detalhes sobre armazenamento interno dos dados.
22 Questes que influenciam o desempenho das aplicaes.
11 Usado por quem faz a sintonia do banco.
22 Ajuste de desempenho tuning.
11 Auxilia na escolha do SGBDR considerando, por exemplo:
22 Tempo de resposta, utilizao de espao em disco, taxa de processamento de
transaes (throughput), custo etc.
11 Resultado: definio de estruturas para construo do BD (script em SQL/DDL).
Ferramentas CASE podem converter o modelo lgico em um script SQL/DDL
A partir deste momento, vamos passar a nos preocupar com a criao de estruturas de
dados fsicas no SGBD(R), responsveis pelo armazenamento dos dados modelados nas
fases anteriores (modelos conceitual e lgico).
Estamos falando do modelo fsico do banco de dados, que contm detalhes sobre como os
dados sero armazenados internamente. O modelo fsico vai se preocupar com questes
que no tm influncia direta na programao de aplicaes utilizando o SGBD, mas que
influenciam o desempenho destas. utilizado por profissionais que fazem a sintonia fina do
banco (ajuste de desempenho tuning). Outra funo do modelo fsico ajudar a escolher
o SGBDR ideal para a aplicao, uma vez que sero consideradas as opes ou caractersticas
que oferecem um melhor casamento entre o modelo existente e os recursos oferecidos por
diferentes SGBDRs.
Como exemplos das caractersticas que so consideradas, temos: Tempo de resposta, utili-

Captulo 4 - Modelo Fsico

objetivos

Modelo Fsico

zao de espao em disco, taxa de processamento de transaes (throughput), custo etc.


55

O modelo fsico a etapa final antes de se partir para a criao do banco de dados propriamente dito, e pode ser entendido como um refinamento do modelo lgico abordado na
sesso anterior. Um modelo bem estruturado e documentado a base para a definio das
estruturas necessrias para a construo do banco de dados.
importante ressaltar que muitas das ferramentas de modelagem disponveis no mercado
possibilitam a gerao do modelo fsico a partir do modelo lgico desenvolvido. Isso feito
atravs da gerao de scritps em uma linguagem denominada SQL/DDL e que ser estudada
com mais detalhe logo a seguir.
Na verdade, considerando todas as etapas do processo de modelagem, temos:
minimundo DER modelo lgico script SQL/DDL.
A ferramenta brModelo, que temos utilizado ao longo deste curso, tambm capaz de
apoiar o processo de converso do modelo lgico para o modelo fsico. A figura 4.1 mostra o
resultado desse processo para o estudo de caso EMPRESA.

Figura 4.1
Resultado da
converso do
modelo lgico para
fsico no brModelo.

O resultado apresentado na figura 4.1 uma representao bem aproximada da definio


das estruturas de dados a serem implementadas fisicamente no SGBDR. No caso do brMo Modelagem de Bancos de Dados

delo, os tipos de dados dos domnios de cada atributo so gerados com informaes de

56

mais alto nvel, j que essa ferramenta no se preocupa com os tipos de dados disponveis
nos diferentes SGBDs disponveis no mercado.
Assim, ser necessrio um passo adicional para usar o resultado gerado pelo brModelo na
criao propriamente dita das estruturas de dados (tabelas, RI etc.). Qual seja: mapear os
tipos de dados definidos no brModelo para cada atributo de cada tabela nos respectivos
tipos de dados disponveis no SGBD a ser utilizado.

Structured Query Language (SQL)


A Structured Query Language (SQL) a linguagem padro para trabalhar com banco de
dados relacionais nos diferentes SGBDs disponveis no mercado.
A primeira verso, originalmente chamada de Structured English Query Language (Sequel),
foi desenvolvida pela IBM no incio da dcada de 70, demonstrando a viabilidade da implementao do modelo relacional proposto por Codd. Desde ento, a linguagem evoluiu
bastante, passando a se chamar simplesmente Structured Query Language (SQL) e se estabeleceu claramente como a linguagem padro utilizada em banco de dados relacionais.
Em 1986, o American National Standards Institute (ANSI) e a International Organizaverses, com sucessivos aperfeioamentos foram publicadas:

Saiba mais

11 SQL-86;

Cabe ressaltar,
contudo, que apesar da
maior parte dos SGBDs
ser compatvel com
uma das verses do
padro, no so raros
os que acabam desenvolvendo extenses ou
variaes em relao
ao padro adotado.

11 SQL-89: publicao de um padro estendido para linguagem em 1989;


11 SQL-92;
11 SQL-1999;
11 SQL-2003 (XML);
11 SQL-2008;
11 SQL-2011 ISO/IEC 9075:2011 (16/12/2011).
A SQL usa uma combinao de construtores em lgebra e Clculo Relacional (tuplas), cujo
entendimento imprescindvel para quem quiser se aprofundar no uso de bancos de dados
relacionais. Uma referncia importante de consulta sobre o assunto o livro Sistemas de
banco de dados, de Ramez Elmasri e Shamkant B. Navate.

Estrutura da SQL
Na verdade, a SQL composta por um conjunto de linguagens que permitem a definio,
consulta e atualizao de dados, alm de recursos adicionais para a segurana e gesto do BD.
So elas:
11 DDL: Linguagem de Definio de Dados;

11 DML: Linguagem de Manipulao de Dados;


11 DCL: Linguagem de Controle de Dados;
11 DTL: Linguagem de Controle de Transaes.
O conjunto de comandos da linguagem DDL usado para a definio das estruturas de
dados, fornecendo as instrues que permitem a criao, modificao e remoo de objetos
de banco de dados. A DDL trabalha com os metadados (dados acerca dos dados) que ficam
armazenados no dicionrio de dados (catlogo). Exemplos de comandos dessa linguagem
so: CREATE, ALTER e DROP.
DML o grupo de comandos dentro da linguagem SQL utilizado para a recuperao,
incluso, remoo e modificao de informaes no banco de dados. Aqui so realizadas as
operaes CRUD (Create, Retrieve, Update e Delete), atravs de comandos tais como: INSERT,
SELECT, UPDATE e DELETE.

Captulo 4 - Modelo Fsico

tion for Standardization (ISO) publicaram o primeiro padro SQL. De l para c novas

57

DCL o grupo de comandos que permitem ao administrador de banco de dados gerenciar


os aspectos de autorizao de dados e licenas de usurios para controlar quem tem acesso
para ver ou manipular dados dentro do banco de dados. Exemplos de comandos da DCL so:
GRANT e REVOKE.
DTL, por sua vez, a linguagem de Controle de Transaes e fornece mecanismos para controlar
transaes no banco de dados. Seus comandos mais conhecidos so: BEGIN TRANSACTION,

COMMIT e ROLLBACK.
A DDL ser abordada com mais detalhes ainda nesta sesso. A DML, por sua vez, ser objeto
das sesses seguintes, enquanto que a DCL no faz parte do escopo desse curso (ela estudada no curso que trata da Administrao de Bancos de Dados).

Outras funcionalidades
Existem algumas funcionalidades gerais, fornecidas pelos principais SGBDs disponveis no
mercado, que servem para facilitar, proteger e automatizar alguns dos processos realizados
dentro do banco de dados.
Entre elas, destacamos:

11 Views;
11 Triggers e Stored Procedures;
22 MySQL-SQL/PSM, Oracle-PL/SQL, PostgreSQL-PL/pgSQL/PSM.
11 Regras para embutir comandos SQL em Linguagens de programao.
Views so utilizadas para facilitar o acesso a um determinado conjunto de dados. Esse
recurso possibilita a criao de selees de dados, provenientes de tabelas, mas disponibilizados por meio de outras tabelas que atuam como filtros. Esses filtros, na verdade, so
uma restrio de dados, baseados em regras estipuladas pelo usurio, para que somente
os resultados desejados sejam disponibilizados, e no todos os campos e registros de uma
determinada tabela do banco de dados.
Os triggers, geralmente escritos em DML, no so disparados pelos usurios, mas sim pela
ativao de algum evento ocorrido no banco de dados.
As Stored Procedures (procedimentos armazenados) so uma coleo de comandos em SQL
pensados e implementados com o objetivo de aperfeioar consulta no banco de dados. Por
exemplo, os procedimentos armazenados podem ser utilizados para reduzir o trfego na
rede, melhorar a performance do banco de dados, bem como criar mecanismos de segurana, entre outras funcionalidades.
Por fim, as empresas que disponibilizam SGBDs no mercado tambm se preocupam em

Modelagem de Bancos de Dados

desenvolver e disponibilizar regras para o uso de seus produtos nas diversas linguagens de
programao em uso, visando manter um padro para facilitar o processo de como seus
comandos podero ser embutidos nas solues de software em desenvolvimento que manipulam banco de dados.

PostgreSQL
11 Origem no projeto Postgres, na Universidade de Berkeley, em 1986.
11 Em 1996, recebeu o nome atual PostgreSQL.
11 Licena de uso BSD, open source.
11 Apresenta principais recursos existentes nos bancos de dados pagos disponveis
no mercado.

58

Saiba mais
A DTL ser discutida na
sesso 10.

11 Compatvel com diversos SOs.


Possui bibliotecas e extenses para as principais plataformas e linguagens de programao.

Neste curso, estaremos aplicando os conceitos de banco de dados no PostgreSQL, que um


sistema de gerenciamento de banco de dados relacional (SGBDR), utilizado para gerenciar
dados armazenados em relaes entre tabelas.
Relao , essencialmente, um termo matemtico para tabela. A noo de armazenar dados
em tabelas to trivial hoje em dia que pode parecer totalmente bvio, mas existem vrias
outras formas de organizar bancos de dados. Arquivos e diretrios em Sistemas Operacionais tipo Unix so um exemplo de banco de dados hierrquico. Um desenvolvimento mais
moderno so os bancos de dados orientados a objeto.
Cada tabela uma coleo nomeada de linhas. Todas as linhas de uma determinada tabela
possuem o mesmo conjunto de colunas nomeadas, e cada coluna de um tipo de dado
especfico. Enquanto as colunas possuem uma ordem fixa nas linhas, importante lembrar
que o SQL no garante a ordem das linhas dentro de uma tabela (embora as linhas possam
ser explicitamente ordenadas para a exibio).
As tabelas so agrupadas em bancos de dados, e uma coleo de bancos de dados gerenciados
por uma nica instncia do servidor PostgreSQL forma um agrupamento de bancos de dados.

Caractersticas do PostgreSQL
Value

Maximum database size

Unlimited

Maximum table size

32 TB

Maximum row size

1.6 TB

Maximum eld size

1 GB

Maximum rows per table

Unlimited

Maximum columns per table

250-1600 depending on column types

Maximum indexes per table

Unlimited

Outras informaes relevantes so:

11 Download do PostgreSQL (e documentao).


22 http://www.postgresql.org
11 Instalao:
22 Porta: 5432 e Usurio: postgres, senha.
22 Estrutura de pastas.
22 Arquivo de configurao.
22 Incluso cliente (front-end) pgAdmin3.
11 Arquivo de configurao: PostgreSQL\9.x\data\postgresql.conf
11 Diretrio padro para os dados: PostgreSQL\9.x\data\base

Criao do banco de dados


Temos de partir do princpio de que temos um SGBD instalado e que seus servios
estejam disponveis para que os modelos fsicos de banco de dados em desenvolvimento
possam ser criados.

Captulo 4 - Modelo Fsico

Figura 4.2
Caractersticas do
PostgreSQL.

Limit

59

11 Necessrio ter iniciado o SGBD PostgreSQL.


22 Instalado como servio (incio automtico ou no).

Neste curso, vamos utilizar o PostgreSQL como SGBD, sendo necessrio que ele esteja configurado como um servio ativo para possibilitar acesso criao de banco de dados e suas
estruturas de dados.
O prximo passo que devemos ter em mente realizao de uma conexo com o SGBD.
Existem diversas ferramentas disponveis no mercado, sendo o psql e pgAdmin3 duas ferramentas que acompanham a verso do postgreSQL disponibilizada para este curso.
11 Comandos SQL podem ser executados:

22 Via console (modo texto): psql


22 Via ferramenta grfica: pgAdmin3
22 Ou embutidos em linguagens de programao.
11 Observaes:
22 SQL no case-sensitive.
22 Comandos terminam com ponto-e-vrgula (;).

Criar conexo com o SGBD postgreSQL (no pgAdmin3)


Neste ponto, algumas informaes so indispensveis. As informaes so em parte fornecidas durante o processo de instalao do SGBD postgreSQL, sendo elas o endereo (IP ou
DNS) e porta de comunicao que estar aguardando requisies de conexo para manipulao de banco de dados.
As informaes complementares so o usurio e senha, para que seja possvel a disponibilizao de acesso. Inicialmente temos um usurio, conhecido como super-usurio na documentao oficial do postgreSQL, que possui todos os privilgios necessrios configurados para
manipulao do banco de dados no SGBD postgreSQL. Neste curso, estaremos utilizando esse

Modelagem de Bancos de Dados

super-usurio criado durante o processo de instalao do postgreSQL, o postgres.

60

Figura 4.3
Tela que
disponibiliza
servios do SO.

Criar conexo com o servidor PostgreSQL no pgAdmin3

Informar endereo e porta do servidor e tambm usurio e senha


Figura 4.4
pgAdmin3:
Tela de conexo
com o SGBD.

Note que superusurios tem todos privilgios automaticamente

A criao de uma conexo ainda no d acesso a um banco de dados especfico, e sim nos
disponibiliza uma ponte com informaes necessrias para abrir uma conexo com o banco
de dados que desejamos trabalhar.
Para executar qualquer comando, necessrio conectar ao servidor PostgreSQL

Figura 4.5
pgAdmin3 Passos
para ativar conexo
ao servidor
postgreSQL.

Comando SQL/DML para criar banco de dados


O conjunto de comandos da linguagem DDL usado para a definio das estruturas de
dados, fornecendo as instrues que permitem a criao, modificao e remoo de objetos
de banco de dados (base de dados, esquemas, tabelas, ndices etc.).

Captulo 4 - Modelo Fsico

(no pgAdmin3).

61

Banco de dados:

11 Objeto bsico em um SGBD que contm todos os objetos que sero criados para esse
banco de dados.
11 Usurio com direito de acesso CREATEDB.
22 CREATE DATABASE <nomeDB> [argumentos];
11 Argumentos:
22 OWNER usurio (usurio com amplos poderes sobre o DB);
22 TEMPLATE nomet (modelo padro para a DB);
22 ENCODING valor (conjunto de caracteres: LATIN1, UTF8...);
22 TABLESPACE nomets (local de armazenamento do DB);
22 CONNECTION LIMIT (nmero de conexes simultneas).
Tablespaces so definies de locais para armazenamento lgico das informaes do servidor. visto como diretrios existentes em seu SO. Sua funcionalidade a de possibilitar
o armazenamento de informaes do servidor em locais distintos, sendo motivado por
polticas de backup, utilizao de mais de um HD, organizao, entre outros.
11 Tablespaces so definies de locais de armazenamento lgico dos dados (por questo

de organizao, poltica de backup, utilizao de mais de um disco rgido etc.).


11 Trata-se de diretrios no SO.
11 possvel gerenciar tablespace (criar, alterar e excluir):
22 CREATE TABLESPACE <nomeTS> LOCATION 'local';
11 Connection Limit por padro -1 e representa sem limite (varivel max_connections

Modelagem de Bancos de Dados

no arquivo de configurao do PostgreSQL).

62

Figura 4.6
pgAdmin3 Uso
do SQL Editor
para criao de
banco de dados no
postgreSQL.

A ferramenta SQL Editor, parte integrante do pgAdmin3, disponibiliza uma interface onde
podemos digitar as instrues SQL a serem utilizadas para a criao do banco de dados.

Outro recurso que podemos usar o assistente para a criao de banco de dados oferecido
pelo pgAdmin3 (figura 4.7).

A conexo com o banco de dados s ser possvel aps a criao e posterior conexo com o
este. Apenas aps a confirmao de conexo estabelecida que poderemos dar incio ao
processo de execuo de consultas no banco de dados.
Outro ponto importante a se ressaltar que o acesso aos objetos de um determinado banco
de dados tambm s estar disponvel para uso aps a confirmao da conexo (figura 4.8).
Para executar comandos sobre um banco de dados especfico, necessrio conectar-se a ele:
clique sobre o nome do BD.

Captulo 4 - Modelo Fsico

Figura 4.7
pgAdmin3 Uso
de assistente
para criao de
banco de dados no
postgreSQL.

63

Figura 4.8
pgAdmin3 Acesso
estrutura do
banco de dados
aps ativao de
conexo.

Alterao do banco de dados


Uma vez criado o banco de dados, possvel procedermos com a alterao de seu nome,
bem como a alterao de seu proprietrio. Essa operao pode ser realizada via instruo
SQL no utilitrio SQL Editor ou por meio da edio das propriedades do banco de dados pelo
pgAdmin3 (figura 4.9).

ALTER DATABASE <nomeDB> RENAME <novoNomeDB>;

Modelagem de Bancos de Dados

ALTER DATABASE <nomeDB> TO OWNER <novoUser>;

64

Figura 4.9
pgAdmin3
Editando
propriedades do
banco de dados.

Excluso do banco de dados


Por fim, podemos proceder com a execuo de um determinado banco de dados, podendo
ser realizada via instruo SQL no utilitrio SQL Editor ou por meio da edio das propriedades do banco de dados pelo pgAdmin3 (figura 4.10).
EXCLUSO: Apaga todas as tabelas e estruturas associadas e, consequentemente, todos os
dados existentes.

DROP DATABASE <nomeDB>;

Figura 4.10
pgAdmin3
Excluindo um
banco de dados.

Esquemas podem ser entendidos como pastas utilizadas de objetos criados em um banco de
dados. Um banco de dados pode ter dezenas de objetos, como tabelas, vises e ndice, entre
outras estruturas. Esquemas possibilitam a organizao, como por exemplo, agrupados de
acordo com seu uso.
Recomendamos o uso de esquemas em um banco de dados quando for necessrio o agrupamento e organizao de objetos que posteriormente tero o acesso disponibilizado para
um determinado usurio ou grupo de usurios.

Captulo 4 - Modelo Fsico

Esquema de banco de dados

65

ESQUEMA:

11 Agrupa ou organiza tabelas, restries, vises, domnios e outros objetos (construtores) do BD;
11 Incorporado no SQL2: inicialmente todas as tabelas eram de um mesmo esquema;
11 Na prtica o banco de dados;
11 Esquema padro: 'public'.

CREATE SCHEMA <nomeSh> [argumentos];


11 Argumentos:
22 AUTHORIZATION usurio
A figura 4.11 tem informaes sobre a alterao de Esquemas.
Alterao do Esquema: modifica algumas propriedades
ALTER SCHEMA <nomeSh> RENAME TO <novoNomeSh>;
ALTER SCHEMA <nomeSh> OWNER TO <novoUser>;

Figura 4.11
pgAdmin3
Criando esquema
em um banco de
dados.

A excluso de esquemas de um banco de dados tambm est disponvel para ser realizada
por linha de comando SQL no SQL Editor ou por meio da interface grfica do pgAdmin3
(figura 4.12).
Excluso do Esquema e de todas as estruturas que ele contm.

Modelagem de Bancos de Dados

DROP SCHEMA <nomeSh> [CASCADE|RESTRICT];

66

Figura 4.12
pgAdmin3
Excluindo esquema
em um banco de
dados.

Criando tabelas no banco de dados


O gerenciamento estrutural de tabelas um dos conjuntos de comandos mais completos e
customizveis dentro da estrutura de um SGBD. Esse conjunto de comandos possibilita desde
a criao de bancos de dados, de tabelas, assunto desse tpico, ndices, vises, entre outros.
TABELA:

11 Estrutura do BD derivada de uma relao do modelo lgico.


22 Possui campos (mapeados dos atributos da relao);
22 Define o domnio dos campos: tipo de dado;
22 Define o conjunto de restries de integridade (RI).

CREATE TABLE <nomeTb>(


<nomeCampo1> <tipoDado> [<restries>],
<nomeCampo2> <tipoDado> [<restries>],
... [<restriesTabela>]
);
CREATE TABLE <nomeSh>.<nomeTb>(...);
A figura 4.13 apresenta a interface para criao de tabelas atravs do assistente do PgAdmin3.

Existe uma grande variedade de tipos de dados que podem ser utilizados no processo de
construo de campos que compem uma tabela. Neste curso, vamos listar os mais
comumente utilizadas por proximidade com a realidade das informaes geralmente
manipuladas nos bancos de dados. So eles:
Principais tipos de dados

11 Numrico: bigint (int8), integer (int, int4), smallint (int2), serial, double precision
(float8), real (float4), numeric [(p,s)] (decimal), money;
11 Literal: character [(n)] (char), character varying[(n)] (varchar), text, bit varying[(n)] (varbit);
11 Lgico: boolean(bool);
11 Temporal: date, time, timestamp [with(out) time zone];
11 Outros: bytea, oid, tipos enumerados, tipos geomtricos, tipos endereos de rede...

Captulo 4 - Modelo Fsico

Figura 4.13
pgAdmin3
Criando tabelas.

67

A figura 4.14 exibe as janelas relacionadas com a criao dos campos de uma tabela usando
o assistente do PgAdmin3.

Tipos de dados, que compem os campos ou colunas de uma tabela no banco de dados,

Figura 4.14
pgAdmin3
Assistente para
criao de colunas
em uma tabela.

podero ter de atender a determinadas restries, que so derivaes de regras do minimundo que o banco de dados representa. Geralmente temos um conjunto considervel
de restries para os valores reais sendo manipulados. Em determinada situao essas
restries podero ser tratadas na camada de viso da aplicao que manipula os dados,
mas, porm, em algumas situaes, esses devero ser tratadas na estrutura das tabelas pertencentes a ao banco de dados em uso.
Restries (constraints):

11 So regras a que os valores de uma ou mais colunas ou campos devem obedecer;


11 A utilizao de constraints a nica garantia de que os dados existentes nas colunas
esto de acordo com as regras especificadas no projeto do banco de dados;
11 Garante correo nos dados, pois erros de programao podem fazer com que sejam
aceitos;
11 Podem ser restries de coluna ou de tabela.

Modelagem de Bancos de Dados

Restries de atributos tratam especificamente as restries de chave e referencial, bem

68

como as restries de domnio de atributos.


Restries em Atributo:
11 Se nada for indicado de restrio sobre um atributo, por default, ele admite o valor
nulo (NULL):
22 Representa um atributo opcional.
11 Se no for um atributo opcional, ento acrescentar a clusula NOT NULL;
11 possvel associar um valor padro (que no nulo) atravs da clusula DEFAULT <valor>.

O pgAdmin3 disponibiliza recurso visual grfico para auxiliar no processo de definio de


restrio de atributos durante a sua criao.

Figura 4.15
pgAdmin3
Assistente para
definio de
restries em
colunas ou campos.

Restries de chave e de integridade referencial so muito importantes. Por isso existem


clusulas especiais dentro do comando CREATE TABLE para especific-las.
11 Clusula UNIQUE: Permite indicar que os valores da coluna no podem repetir.

22 Pode ser restrio de tabela: UNIQUE <campo[s]>


22 Representa atributo nico.
11 Restrio de Chave Primria.
22 Indicao do atributo identificador da tabela (se existir): uso da clusula PRIMARY KEY.
22 Em uma tabela, s pode existir apenas uma clusula PRIMARY KEY. Se a chave primria for concatenada, utilizar restrio de tabela: PRIMARY KEY <campo[s]>
22 uma combinao de NOT NULL + UNIQUE.
11 Restrio de Integridade Referencial.
22 Permite inserir atributos relacionantes (chave estrangeira) em uma tabela: uso da
clusula REFERENCES <TabelaRef> (<campoRelacionante>);

22 Na restrio de tabela: FOREIGN KEY <campo>


22 REFERENCES <TabelaRef> (<campoRelacionante>).

Captulo 4 - Modelo Fsico

22 O valor campo ser validado em sua origem;

69

Importante:
11 Por padro, se nenhum nome for atribudo restrio UNIQUE, receber o nome
nomeTB_nomeCOL_key;
11 Por padro, se nenhum nome for atribudo restrio PRIMARY KEY, receber o nome
nomeTB_pkey;

Figura 4.16
pgAdmin3
Assistente para
definio de
restries em
atributos.

11 Por padro, se nenhum nome for atribudo restrio FOREIGN KEY, receber o nome

Modelagem de Bancos de Dados

nomeTB_nomeCOL_fkey;

70

Figura 4.17
pgAdmin3
Assistente para
definio de
chave primria
e integridade
referencial.

Violao da Integridade Referencial:

11 Ocorre quando tuplas so inseridas, excludas ou valor do atributo chave (primria ou


estrangeira) modificado;
11 Ao padro da SQL: rejeitar;
11 Projetista pode especificar ao referencial engatilhada (referential triggered action),
integrada com ON DELETE ou ON UPDATE.
22 SET NULL ou SET DEFAULT ou CASCADE.
11 Como as operaes de excluso e atualizao no lado 1 refletiro no lado N.
Exemplo:
11 Se a tupla de um empregado supervisor for excluda, o valor de codEmpSup ser
marcado como NULL em todas as tuplas de empregado que fizer referncia ao Supervisor excludo;
11 Se a tupla de um empregado supervisor for atualizada, o novo valor ser propagado
em todas as tuplas de empregado que fizer referncia ao Supervisor atualizado.

CREATE TABLE empregado (


codEmp INTEGER PRIMARY KEY,
codEmpSup INTEGER REFERENCES EMPREGADO(codEmp)
ON DELETE SET NULL
ON UPDATE CASCADE,

Figura 4.18
pgAdmin3
Assistente
para criao de
restries.

Restries em Atributo:
11 possvel validar dados inseridos em um campo atravs da clusula
CHECK(<condio>);
11 a especificao de uma condio, cujo resultado da avaliao deve ser verdadeiro

Captulo 4 - Modelo Fsico

...);

para que os dados sejam aceitos (limita o valor do domnio do atributo);


71

11 Observao: restries CHECK so teis para garantir a integridade dos dados, mas

podem representar alto custo de processamento.


Denominando as Restries: A clusula CONSTRAINT permite nomear uma restrio
( opcional). No pgAdmin3, automtica a atribuio de nome restrio (conforme
apresentado antes). Por padro, se nenhum nome for atribudo restrio check,
receber o nome nomeTB_nomeCOL_check.

CONSTRAINT <nomeCT> <restrio>


Exemplo:

CREATE TABLE aluno (


codaluno number(5), nome varchar2(50), dtnasc date,
mae varchar2(50), sexo char(1), curso number(5),
CONSTRAINT pk_aluno PRIMARY KEY (codaluno),
CONSTRAINT uk_aluno UNIQUE(nome, mae),
CONSTRAINT ck_sexo CHECK (sexo IN('M', 'F')),
CONSTRAINT fk_curso FOREIGN KEY (curso) REFERENCES curso(codcurso));
);

Alterao de tabelas no banco de dados


A alterao de uma tabela envolve um conjunto de comandos para realizar as mais
diversas aes possveis, entre as quais renomear a tabela, suas colunas, inserir ou
novas colunas de dados, entre outras.

ALTER TABLE <nomeTB> <aes>;


11 Aes:
22 ADD [COLUMN] <nomeCOL> <tipoDado> [<restries>];
22 ALTER [COLUMN] <nomeCOL> TYPE <tipoDado>;
22 DROP [COLUMN] <nomeCOL> [RESTRICT|CASCADE];
22 RENAME COLUMN <nomeCOL> TO <novoNomeCOL>;
22 ADD CONSTRAINT <restriesTB>;
22 DROP CONSTRAINT <nomeCT> [RESTRICT|CASCADE];
22 OWNER TO <novoUsurio>;

Modelagem de Bancos de Dados

22 RENAME TO <novoNomeTB>;

72

Figura 4.19
pgAdmin3
Assistente para
alterao de tabela
do BD.

Observaes:

11 A nova coluna inicialmente preenchida com o valor padro (se fornecido) ou NULL;
11 PostgreSQL tentar converter o valor da coluna para o novo tipo, bem como quaisquer restries que envolvem a coluna. Mas essas converses podem falhar;
11 Muitas vezes melhor excluir as restries e depois adicionar novamente no novo
formato.

Excluso de tabelas no banco de dados


Para excluir uma tabela (e todos os dados l existentes), basta utilizar o comando DROP

TABLE, informando o nome da tabela que se deseja remover do banco de dados.


Excluso da Tabela: permite apagar uma tabela (e todos os dados l existentes)

DROP TABLE <nomeTB> [CASCADE|RESTRICT];


DROP TABLE <nomeTB> [CASCADE|RESTRICT];

Figura 4.20
pgAdmin3
Assistente para
excluso de tabela
do BD.

Captulo 4 - Modelo Fsico

11 RESTRICT: se a tabela estiver referenciada em vises ou regras de integridade refeRESTRICT:


se a tabela
estiver referenciada em vises ou regras de integridade referencial,
rencial,
o comando
falhar;
o comando falhar
11 CASCADE: sempre ter sucesso e views e constraints tambm sero eliminadas.
CASCADE: sempre ter sucesso e views e constraints tambm sero eliminadas

73

Domnios
Domnios so objetos que possibilitam a criao de novos tipos de dados que podero ser usados
no processo de definio de colunas de dados dentro das tabelas sendo criadas no banco.
Domnios tambm so conhecidos como mscaras de dados por sua funcionalidade. Por
exemplo, possvel criar um domnio de dado que valide cdigo postal, outro que validade
nmero telefnico, entre outros.
Domnio:

11 Tipo de dado para um domnio que utilizado para vrios atributos


11 Objetivo: Melhorar legibilidade do esquema
22 CREATE DOMAIN <nomeDM> AS <tipoDado>[<restries>];
11 Alterao do Domnio
22 ALTER DOMAIN <nomeDM> <aes>;
11 Excluso do Domnio
22 DROP DOMAIN <nomeDM> [CASCADE|RESTRICT].

Exemplos:

Figura 4.21
pgAdmin3
Assistente para
manuteno de
domnios.

CREATE DOMAIN tipoCEP AS CHAR(8);


CREATE DOMAIN tipoNota AS DECIMAL(3,1)
CHECK (VALUE >=0 AND VALUE <=10);
CREATE DOMAIN dom_username TEXT
CHECK (LENGTH(VALUE) > 3 AND

Modelagem de Bancos de Dados

LENGTH(VALUE) < 200 AND

74

VALUE ~ '^[A-Za-z][A-Za-z0-9]+$');

Sequncia
11 um objeto do BD que gera nmeros em ordem sequencial.
11 Aplicaes, na maioria das vezes, usam esses nmeros quando eles exigem um valor
nico em uma tabela, tais como valores de chave primria.

11 Alguns SGBDs usam o conceito de autoincremento na configurao de tipos numricos.

11 Objeto criado implicitamente com um campo SERIAL.


11 As sequncias so manipuladas usando instrues SQL.
Diferentemente de outros banco de dados, os campos conhecidos como AUTOINCREMENT
no PostgreSQL so configurados de forma separada das tabelas onde sero utilizados. Isso
se deve ao fato de um campo desse tipo poder gerenciar o nmero de incremento de duas
ou mais tabelas de forma sincronizada.
Sintaxe:

CREATE SEQUENCE <nomeSq>[INCREMENT BY #]


[START WITH #]
[MINVALUE #|NOMINVALUE] [MAXVALUE #|NOMAXVALUE]
[CACHE #]
Comando para obter prximo valor da sequncia:

<nomeSq>.NEXTVAL
Comando para definir um novo valor da sequncia:

SELECT SETVAL('<nomeSQ>',<novoValor>);
A figura 4.22 mostra como criar uma nova sequncia atravs do assistente do PgAdmin3.

Figura 4.22
pgAdmin3
Assistente
para criao de
sequncias.

Exemplo de como definir uma coluna autoincremento:

CREATE SEQUENCE funcionario_seq INCREMENT 1 START 1;


CREATE TABLE funcionario(
idfunc INTEGER DEFAULT nextval('seq_func'),

PRIMARY KEY(idfunc);
);
INSERT INTO funcionario VALUES (DEFAULT,'Maria');
INSERT INTO funcionario VALUES (nextval('seq_func'),'Ana');

Captulo 4 - Modelo Fsico

...

75

Ou

CREATE TABLE funcionario(


idfunc SERIAL,
...
PRIMARY KEY(idfunc);
);
...
SERIAL:
11 uma mscara de dado do tipo inteiro, j com o DEFAULT definido como NEXTVAL de
uma sequncia cujo valor inicial 1;
11 Ao utilizar o tipo SERIAL, uma sequncia de nome <tabela_campo_seq> criada implicitamente como objeto do banco de dados;
11 Os tipos podem ser:
smallserial

2 bytes

small autoincrementing interger

1 to 32767

serial

4 bytes

autoincrementing interger

1 to 214783647

bigserial

8 bytes

large autoincrementing interger

1 to 9223372036854775807

Figura 4.23
pgAdmin3
Exemplo de
atributo SERIAL
na criao de uma
tabela no BD.

Desvantagens no uso de seriais:


Modelagem de Bancos de Dados

11 Caso haja uma falha no sistema, ser perdida toda a numerao sequencial;

76

11 Caso voc execute o comando DELETE na sua tabela, o nmero da sequncia que voc
deletou ser perdido, permanecendo um buraco na sua coluna;
11 No aproveitado para um novo registro.
Optar por autonumerao quando no houver atributo identificador prprio (nesse
caso, usar a clusula UNIQUE).
Alterao da sequncia:

ALTER SEQUENCE <nomeSQ> <parmetros>;

Excluso de uma sequncia:

DROP SEQUENCE <nomeSQ> [CASCADE|RESTRICT];

Figura 4.24
pgAdmin3
Assistente para
manuteno de
sequncias.

Script SQL/DDL do banco de dados


A ltima etapa do processo de converso do modelo lgico em fsico a escrita do script
SQL/DDL com posterior execuo deste dentro do banco de dados criado dentro SGBD PostgreSQL. Em alguns casos, se forem feitos em ferramentas CASE, a gerao do script SQL/
DDL possvel por meio de assistentes de gerao de cdigo SQL/DDL, como no brModelo.

Figura 4.25
pgAdmin3 SQL
Editor Assistente
para execuo do
scritp SQL/DDL.

Captulo 4 - Modelo Fsico

A figura 4.25 mostra a janela do Editor de SQL do pgAdmin3.

77

Exerccios de Fixao e
Comandos DDL para criao do banco de dados
Para voc, qual a importncia da criao do modelo conceitual e lgico como base para a
criao do modelo fsico e posterior scritp SQL/DDL a ser utilizado na criao do banco de

Modelagem de Bancos de Dados

dados da aplicao em desenvolvimento?

78

5
Conhecer o processo de escrita de consultas SQL/DML para a manipulao de banco
de dados com operaes CRUD e operaes sobre conjuntos.

UNION; INTERSECT e EXCEPT.

conceitos

CRUD; INSERT; SELECT; cursor; UPDATE; DELETE; DISTINCT; JOIN (INNER e OUTER);

Operaes CRUD
A partir desse momento, vamos dar incio ao estudo dos recursos disponibilizados nos
SGBDs para manipulao das estruturas de dados definidas nas tabelas que compem um
banco de dados. O conjunto de comandos est definido dentro do SQL/DML.
DML o grupo de comandos dentro da linguagem SQL utilizado para a recuperao,
incluso, remoo e modificao de informaes em bancos de dados. O acrnimoCRUD
usado frequentemente para definir as quatro operaes bsicas de um banco de dados.
Seu significado :
11 Create (INSERT);
11 Retrieve (SELECT);
11 Update (UPDATE);
11 Delete (DELETE).
Os comandos SQL/DML, para manipular o BD, podem ser informados atravs da janela do
SQL Editor, sendo o resultado exibido no Output Pane, conforme pode ser visto na figura 5.1.

Captulo 5 - Comandos DML CRUD e operaes sobre conjuntos

objetivos

Comandos DML CRUD


e operaes sobre conjuntos

79

Figura 5.1
pgAdmin3 SQL
Editor resultado
de uma operao
CRUD no Output
Pane.

Os dados obtidos atravs de um desses comandos, por sua vez, podem ser diretamente
manipulados por meio da janela de Edio de Dados, conforme demonstrado na figura 5.2:

Edio de Dados
Exemplo tabela Empregado
(BD Empresa)

Modelagem de Bancos de Dados

INSERT

80

11 INSERT: Retorna nmero de registros inseridos ou cdigo de erro

INSERT INTO <nomeTabela> [(<coluna1>,...)] VALUES (<expresso>,...);


11 Observaes:
11 Quando o nome das colunas no informado, utiliza-se a ordem das colunas
na sua criao.
11 Validao de Regras/Restries:
22 Validao do tipo de dado (domnio): para cada tipo de dado, a expresso (valor a
ser inserido) deve ser adequada.

Figura 5.2
pgAdmin3 SQL
Editor editando
dados de uma
tabela no assistente
Edit Data.

O comandoINSERTserve para inserir um registro em alguma tabela de um banco de dados.


Todos os campos no nulos devem ser informados e os demais so de carter facultativo.
A clusula que identifica os nomes das colunas poder ser suprimida. Nesse caso, o conjunto
de valores da clusula value dever ser ordenado de acordo com a sequncia de campos,
quando da definio da estrutura da tabela no banco de dados.

Uso do campo serial


O uso do campo serial, ou autonumerado, pode diferir dependendo do SGBD utilizado. A
seguir, temos um exemplo do uso do campo serial:

INSERT INTO categoria (codCat, descrCat)


VALUES (1,'informtica');
INSERT INTO categoria VALUES (DEFAULT,'vesturio');
Figura 5.3
Mensagem de erro
durante processo
de incluso de
registro.

Vejam que a execuo em sequncia desses comandos gera um erro, conforme pode ser
visto na figura 5.3. Esse erro ocorre porque j existe na tabela um registro com o valor 1
(valor da sequncia). Na tentativa seguinte para inserir um registro, este vai conter o valor 2,
pois a sequncia j foi incrementada (executou NEXTVAL).

Nesse outro exemplo, apresentado na figura 5.4, demonstra-se que o problema pode acontecer
em qualquer momento, e no apenas na incluso dos primeiros registros em uma tabela.

INSERT INTO categoria


VALUES (NEXTVAL('categoria_codcat_seq'), 'frutas');
INSERT INTO categoria (codCat, descrCat)
VALUES (3, 'brinquedo');

ERRO: Duplicar o valor da chave viola a restrio de unidade categoria_pkey


DETAIL: Chave (codcat) = 3 j existe.

Validao de chave primria


Ao incluir um novo registro, preciso lembrar que devemos sempre informar a chave
primria, principalmente quando fornecemos apenas os valores dos campos que sero
includos. No exemplo a seguir, ocorre um erro quando a chave primria omitida.

INSERT INTO produto VALUES


('abacaxi' , 4.58, 6);

Captulo 5 - Comandos DML CRUD e operaes sobre conjuntos

Figura 5.4
Mensagem de
erro violao
de restrio de
unidade durante
processo de
incluso de
registro.

81

ERRO: sintaxe de entrada invlida para interger: abacaxi


LINE 2:

('abacaxi', 4.58, 6)
^

********** Error **********


Podemos corrigir essa instruo incluindo a indicao do prximo valor para a PK ou informando a sequncia de campos nos quais sero gravadas as informaes da clusula value.
Vejamos exemplos das duas alternativas:

INSERT INTO produto VALUES


(NEXTVAL('produto_codprod_seq'), 'abacaxi' , 4.58, 6);
INSERT INTO produto VALUES
(DEFAULT, 'abacaxi', 4.58, 6);
Ou

INSERT INTO produto (descrProd, vlrProd, codCat) VALUES


('abacaxi', 4.58, 6);

Validao da chave estrangeira


O SGBD verifica tambm se existe o valor PK da tabela relacionada na tabela de origem e, caso
no exista, retorna uma mensagem de erro informando que no existe o valor para a chave
estrangeira naquela instruo INSERT. Vejamos um exemplo onde esse tipo de erro acontece:

INSERT INTO produto


(codProd, descrProd, vlrProd, codCat) VALUES
(DEFAULT, 'abacaxi', 4.58, 30);
ERRO: insero ou atualizao em tabela produto viola restrio de chave
estrangeira produto_codcast_fkey
DETAIL: Chave (codcat) = 30 no est presentte na tabela categoria

Validao da restrio NOT NULL


Outra validao feita pelo PostgreSQL em um comando INSERT sobre a possibilidade de
um ou mais campos poderem ser suprimidos ou informados com valor nulo. No exemplo a
Modelagem de Bancos de Dados

seguir, temos uma situao onde um erro gerado por conta dessa validao.

82

INSERT INTO produto (codProd, vlrProd, codCat) VALUES (DEFAULT, 2.5, 3);
ERRO: valor nulo na coluna descripod viola a restrio no-nula
DETAIL: Failing row contains (1, null, null, null, null, null, null, 3, 2.5.
********** Error **********

Nesse exemplo, obrigatrio informar o campo descrprod ou passar um valor para ele na
ordem de definio dos campos quando da criao da tabela no banco de dados.

INSERT INTO produto


(codProd, descrProd, vlrProd, codCat) VALUES
(DEFAULT, 'abacaxi', 4.58, 30);

Validao da restrio de domnio (tipo de dado)


Como possvel determinar um domnio para campos em uma tabela, o postgreSQL consulta a sua estrutura para verificar se existem restries de domnio durante a execuo do
comando INSERT. No exemplo a seguir, foi informada a restrio para o campo sexo, onde
este s vai aceitar M ou F, gerando um erro j que tal domnio no foi observado.

INSERT INTO empregado


(ssn, pnome, inicialm, unome, sexo, dno)
VALUES ('123454321', 'Denis', 'C', 'Neves', 'P', '1');
ERRO: novo registro da relao empregado viola restrio de verificao
empregado_sexo_check
DETAIL: Failing row contains (123454321, Denis, C, neves, P, null, null, null, 1, null,
null, null).
********** Error **********
Outras validaes so feitas em relao a campos do tipo DATE e BOOLEAN. Vejamos
alguns dos formatos que so aceitos pelo PostgreSQL:Q
11 Tipo DATE pode ser no formato AAAA-MM-DD ou DD/MM/AAAA, ou ainda a data

do sistema: current_date;

TRUE FALSE
t

true

false

yes

no

on

off

Captulo 5 - Comandos DML CRUD e operaes sobre conjuntos

11 Tipo BOOLEAN pode ser nos formatos:

83

UPDATE
O comandoUPDATEserve para realizar a alterao de algum registro j inserido em alguma
tabela de um banco de dados. Esse comando retorna nmero de registros afetados pela
atualizao na tabela ou, ento, um cdigo de erro. A sintaxe do comando :

UPDATE <nomeTabela>
SET <campo1> = <expresso1> [,...]
[WHERE <expressoCondicional>];
Vejamos alguns exemplos:

UPDATE produto SET precoProd = precoProd*1.15;


UPDATE funcionario SET idade = 35, salario = 1890
WHERE codfunc = 3;
UPDATE produto SET codCat = 10
WHERE codProd = 3;
ERRO: insero ou atualizao em tabela produto viola restrio de chave
estrangeira produto_codcat_fkey
DETAIL: Chave (codcat)=(10) no est presente na tabela categoria.
Chamamos a ateno para problemas de violao de chave estrangeira, devendo ser informado um valor existente de PK da tabela relacionada tambm no processo de alterao dos
valores de um registro em uma tabela do banco de dados.

DELETE
O comandoDELETEapaga um determinado registro ou um conjunto de registros que satisfaam uma determinada condio. Esse comando retorna o nmero de registros removidos
da tabela ou um cdigo de erro, sendo a sua sintaxe apresentada a seguir.

DELETE FROM <nomeTabela>


[WHERE <expressoCondicional>];
Exemplos:

DELETE FROM aluno;

Modelagem de Bancos de Dados

DELETE FROM funcionario WHERE codfunc = 3;

84

Saiba mais
O problema de violao
de chave estrangeira
tambm pode ocorrer
na execuo de um
comando DELETE, conforme pudemos ver no
exemplo.

DELETE FROM categoria WHERE codcat = 1;


ERRO: atuailzao ou excluso em tabela categoria viola restrio de chave
estrangeira produto_coscat_fkey em produto
DETAIL: ahve (codcat) = (1) ainda referenciada pela tabela produto

********** Error **********

TRUNCATE
Esse comandoexclui todas as linhas de uma tabela ou de uma lista de tabelas de forma
mais rpida que ocomandoDELETE, apresentando ganho de performance por no permitir
a incluso de restries com o uso da clusula WHERE. O TRUNCATE remove rapidamente
todas as linhas da tabela e recupera espao em disco imediatamente (muito til em tabelas
grandes). Sua sintaxe :

TRUNCATE [TABLE] [ONLY] <nomeTB> [, ... ]


[RESTART IDENTITY|CONTINUE IDENTITY]
[CASCADE|RESTRICT];

SELECT
o comando DML utilizado para manipular os dados armazenados nas estruturas das
tabelas de um banco de dados, retornando os campos desejados de todos os registros que
satisfazem a condio estabelecida. O resultado apresentado na forma de um cursor,
que uma tabela temporria que pode ser entendida como uma matriz em que cada linha
contm um registro e cada coluna corresponde a um campo indicado no comando SELECT,
que deu origem ao cursor. A sintaxe desse comando apresentada a seguir.

SELECT <listaCampos>
FROM <listaTabelas>
[WHERE <expressoCondicional>]
[...];
Na figura 5.5, temos um exemplo simples do comando SELECT juntamente com o cursor que
gerado atravs da sua execuo.

Figura 5.5
Tabela temporria
com o resultado
de uma consulta
SELECT.

Outros Exemplos:

SELECT descrProd FROM produto


WHERE vlrProd >= 2000;

SELECT * FROM produto


WHERE codCat = 2 AND vlrProd < 500;

Captulo 5 - Comandos DML CRUD e operaes sobre conjuntos

SELECT pnome, endereco FROM empregado;

SELECT * FROM trabalha WHERE horas > 20;


85

Operadores
Resumo dos principais operadores:

11 Asterisco (*): lista todos os campos.


22 Exemplo: SELECT * FROM produto;
11 Aritmticos: +, -, *, /
11 Aplicados no SELECT ou no WHERE sobre campos numricos.
11 Relacionais: =, <>, >, >=, <, <=
11 Lgicos: AND, OR, NOT.
Existem funes especializadas na especificao SQL (manipulao de string, data/
hora, nmeros/estatsticas), implementadas de formas diferentes nos SGBDs.
Operadores so usados dentro da estrutura do comando SELECT para possibilitar, entre
outras, a filtragem de dados ou condies de restries. Geralmente so utilizados para possibilitar a busca por dados que satisfaam determinadas situaes onde no h a necessidade
de visualizao de todos os dados gravados nas tabelas de um determinado banco de dados.
Um operador interessante o LIKE, que permite a comparao entre substrings. Esse operador trabalha com o %, que funciona como uma espcie de coringa na definio de partes
de um substring. Os exemplos a seguir ilustram melhor o funcionamento desse operador:
11 WHERE nome LIKE %ANA%' (contm ANA)

11 WHERE nome LIKE AN% (comeam com AN)


11 WHERE nome LIKE %M (terminam com M)
11 WHERE nome LIKE _A% (contm a 2 letra A)
11 WHERE nome LIKE _ _ _ (contm 3 caracteres)
11 contm _ ou %: WHERE nome LIKE %\\_%
11 SELECT * FROM empregado
22 W HERE nome LIKE %ana%;
Nota: no PostgreSQL, h diferena de maiscula e minscula na pesquisa com string.
Outros operadores que podem ser teis em ocasies especficas so o BETWEEN...AND...,
IS NULL e IN. A seguir, descrevemos rapidamente cada um deles com seus respectivos
exemplos de utilizao.
11 Operador BETWEEN...AND...: comparaes com valor numrico

Modelagem de Bancos de Dados

WHERE salario BETWEEN 3000 AND 4000;

86

11 Operador IS NULL: um valor nulo


SELECT nome FROM empresa
WHERE contato IS NULL;
11 Operador IN: comparao com uma lista de valores
SELECT * FROM empregado
WHERE salario IN (500, 700, 200);
... WHERE nome IN (JOANA, ANA, MARIA);

Operadores negativos
importante destacar o uso dos operadores de negao, que podem ser aplicados juntamente com os operadores anteriormente descritos, estabelecendo restries que trazem
como resultado tudo o que NO satisfaz a condio estabelecida. A seguir apresentamos
exemplos de como usar esse tipo de operador.
11 <>: diferente

WHERE salario <> 1243;


11 NOT <nomeCampo> =: diferente do campo

WHERE salario NOT = 1243;


11 NOT <nomeCampo> >: no maior que

WHERE salario NOT > 1243;


11 NOT BETWEEN...AND...: no entre dois valores informados

WHERE salario NOT BETWEEN 3000 AND 4000;


11 NOT IN (<valor1>,...): no existente em uma dada lista de valores

WHERE nome NOT IN ('JOANA', 'ANA', 'MARIA');


11 NOT LIKE ...: diferente do padro de caracteres informado

WHERE nome NOT LINE '%ana%';


11 IS NOT NULL: no um valor nulo

WHERE contato IS NOT NULL;

Comandos especiais
Apesar de inicialmente parecer ser um comando simples, o SELECT admite uma srie de
possibilidades para permitir que seu uso seja bastante amplo. Assim, junto com o SELECT,

11 Clculo no SELECT
Exemplo: Exibir salrio com aumento de 10%

SELECT salario*1.1 FROM funcionario;


11 Uso de apelidos em campo com AS

SELECT salario AS Atual, salario*1.1 AS Novo Salrio


FROM empregado;
11 Remoo de valores duplicados em uma coluna com DISTINCT

SELECT DISTINCT cidade FROM cliente;

q
Captulo 5 - Comandos DML CRUD e operaes sobre conjuntos

podem ser aplicados comandos especiais, conforme podemos ver nos exemplos a seguir.

87

ORDER BY
Outro aspecto a ser considerado como ordenar o resultado de um comando SELECT qualquer.
Para isso, temos a clusula ORDER BY, que admite algumas variaes para indicar a ordenao
que deve ser seguida e que apresenta as seguintes caractersticas:
11 Ordena por um ou mais campos especificados (usar como critrio de desempate);

11 De modo crescente (ASC-padro) ou decrescente (DESC);


11 Pode ser especificado um nmero representando a ordem de definio no SELECT.
A figura 5.6 traz um exemplo do uso da clausula ORDER BY e o cursor gerado refletindo a
ordenao determinada.

SELECT pnome, salario


FROM empregado
ORDER BY pnome; -- ORDER BY 1
Figura 5.6
Tabela temporria
com o resultado
de uma consulta
SELECT ordenada
por pnome.

importante destacar que possvel ordenar o resultado de acordo com o resultado de


funes aplicadas nos dados selecionados, e que provavelmente no ficaro imediatamente
aparentes. Um exemplo disso apresentado na figura 5.7.
Exemplo: ordenar pelos quatro ltimos dgitos do SSN
11 Uso da funo nativa RIGHT(expresso, n char)

SELECT pnome, ssn


FROM empregado

Modelagem de Bancos de Dados

ORDER BY RIGHT(ssn,4);

88

Figura 5.7
Resultado de um
SELECT ordenado
por parte do ssn.

LIMIT
A clusula LIMIT, como o prprio nome indica, impe um limite para a quantidade de
registros retornados por um comando SELECT. Assim, o cursor gerado conter no mximo o
nmero de registros indicados pela clusula, sendo por isso mesmo comumente utilizada
Figura 5.8
Tabela temporria
com o resultado
de uma consulta
SELECT com LIMIT.

em consultas de ranqueamento. Esta pode ser utilizada em conjunto com a clusula


OFFSET <incio>, que permite desconsiderar uma quantidade determinada dos registros
inicialmente retornados pela consulta. Na figura 5.8, temos o exemplo de um SELECT que vai
consultar os trs maiores salrios da tabela empregado, juntamente com o resultado obtido.

SELECT pnome, salario


FROM empregado
ORDER BY salario DESC

Atividade de fixao

Juno de tabelas
A operao de juno usa a combinao de tuplas, que indicam um relacionamento entre
tabelas em um banco de dados, para possibilitar a execuo de consultas SQL que necessitam produzir resultados com dados de oriundos de duas ou mais tabelas.
A ligao ou vnculo entre duas ou mais tabelas feita atravs da chave primria de uma
tabela e das chaves estrangeiras das demais. preciso, contudo, especificar a condio de
juno e o uso de apelidos para as tabelas envolvidas pode ajudar a deixar o comando SELECT
mais fcil de ser entendido. Na figura 5.9, temos um exemplo onde se deseja listar o departamento e os empregados que nele esto lotados, ordenando o resultado por departamento.

FROM empregado e, departamento d


WHERE e.dno = d.dnumero
ORDER BY d.dnome, e.pnome;

Captulo 5 - Comandos DML CRUD e operaes sobre conjuntos

SELECT d.dnome, e.pnome

89

A partir da publicao do padro SQL-92, a sintaxe da linguagem passou a admitir o uso da


clusula JOIN, trazendo mais portabilidade e legibilidade para as operaes de juno de
mltiplas tabelas, j que dessa forma as condies da juno ficam separadas das condies
de filtro (WHERE).

Tipos de Juno (JOIN):


11 Interna (INNER): sero includas somente as linhas que satisfazem a condio de
juno. Tambm pode ser Cruzada (CROSS) ou Natural (NATURAL, servidor determina
a juno);
11 Externa (OUTER): sero includas linhas que satisfaam a condio de juno e as
linhas restantes de uma das tabelas da juno. Pode ser RIGHT, LEFT ou FULL.
A seguir, so analisados os diferentes tipos de JOIN existentes.

Juno Interna
A Juno Interna (INNER JOIN) utilizada para especificar forma de juno com uso de chave
estrangeira e da subclusula ON. Se no h dado de relao, ento a tupla no aparece no resultado (se necessrio mostrar, usar juno externa). A sintaxe do SELECT com esse tipo de juno :

SELECT <listaCampos>
FROM <Tabela1>
INNER JOIN <Tabela2> ON t1.<pk> = t2.<fk>
[INNER JOIN <Tabela3> ON t3.<pk> = <t2.fk>...];
Na figura 5.10, so apresentados alguns exemplos do uso da clusula INNER JOIN e o
comando SELECT equivalente utilizando apenas a clusula WHERE.

Juno de Tabelas
Exemplos:

SELECT c.descrCat, p.descrProd


FROM categoria c
INNER JOIN produto p ON c.codCat = p.codCat ;
no lugar de
SELECT c.descrCat, p.descrProd

Categoria (@codCat, descricao)


Produto(@codProd, descricao, @codCat)
Cliente(@codCli, nome)
pedido(@codPedido, valorTotal, @codCli)

FROM categoria c, produto p


WHERE c.codCat = p.codCat;
SELECT DISTINCT a.nomealu
Modelagem de Bancos de Dados

FROM matricula m

90

INNER JOIN aluno a ON m.codalu = a.codalu


WHERE m.faltas = 0;
no lugar de

Professor (@codProf, nomeProf)


Aluno(@numAlu, nomeAlu)
Disciplina(@codDisc, descDisc, @codProf)
matricula(@numAlu, @codDisc, nota, faltas)

SELECT DISTINCT a.nomealu


FROM matricula m, aluno a
WHERE m.faltas = 0 AND m.codalu = a.codalu;
Figura 5.9
Exemplo de
INNER JOIN.

Se os nomes dos campos forem iguais nas tabelas, pode-se usar a subclusula USING, conforme o seguinte exemplo:

SELECT c.descrCat, p.descrProd


FROM categoria c
INNER JOIN produto p USING (codCat);
Outro ponto a ser lembrado que a juno interna ser sempre feita por padro, sendo
portanto opcional utilizar INNER no comando.

SELECT c.descrCat, p.descrProd


FROM categoria c
[INNER] JOIN produto p USING (codCat);

Juno Cruzada
A Juno Cruzada, por sua vez, corresponde ao produto cartesiano das tabelas envolvidas.
Ela a juno realizada quando no se especifica ON no comando. No um tipo de juno
utilizado com frequncia, mas muitas vezes realizada justamente pelo esquecimento do
uso do ON no comando. A figura 5.11 traz um exemplo de juno cruzada.

SELECT c.descrCat, p.descProd


FROM categoria c

Figura 5.10
Tabela temporria
com o resultado
de uma juno
cruzada entre duas
tabelas.

Captulo 5 - Comandos DML CRUD e operaes sobre conjuntos

[CROSS] JOIN produto p;

91

Juno natural
A Juno Natural tem esse nome por deixar para o SGBD determinar as condies de juno.
A figura 5.12 traz um exemplo de juno natural.

SELECT c.descrcat, p.descprod


FROM categoria c
NATURAL JOIN produto p;

Figura 5.11
Tabela temporria
com o resultado de
uma juno natural
entre duas tabelas.

Autojunes
Esse um recurso utilizado quanto temos um autorrelacionamento no modelo fsico do
banco de dados. Ou seja, quando preciso fazer uma juno com dados de uma mesma
tabela (relacionamento unrio). A figura 5.13 traz um exemplo desse tipo.

SELECT s.pnome AS supervisor,


e.pnome AS supervisionado
FROM empregado e
INNER JOIN empregado s ON s.ssn = e.superssn

Modelagem de Bancos de Dados

ORDER BY s.ssn;

92

Figura 5.12
Tabela temporria
com o resultado de
uma autojuno.

Juno de trs ou mais tabelas


A juno de trs ou mais tabelas feita atravs do uso sucessivo das clusulas INNER
JOIN <tabela> ON <condioJuno>. A ordem das tabelas no JOIN irrelevante, j que
a escolha da tabela condutora feita pelo SGBD. Na figura 5.14, temos um exemplo da
juno de trs tabelas.

SELECT d.dnome, p.pjnome, t.essn, e.pnome


FROM projeto p
INNER JOIN departamento d ON p.dnum = d.dnumero
INNER JOIN trabalha t ON p.pnumero = t.pno
INNER JOIN empregado e ON e.ssn = t.essn;

Figura 5.13
Tabela temporria
com o resultado de
uma juno entre
trs tabelas.

Caso voc esteja se perguntando, possvel, sim, informar a mesma tabela mais de uma vez em
uma mesma consulta. O exemplo a seguir demonstra o uso de uma mesma tabela duas vezes.

SELECT <campos>
FROM <tabela_ta> tA
INNER JOIN <tabelaT> t1 ON tA.chave = t1.campoT

INNER JOIN <tabelaT> t2 ON tB.chave = t2.campoT;


Outra possibilidade o uso de subconsultas na construo de uma tabela temporria, conforme demonstrado no seguinte exemplo:

SELECT <campos>
FROM <tabela t>
INNER JOIN (subconsulta1) s1 ON t.chave = s1.campo1S1
INNER JOIN (subconsulta2) s2 ON s1.campo2S2 = s2.campo;
Veja que subconsulta1 e subconsulta2 representam instrues SQL que iro retornar seus
respectivos cursores (tabelas temporrias) com informaes necessrias para retornar a
tabela temporria final desejada.

Junes equivalentes x no equivalentes


Junes no equivalentes so aquelas que no fazem uso de chave estrangeira. A seguir so
apresentados exemplos para ajudar a entender esse conceito.

Captulo 5 - Comandos DML CRUD e operaes sobre conjuntos

INNER JOIN <tabela_tb> tB ON tA.chave = tB.chave

93

Exemplo 1: encontrar funcionrios que comearam a trabalhar na loja enquanto um produto


X estava sendo oferecido:

SELECT e.nome, e.dtinicio


FROM empregado e
INNER JOIN produto p
ON e.dtini >= p.dtini AND e.dtini <= p.dtfim
WHERE pnome = 'X';
Exemplo 2: formar um torneio de xadrez de modo que um empregado no jogue com ele mesmo.

SELECT e1.pnome AS competidor1,'VS',


e2.pnome AS competidor2
FROM empregado e1
INNER JOIN empregado e2
ON e1.ssn > e2.ssn;
A figura 5.15 apresenta o curso resultante da execuo do SELECT do exemplo 2 anterior.
Vejam que so oito empregados, mas uma mesma pessoa no deve jogar consigo mesmo.
Assim, teramos 8x7 = 56 registros. Mas uma partida entre comp1 x comp2 equivalente a
uma partida entre comp2 x comp1. Desse modo, o resultado final deve ter 28 registros (ou
partidas). Para alcanar esse resultado, necessrio especificar que e1.ssn > e2.ssn.

Modelagem de Bancos de Dados

Figura 5.14
Tabela temporria
com o resultado
de uma juno no
equivalente.

94

Juno externa
Tipos de OUTER JOIN:

11 A palavra-chave LEFT especifica que a tabela do lado esquerdo responsvel por


determinar o nmero de linhas do conjunto-resultado.
11 A palavra-chave RIGHT especifica que a tabela do lado direito usada para fornecer
valores de consulta sempre que uma correspondncia encontrada.
11 Nas pesquisas com FULL OUTER JOIN o resultado trar todos os registros, ao menos
uma vez, que estejam nas dois tabelas, tanto a da esquerda do JOIN quanto a da
direita do JOIN.
Uma juno externa (OUTER JOIN) utilizada sempre que se deseja ver quais linhas de uma
tabela esto relacionadas a outra tabela e quais linhas no esto. Por exemplo, em uma situao em que temos CLIENTES e seus PEDIDOS armazenados em um BD, pode ser necessrio
descobrir quais clientes tm pedido e quais no tem pedido algum.
A juno externa pode tambm ser til quando se deseja verificar se existem membros
rfos em um SGBD, ou seja, tabelas cujas PK e FK estejam sem sincronia (lembrando que
SGBDs mais modernos no permitem que isso venha a acontecer).
Um OUTER JOIN s pode ser realizado entre duas tabelas, mas admite algumas variaes,
conforme veremos a seguir.
So apresentados a seguir exemplos do uso de junes externas. O primeiro exemplo trar
como resultado os clientes que tem e os que no tm pedido. Os clientes sem pedido sero
aqueles onde aparece null ao lado dos respectivos nomes.

SELECT c.nome, p.codcli, p.numped


FROM cliente c
LEFT OUTER JOIN pedido c ON c.codigo = p.codcli;
J o segundo exemplo, a seguir, retornar a capacidade de carga de todos os veculos na
exemplo demonstra um uso comum para o OUTER JOIN quando temos casos de generalizao ou especializao.

SELECT v.placa, c.carga


FROM veiculo v
LEFT OUTER JOIN caminhao c ON v.placa = c.placa;

Operaes sobre conjuntos


Operaes sobre conjunto trabalham com a teoria de conjuntos implementada na lgebra
relacional.
As operaes da lgebra relacional so normalmente divididas em dois grupos. O primeiro
deles inclui um conjunto de operaes da teoria de conjuntos. As operaes so UNION,
INTERSECTION, DIFFERENCE e CARTESIAN PRODUCT. O segundo grupo consiste em operaes desenvolvidas especificamente para bases de dados relacionais, tais como: SELECT,
PROJECT e JOIN.

Captulo 5 - Comandos DML CRUD e operaes sobre conjuntos

tabela. Notem que dever aparecer null ao lado das placas que no so de caminho. Esse

95

As Junes e Operaes sobre Conjuntos ajudam a entender as operaes de juno sobre


tabelas vistas em 5.7. Ainda que voc possa interagir com os dados em um BD uma linha por
vez, a verdadeira razo de ser dos BDs relacionais est na possibilidade de enxerg-los como
conjuntos, conforme exemplificado na figura 5.16.

LEFT OUTER JOIN

INNER JOIN
(similar ao INTERSECT)

RIGHT OUTER JOIN

FULL OUTER JOIN


(similar ao UNION)

Figura 5.15
Junes sobre
Conjuntos.

EXCEPT
(ou MINUS em outros SGBDs)

Em PostgreSQL, podemos combinar os resultados de duas consultas utilizando as operaes


de conjunto unio, interseo e diferena, como apresentado na figura 5.17.

Unio

query1UNION [ALL] query2

Interseo

query1INTERSECT [ALL] query2

Diferena
query1EXCEPT [ALL] query2

Figura 5.16
Teoria de
Conjuntos.

Ondequery1equery2so consultas que podem utilizar qualquer uma das funcionalidades


estudadas at agora. As operaes de conjuntos tambm podem ser aninhadas ou encadeadas.
No entanto, para ser possvel calcular a unio, a interseo, ou a diferena entre duas
consultas, essas duas consultas devem sercompatveis, ou seja, ambas devem retornar
o mesmo nmero de colunas. Alm disso, as colunas correspondentes devem possuir o
mesmo tipo de dado. Essas consultas so conhecidas como compostas ou combinadas.
Consulta Composta (ou Combinada):

11 Os conjuntos so representados por SELECT;


11 Ambos os conjuntos devem ter o mesmo nmero de colunas;
11 Tipos de dados de cada coluna ao longo dos dois conjuntos devem ser os mesmos (ou

Modelagem de Bancos de Dados

o servidor deve ser capaz de converter);

96

11 Pode-se empregar ORDER BY: campos da primeira consulta;


11 Precedncia: INTERSECT, parnteses, de cima para baixo.

UNION
Essa operao une o resultado e remove eventuais duplicatas, com efeito semelhante ao
da clusula DISTINCT. Mas se for aplicado o comando UNION ALL, as duplicatas no so
removidas (sendo mais simples para o servidor). Na figura 7.17 vemos exemplos de uso do
comando UNION.

Exemplo 1: listar todos os locais onde existe um departamento ou um projeto.

SELECT plocal FROM projeto


UNION
SELECT dlocalizacao FROM localizacao;

Exemplo 2: mostrar os empregados e os dependentes.

SELECT pnome FROM empregado


UNION ALL
SELECT nomedep FROM dependente;

Figura 5.17
Exemplos
de UNION.

INTERSECT
Retorna os registros presentes tanto na consulta 1 quanto na 2. Se no houver dados em
comum, o conjunto-resultado vazio. As linhas duplicadas so eliminadas, a menos que
INTERSECT ALL seja usado. Exemplos do uso de INTERSECT so apresentados na figura 7.19.

SELECT plocal FROM projeto


INTERSECT
SELECT dlocalizacao FROM localizacao;

Exemplo2: Mostrar apenas os clientes que sejam tambm fornecedores.

SELECT nome FROM cliente


Figura 5.18
Exemplos de
INTERSECT.

INTERSECT
SELECT nome FROM fornecedor;

EXCEPT
A operao EXCEPT retorna todos os registros presentes no resultado da consulta 1, mas
no no resultado da 2 (chamado s vezes de diferena entre duas consultas). Mais uma vez,
as duplicatas so eliminadas, a menos que seja utilizado a clusula EXCEPT ALL. A figura 5.20
traz exemplos utilizando essa operao.

Captulo 5 - Comandos DML CRUD e operaes sobre conjuntos

Exemplo 1: Listar todos os locais onde existe ambos um departamento e um projeto.

97

Exemplo 1: construa uma lista de todos os locais onde existe um departamento, mas nenhum projeto.

SELECT dlocalizacao FROM localizacao


EXCEPT
SELECT plocal FROM projeto;
Exemplo 2: Mostrar apenas os clientes que no sejam fornecedores

SELECT nome FROM cliente


EXCEPT
SELECT nome FROM fornecedor;

Modelagem de Bancos de Dados

Figura 5.19
Exemplos de
EXCEPT.

98

6
Aprender sobre o processo de escrita de consultas SQL/DML com o uso de recursos
que possibilitam a manipulao de dados de forma a organiz-los e format-los de
acordo com a necessidade do projeto.

conceitos

Funes agregadas, agrupamento e funes nativas.

Exerccio de nivelamento e
Voc j manipulou tabelas em banco de dados com funes agregadas ou nativas? Em caso de
resposta afirmativa, voc o fez como DBA ou como programador? Cite o banco de dados e/ou
a linguagem de programao caso tenha utilizado, bem como algumas das funes utilizadas.

Funes agregadas
Alguns exemplos desse tipo de funo so:

11 AVG(expresso): retorna o valor mdio de um conjunto.


11 COUNT(*) ou COUNT(expresso): retorna a quantidade de valores de um conjunto.
11 MAX(expresso): retorna o valor mximo dentro de um conjunto.
11 MIN(expresso): retorna o valor mnimo dentro de um conjunto.
11 SUM(expresso): retorna a soma dos valores de um conjunto.
As funes agregadas ou de agrupamento no podem ser usadas na clusula WHERE de
uma consulta SQL/DML. Elas foram desenvolvidas para serem utilizadas entre a clusula
SELECT e FROM.
Funes agregadas so utilizadas para produzir resultados nicos para um conjunto de
dados contendo vrias linhas (tuplas) fornecidas como entrada, geralmente representando
dados armazenados em tabelas. Essas funes fornecem capacidades adicionais clusula
SELECT por realizarem clculos com base em critrios estabelecidos.

Captulo 6 - Funes agregadas e nativas

objetivos

Funes agregadas e nativas

99

Nos exemplos recm-citados, expresso indica qual campo ser utilizado para o agrupamento que se deseja como resultado dessa consulta. As instrues ALL e DISTINCT podero
ser utilizadas para indicar se todos os registros afetados sero utilizados no agrupamento
solicitado ou se sero descartadas possveis duplicidades, respectivamente.
Outro ponto importante a se considerar quanto ao contedo armazenado no atributo da
expresso. O registro que tiver o contedo NULL no atributo da expresso no ser contabilizado no agrupamento.
sempre til consolidar novos conhecimentos atravs de exemplos. Assim, para ilustrar o
uso de funes agregadas, vamos tomar como base o conjunto de tabelas apresentado na
figura 6.1.
ALUNO

codigo
nome

PROFESSOR

(0,n)

codigo
nome

(1,1)
nota

matriculadoEm

codigo
(1,n)

nome

DISCIPLINA

(1,n)

leciona

faltas

Figura 6.1
Modelo de dados
'Escola' utilizado
para ilustrar o
uso de funes
agregadas.

A seguir, na figura 6.2, apresentamos um conjunto de exemplos onde as funes agregadas


so usadas.

Modelagem de Bancos de Dados

Exemplo 1: contar o nmero de


alunos com nota inferior a 7,
em qualquer disciplina.

100

Exemplo 2: mdia das notas do


aluno com cdigo 2.

Exemplo 3: total de faltas do


aluno com cdigo 5.

Exemplo 4: menor nota da


disciplina 5 (Redes I).

Figura 6.2
Exemplos do uso de
funes agregadas.

Agrupamento
Agrupamento um recurso que podemos utilizar no processamento de consultas SQL/DML
quando h a necessidade de trabalharmos com funes agregadas em conjuntos especficos

Em muitos casos necessrio aplicar as funes agregadas para um subgrupo de tuplas


definido com base em alguns atributos. Por exemplo, considere a necessidade de calcular a
mdia de salrio de cada departamento ou nmero de empregados por projeto.
Isso possvel atravs do uso da clusula GROUP BY, que permite particionar a relao em
grupos. Esses grupos no podem se sobrepor, tomando como base valores iguais dentro de
um ou mais de seus atributos (atributo de agrupamento).
Para demonstrar o uso de agrupamento, vamos utilizar um outro modelo de dados, reproduzindo informaes sobre uma empresa qualquer e que pode ser visto na figura 6.4.

Captulo 6 - Funes agregadas e nativas

de dados do banco, e no sobre todos os dados.

101

Empregado

Dependente

Localizao

Trabalha

Departamento

Projeto

Figura 6.3
DB Empresa base
para diversos
exemplos nesta
sesso.

Exemplo 1: para cada departamento, listar seu nome, nmero


de empregados que nele trabalham e a mdia de seus salrios.
Importante: o PostgreSQL exige
a indicao dos campos selecionados (que no aplicados no
grupo ou funes agregadas)
na clusula GROUP BY: e.dno,
d.dnome;

Modelagem de Bancos de Dados

Exemplo 2: para cada projeto,


liste seu nmero, seu nome e o
nmero de empregados que nele
trabalham.

102

Figura 6.4
Exemplos do uso
de agrupamento.

Algumas vezes necessrio recuperar os valores dessas funes agregadas somente para
grupos que satisfaam certas condies. Isso pode ser conseguido atravs do argumento
HAVING, similar ao parmetro WHERE. Sua funo a de filtrar registros dentro de uma
consulta SQL/DML em execuo. A diferena que o HAVING aplicado sobre os registros
agrupados pelo argumento GROUP BY.
A clusula GROUP BY deve ser colocada antes da HAVING, pois os grupos so formados e as
funes agregadas so calculadas antes de se resolver a clusula HAVING. Ilustramos o uso
dessas clusulas nos exemplos da figura 6.5.
Exemplo 3: igual ao Exemplo 2,
exceto por considerar apenas
projetos com mais de dois
empregados.

SELECT p.pnumero, p.pjnome, COUNT(*) AS No. Emp


FROM trabalha t
INNER JOIN projeto p ON t.pno = p.pnumero
GROUP BY t.pno, p.pnumero, p.pjnome
HAVING COUNT(*) > 2;

Exemplo 4: a clusula WHERE


no pode ser utilizada para restringir grupos que devero ser
exibidos.

SELECT d.dnome, AVG(e.salario)


FROM departamento d
INNER JOIN empregado e ON e.dno = d.dnumero
WHERE COUNT(e.ssn) > 2
GROUP BY e.dno, d.dnome;
Resultado:
ERRO: agregao no permitida na clusula WHERE.
LINE 4: WHERE COUNT(e.ssn) > 2

Exemplo 5: listar o nome da disciplina e a mdia de notas em cada


uma delas, para disciplinas com
mais de doi alunos matriculados.

SELECT d.nomedisci, AVG(m.nota)


FROM disciplina d
INNER JOIN matricula m ON m.coddisci = d.coddisci
GROUP BY m.coddisci, d.nomedisci

Figura 6.5
Exemplos do uso da
clusula HAVING.

Lembre-se, portanto, de que a clusula HAVING proporciona a aplicao de uma condio


para o grupo de tuplas associado a cada valor dos atributos do agrupamento. Seu funcionamento est diretamente ligado ao uso da clusula GROUP BY e no deve ser confundido com
a clusula WHERE.

Captulo 6 - Funes agregadas e nativas

HAVING COUNT(codmat) > 2;

103

Funes Nativas
Sistemas Gerenciados de Banco de Dados geralmente fornecem um conjunto de funes
que auxiliam na manipulao dos tipos de dados primitivos por eles disponibilizados.
A grande maioria dessas funcionalidades dependente de um determinado SGDB, no
sendo especificadas pelo padro SQL. Operadores para cadeia de caracteres, funes para
formatao dos tipos data e hora, funes e operaes geomtricas, entre outros, so
recursos que os SGBDs podem oferecer para seus usurios com o intuito de facilitar a realizao de determinadas operaes sobre os dados neles armazenados.

Informaes do sistema e de sesso


Obter verso do SGBD, data/hora do sistema, usurio e database atuais.

SELECT version(), now();


SELECT current_user, current_database();

Figura 6.6
Funes Nativas
Informaes de
SGBD e sesso.

Manipulao de data/hora
Obter data e hora atuais e obter partes do timestamp (Padro SQL-2003).

SELECT current_date, current_time, localtimestamp;

EXTRACT(field FROM timestamp)


Onde field pode ser qualquer um dos seguintes identificadores:
century

milliseconds

day

minute

decade

Month

dow / isodow: day of the week

quarter

Modelagem de Bancos de Dados

as Sunday(0/1) to Saturday(6/7)

104

second

doy: day of the year (1: 365/366)

timezone

epoch

timezone_hour

hour

timezone_minute

microseconds

week

millennium

year / isoyear

Figura 6.7
Funes que
manipulam data,
hora e timestamp.

Um exemplo interessante, e muitas vezes til, o de como fazer para calcular idades.
Na figura a seguir, so exibidos dois mtodos diferentes.
Mtodo 1: uso de operador para calcular
a diferena de anos.
SELECT pnome,
EXTRACT(YEAR FROM NOW())
EXTRACT(YEAR FROM datanasc)
AS idade
FROM empregado;

Mtodo 2: funo AGE


SELECT pnome, AGE(datanasc) AS idade
FROM empregado;

Figura 6.8
Mtodos para
clculo de idade.

Outra funo nativa para manipular datas a DATE_PART, semelhante funo EXTRACT
vista acima e que inclusive utiliza os mesmos identificadores apresentados na figura 6.7
como parmetros. Sua sintaxe a seguinte:

DATE_PART(text, timestamp)
No exemplo a seguir as so utilizadas as funes EXTRACT e DATE_PART para extrair partes
da data atual, NOW(), com o resultado obtido sendo apresentado logo a seguir.

SELECT EXTRACT(CENTURY FROM NOW()) as seculo,


DATE_PART('doy', NOW()) as diasano, DATE_PART('day', NOW()) as
diaatual,
DATE_PART('hour', NOW()) as hora, DATE_PART('month', NOW()) as

Captulo 6 - Funes agregadas e nativas

mesatual;

105

Na figura 6.9, temos uma srie de exemplos ara ilustrar o uso de operadores com datas.
calcular nova data a partir de um intervalo especfico:

SELECT date '2014-02-10' AS compra,


date '2014-02-10' + 30 AS vencimento;
calcular intervalo de dias entre datas.

SELECT date '2014-03-28': date '2014-03-12' as diferenca;


SELECT time '05:00:30': time '03:00:46';

SELECT timestamp '2001-09-28 23:00' interval '28


hours';

SELECT 500 * interval '1 second';

As funes para formatao de Data/Hora so tambm muito utilizadas, onde TO_CHAR


converte um carimbo do tempo em um conjunto de caracteres, e TO_DATE converte um
conjunto de caracteres em data. A sintaxe de TO_CHAR :

TO_CHAR(timestamp, text)

Figura 6.9
Funes Nativas
exemplo de uso de
operador com data
e hora.

Vejam que text um conjunto de caracteres que pode funcionar como uma mscara para
um formato final desejado. o caso da mscara 'DD/MM/YYYY', onde DD ser substitudo
por dia do ms. Qualquer parte do texto que no seja reconhecido como um modelo ou
mscara padro simplesmente copiado sem alterao.
Existe uma grande quantidade de modelos ou mscaras padro para a formatao de
data e hora.
importante lembrar que a funo TO_CHAR pode converter outros tipos de dados em
um conjunto de caracteres, bastando passar como parmetro um nmero (int ou double)
no lugar do timestamp. Nesse caso, haver modelos ou mscaras padro para nmeros,
tambm disponveis nesse link.

Modelagem de Bancos de Dados

A seguir, apresentamos exemplos de formatao de datas.

106

SELECT TO_CHAR(now(), 'DD/MM/YYYY');

SELECT TO_CHAR(now(), 'FMday, DD FMmonth


YYYY');

SELECT TO_CHAR(current_timestamp,
'HH24:MI:SS');

Figura 6.10
Funes Nativas
exemplo de
formatao
de data.

Manipulao de String
A manipulao de strings pode ser feita atravs de operadores e funes nativas. O operador de concatenao || vai juntando conjuntos de caracteres em sequncia e as funes
existentes permitem extrair ou substituir trechos de strings, contar o nmero de caracteres,
alterar a caixa, entre outras funes. Na figura a seguir apresentamos alguns exemplos.
Concatenao: operador ||.

SELECT pnome || ' ' || inicialm || '. ' || unome


AS Nome Completo FROM empregado;

Converso caixa altaUPPER e caixa baixa-LOWER.

SELECT UPPER('banco'), LOWER('BANCO');

Obter nmero de caracteres em uma string (length).

SELECT CHAR_LENGTH('banco');

Converte a 1 letra de cada palavra em caixa alta.

SELECT INITCAP('oi MUNDO');

Captulo 6 - Funes agregadas e nativas

Figura 6.11
Funes Nativas
exemplo de
formatao de
string.

107

J o exemplo da figura 6.12 aplica um conjunto de funes para o nome dos dependentes na
tabela dependente da figura 6.3. As funes utilizadas so:
11 POSITION: obter a localizao de uma substring;
11 SUBSTRING: obter a substring a partir de uma posio, x caracteres;
11 OVERLAY: substituir uma substring a partir de uma posio, x caracteres.

SELECT nomedep,
POSITION('ana' IN nomedep),
SUBSTRING(nomedep FROM 3 FOR 4),
SUBSTRING(nomedep,3,4),
OVERLAY(nomedep PLACING 'pos' FROM 2 FOR 4)
FROM dependente;

Figura 6.12
Funes Nativas
exemplo de
manipulao de
strings.

Manipulao de nmeros
O PostgreSQL apresenta uma quantidade considervel de operadores matemticos que
podem ser utilizados em expresses numricas com os tipos de dados suportados. Os operadores bit a bittrabalham somente em tipos de dado inteiros, enquanto os demais esto

Modelagem de Bancos de Dados

disponveis para todos os tipos de dado numricos.

108

A figura 6.13 traz uma tabela com os operadores matemticos disponveis e exemplos de uso
para cada um deles. A figura traz ainda alguns exemplos adicionais.
Operador

Descrio

Exemplo

Resultado

adio

2+3

subtrao

23

multiplicao

2*3

diviso (diviso inteira trunca o resultado

04/fev

mdulo (resto)

5%4

exponenciao

2.0 ^ 3.0

|/

raiz quadrada

|/ 27.0

|//

raiz cbica

|// 27.0

fatorial

5!

120

!!

fatorial (operador de prefixo)

!! 5

120

Valor absoluto

@ - 5.0

&

AND bit a bit

91 & 15

11

OR bit a bit

32 | 3

35

XOR bit a bit

17 # 5

20

NOT bit a bit

~1

-2

<<

deslocamento esquerda bit a bit

1 << 4

16

>>

deslocamento direita bit a bit

8 >> 4

Exemplos:

Resultados:

5! AS fat,
2^3 AS pot,
5%3 AS resto,
|/9 AS raiz2,
@ -5.2 AS abs;

Captulo 6 - Funes agregadas e nativas

Figura 6.13
Funes Nativas
operadores
matemticos.

109

grande tambm a quantidade de funes disponveis para manipulao de nmeros,


incluindo funes matemticas, trigonomtricas e geomtricas. Apresentamos a seguir, na
figura 6.14, algumas dessas funes com exemplos de uso e respectivos resultados.
Funo

Descrio

Exemplo

Resultado

abs()

valor absoluto

abs(-17.4)

17.4

cbrt()

raiz cbica

cbrt(27.0)

ceil()

o menor inteiro no menor que


o argumento

ceil(-42.8)

-42

exp()

exponenciao

exp(1.0)

2.71828182845905

floor()

o maior inteiro no maior que o


argumento

floor(-42.8)

-43

log()

logaritmo na base 10

log(100.0)

mod(x,y)

resto dey/x

mod(9,4)

pi()

constante

pi()

3.14159265358979

power(a,b)

aelevado ab

power(9.0, 3.0)

729

random()

valor randmico entre 0.0 e 1.0

random()

round()

arredondar para o inteiro mais


prximo

round(42.4)

42

round(v,s)

arredondar parascasas decimais

round(42.4382, 2)

42.44

setseed()

define a semente para as chamadas arandom()

setseed(0.54823)

1177314959

sqrt()

raiz quadrada

sqrt(2.0)

1.4142135623731

trunc()

trunca em direo ao zero

trunc(42.8)

42

trunc(v,s)

trunca comscasas decimais

trunc(42.4382, 2)

42.43

Outras funes
A quantidade de funes nativas disponveis no PostgreSQL realmente muito grande e
variada. Para os que tiverem interesse, sugerimos consultar a documentao disponvel na
internet. De qualquer modo, apresentamos mais alguns exemplos de funes.
ASCII(<char>): Retorna cdigo ASCII

Modelagem de Bancos de Dados

SELECT ASCII('A');

110

CHR(<intCodASCII>): Retorna o caractere

SELECT CHR(66);
LEFT(<str>,<n>): Retorna os n primeiros caracteres

SELECT LEFT('morango',4);
RIGHT(<str>,<n>): Retorna os n ltimos caracteres

SELECT RIGHT('morango',4);

Figura 6.14
Algumas
das funes
matemticas e
trigonomtricas.

REVERSE(<str>): Retorna uma string invertida

SELECT REVERSE('banco de dados');

ENCODE(<text>,<formato>)

SELECT ENCODE('123', 'base64'),


DECODE(<bytea>,<formato>)

SELECT DECODE('MTIz','base64');

Nesses exemplos, o parmetro <formato> das funes ENCODE() e DECODE(), respectivamente para codificao e decodificao de caracteres, pode assumir os seguintes valores:
base64, hex ou escape.

Atividade de Fixao e
Liste duas funes agregadas ou nativas que no foram tratadas nessa sesso mas que
estejam listadas no link indicado no AVA.

Captulo 6 - Funes agregadas e nativas

Figura 6.15
Outros exemplos
de funes nativas.

111

112

Modelagem de Bancos de Dados

7
Entender o processo de escrita e utilizao de subconsultas, ndices e vises, em
conformidade com o padro SQL implementado no PostgreSQL.

conceitos

Subconsultas; ndices, table scan; explain; query plan; Vises.

Exerccio de nivelamento e
Descreva com suas palavras o que voc entende por subconsultas, ndices e vises dentro
de um banco de dados.

Subconsultas
11 Existem trs tipos de subconsultas:

11 ESCALAR: retorna um nico valor.


11 NICA LINHA: retorna uma lista de valores.
11 TABELA: retorna uma ou mais colunas e mltiplas linhas.
Podemos definir uma subconsulta como a combinao de uma consulta (interna) dentro de
outra consulta (externa). Esse recurso possibilita que o resultado da consulta mais interna
seja utilizado pela consulta mais externa.
Como foi visto na sesso anterior, funes agregadas so utilizadas para produzir resultados
nicos para um conjunto de dados contendo vrias linhas (tuplas) fornecidas como entrada,
geralmente representando dados armazenados em tabelas.
J a subconsulta, ou consulta mais interna, pode ser usada no SELECT como uma coluna de
projeo ou nas clusulas FROM, WHERE, GROUP BY e HAVING.

importante lembrar que as subconsultas devem ser sempre escritas entre


parnteses: (q).

Captulo 7 - Subconsultas, ndices e vises

objetivos

Subconsultas, ndices e vises

113

Nesta sesso sero apresentados diversos exemplos para ajudar na compreenso dos
conceitos aqui apresentados. Em todos esses exemplos, sero utilizadas tabelas e dados
conforme exibidos no modelo que aparece na figura 7.1.

Empregado

Dependente

Localizao

Trabalha

Departamento

Projeto

A seguir, analisaremos os trs tipos de subconsultas acima mencionados.

Subconsulta Escalar
uma consulta interna que retorna exatamente um nico valor, ou seja, uma nica linha
com uma nica coluna. Esse valor ser utilizado para que a consulta mais externa produza o
resultado esperado.
Subconsultas escalares so aceitveis (e muitas vezes muito teis) em praticamente qualquer situao onde voc poderia usar um valor literal, uma constante ou uma expresso

Modelagem de Bancos de Dados

para filtrar registros durante o processo de consulta.

114

Figura 7.1
Modelo de dados
de uma Empresa
utilizado como
referencia nos
exemplos.

A figura 7.2 trs um primeiro exemplo com o uso de operadores. Nele so listados os empregados que trabalham no departamento de Pesquisa.

SELECT ssn, pnome, salario


FROM empregado
WHERE dno = (SELECT dnumero

FROM departamento

WHERE dnome = 'Pesquisa');

Figura 7.2
Subconsulta
escalar uso de
operadores.

J o exemplo apresentado na figura 7.3 faz uso de funo agregada. Nele so listados os
empregados cujos salrios so maiores do que o salrio mdio, mostrando o quanto so
maiores (a diferena).

SELECT ssn, pnome, salario - (SELECT AVG(salario)


FROM empregado) AS difSal

FROM empregado
WHERE salario > (SELECT AVG(salario)
FROM empregado);

Figura 7.3
Subconsulta escalar
uso de funo
agregada.

Por fim, temos um exemplo onde se faz uso de funo agregada. Na figura 7.4 apresentada a consulta e seu resultado, listando o nome do empregado e do departamento onde o

SELECT e.pnome, d.dnome, AGE(e.datanasc)


FROM empregado e
INNER JOIN departamento d ON d.dnumero = e.dno
WHERE AGE(e.datanasc) = (SELECT MIN(age(e.datanasc))

Figura 7.4
Subconsulta escalar
uso de funo
agregada.

FROM empregado e

WHERE e.sexo = 'M');

Captulo 7 - Subconsultas, ndices e vises

empregado mais novo do sexo masculino est alocado.

115

Subconsulta NICA LINHA


Uma subconsulta do tipo NICA LINHA aquela em que a consulta interna retorna uma
lista de valores, sendo esses valores utilizados na consulta mais externa que vai produzir o
resultado esperado.
Nesse tipo de subconsulta comum utilizar clusulas para delimitar o escopo da consulta,
conforme a tabela apresentada na figura 7.5.
SMBOLO

SIGNIFICADO

IN

Igual a qualquer um dos valores da lista.

NOT IN

Diferente dos valores existente na lista.

ANY/SOME

Retorna linhas que correspondam a qualquer um dos valores existente na lista.

ALL

Retorna linhas que correspondam a todos os valores existentes na lista.

Vejamos exemplos do uso de cada uma das clusulas apresentadas.

Clusulas IN

Figura 7.5
Subconsulta nica
Linha clusula IN.

Saiba mais

So usadas em subconsultas que produzem resultado tendo como base os valores retornados na subconsulta mais interna.

A traduo de IN EM,
ou seja, que faz parte.

No exemplo da figura 7.6, temos uma consulta que lista os dependentes dos funcionrios
que trabalham no departamento de Pesquisa.

SELECT nomedep, datanascdep, parentesco


FROM dependente
WHERE essn IN (SELECT ssn

FROM empregado

WHERE dno = (SELECT dnumero

Modelagem de Bancos de Dados

116

FROM departamento

WHERE dnome = 'Pesquisa'));

Figura 7.6
Subconsulta nica
Linha clusula IN.

Clusulas NOT IN
So usadas em subconsultas que produzem resultado tendo como base os valores que so
diferentes dos retornados na subconsulta mais interna. A traduo de NOT IN NO EM, ou
seja, que no faz parte (ou no est contido em).

O exemplo de consulta que utiliza a clusula NOT IN pode ser visto na figura 7.7 e mostrar o
nome do empregado que no possui dependente.

SELECT pnome, unome


FROM empregado
WHERE ssn NOT IN (SELECT essn

FROM

dependente);

Empregados

Empregados

e seus dependentes

sem dependentes

Figura 7.7
Subconsulta nica
Linha clusula
NOT IN.

Vejam que o resultado no exemplo ao lado composto, unicamente, pelas colunas selecionadas no SELECT mais externo.
Um segundo exemplo do uso de NOT IN apresentado a seguir. Nele listado o nome das
pessoas da instituio que sejam apenas professores, demonstrando como trabalhar com
generalizao ou especializao no exclusiva (ou compartilhada). Nesse caso, imagine a
existncia da entidade pessoa (generalizada) e suas especializaes professor e aluno.

SELECT nome
FROM professor NOT IN (SELECT nome FROM aluno);

Clusulas ANY/SOME
So usadas com subconsultas (consulta mais interna) que produzem um conjunto de valores
numricos (NICA LINHA, semelhante ao IN). O resultado final, consulta mais externa,
obtido com base em um dos valores retornados pela consulta mais interna. A traduo de
ANY/SOME ALGUM.

para o seguinte:
11 = some: idntico ao IN
11 > some: maior que algum (outros >=, <=, <,<>)
11 <> some: no o mesmo que NOT IN
Na figura 7.8 aparece um exemplo de uso da clusula SOME onde so listados os empregados cujos salrios so maiores do que o salrio de pelo menos um (algum) funcionrio do
departamento 5-Pesquisa.

Captulo 7 - Subconsultas, ndices e vises

O uso de operadores com a clusula SOME pode gerar algumas confuses. Estejam atentos

117

SELECT pnome, salario


FROM empregado
WHERE salario > SOME (SELECT salario

FROM empregado

WHERE dno = '5');

Figura 7.8
Subconsulta nica
Linha clusula
ANY/SOME.

Clusula ALL
Utilizada com subconsultas (consulta mais interna) que produzem um conjunto de valores
numricos. O resultado final, consulta mais externa, obtido com base todos dos valores
retornados pela consulta mais interna. A traduo de ALL TODOS, ou seja, a comparao
feita em relao a todos os elementos contidos no resultado da subconsulta.
Assim, vejamos algumas equivalncias no uso de operadores com o ALL:
11 > ALL: maior que todos (outros >=, <=, <,<>)
11 <> ALL: o mesmo que NOT IN
No exemplo, na figura 7.9, temos o uso do > ALL, que traz como resultado a lista dos empregados cujos salrios so maiores do que o salrio de cada funcionrio do departamento
5-Pesquisa.

SELECT pnome, salario


FROM empregado
WHERE salario > ALL (SELECT salario
FROM empregado

Modelagem de Bancos de Dados

118

WHERE dno = '5');

Figura 7.9
Subconsulta
nica Linha
clusula ALL.

Consultas aninhadas correlacionadas


Nas consultas aninhadas correlacionadas, a consulta mais interna precisa de um dado que
vem da consulta mais externa (query principal). Isso faz com que o SELECT interno seja
executado tantas vezes quantas forem necessrias, dependendo diretamente do nmero de
linhas que so processadas na query principal.

Essa situao pode ser melhor entendida atravs de um exemplo, conforme o apresentado na figura 7.10, onde deseja-se consultar o nome de empregado(s) que tenha(m)
dependente(s) cujo sexo seja o mesmo do empregado em questo.

SELECT pnome, unome


FROM empregado e
WHERE e.ssn IN (SELECT d.essn

FROM dependente d

WHERE e.sexo = d.sexodep);

Figura 7.10
Subconsulta nica
Linha clusula
ALL.

Uma alternativa para essa consulta fazer uso de um INNER JOIN conforme mostrado a
seguir. Destacamos, inclusive, que o INNER JOIN garante um melhor desempenho sempre
que comparado com consultas aninhadas correlacionadas.

SELECT pnome, unome FROM empregado e


INNER JOIN dependente d ON e.ssn = d.essn WHERE e.sexo = d.sexodep

Subconsulta TABELA
uma consulta interna que retorna uma ou mais colunas e mltiplas linhas, ou seja, apresenta
como resultado uma tabela temporria. Nesse caso, a subconsulta faz referncia s variveis
da consulta que a envolve, vistas como constantes durante a execuo da subconsulta.
As clusulas EXISTS e NOT EXISTS foram projetadas para uso apenas com subconsultas do
tipo TABELA, indicando se o resultado de uma pesquisa contm ou no tuplas. No exemplo
da figura 7.11, vemos o uso da clusula EXISTS na consulta aos empregados que trabalham
no departamento de Pesquisa. A figura mostra ainda o INNER JOIN equivalente.

SELECT pnome, unome FROM empregado e


WHERE EXISTS (SELECT d.dnumero FROM departamento d
WHERE e.dno = d.dnumero AND d.dnome = 'Pesquisa');

Figura 7.11
Subconsulta
TABELA clusula
EXISTS.

Melhor desempenho:

SELECT pnome, unome FROM empregado e


INNER JOIN departamento d ON d.dnumero = e.dno

WHERE d.dnome = 'Pesquisa';

Captulo 7 - Subconsultas, ndices e vises

119

J no exemplo da figura 7.12, temos o uso simultneo das clusulas EXISTS e NOT EXISTS,
esta ltima permitindo descobrir quem so os funcionrios que no possuem dependentes.

SELECT pnome, unome


FROM empregado e
WHERE EXISTS (SELECT *

FROM departamento dp

WHERE e.ssn = dp.gerssn)

AND NOT EXISTS


(SELECT *

FROM dependente d
WHERE e.ssn = d.essn);
Figura 7.12
Subconsulta
TABELA clusula
NOT EXISTS.

Inserir dados recuperados de uma tabela em outra


(uso do SELECT)
interessante saber que possvel fazer a incluso de registros resultantes de um SELECT
diretamente dentro de uma instruo INSERT. A sintaxe dessa operao :

INSERT INTO banco.tabela-destino (c1, c2, ...)


SELECT c1, c2,...
FROM banco.tabela-origem;
A determinao dos campos tanto no INSERT quanto no SELECT so opcionais e deve
ser usada quando apenas parte dos campos for copiada.
A figura 7.13 traz um exemplo onde uma tabela gerada para armazenar o nmero de
empregados e a soma dos salrios pagos somente dos departamentos com mais de dois
empregados. Esse tipo de comando pode ser muito til na produo de relatrios Adhoc e

Modelagem de Bancos de Dados

em aplicaes de Business Inteligence e Tomada de Deciso.

120

INSERT INTO deptoinfo


SELECT d.dnumero, d.dnome, COUNT(e.ssn),
SUM(e.salario)
FROM departamento d
INNER JOIN empregado e ON e.dno = d.dnumero
GROUP BY d.dnumero
HAVING COUNT(e.ssn) > 2;

Figura 7.13
Incluso de dados
com uso de SELECT.

possvel tambm fazer a insero de registros durante a criao de uma nova tabela no
banco de dados. Essa funcionalidade geralmente utilizada para realizao de uma cpia
dos dados antes de se realizar algum processamento na tabela de origem. Assim, pode-se
criar uma tabela de testes que poder ser descartada aps o uso, sem a preocupao de
manipulao indevida dos dados da tabela original. Vejamos um exemplo:

CREATE TABLE bkpEmpregado AS


(SELECT * FROM empregado);
Outra possibilidade fazer a atualizao de dados em uma tabela tendo como base o resultado de um SELECT executado com o objetivo de filtrar os registros que sero atualizados.
No exemplo a seguir, temos uma situao onde se deseja atualizar os valores dos produtos
do tipo higiene com incremento de 4%.

UPDATE Produto
SET valor = valor * 1.04
WHERE tipocod IN (SELECT codtipo

FROM Tipo

WHERE nometipo = 'higiene');

Atividade de Prtica

ndices
11 Servidor mantm uma lista de registros para cada tabela (no ordenado)
11 Na busca utiliza table scan (varredura na lista)
22 Funciona bem para poucos registros. Se houver poucos milhes de registros, pode
no responder em tempo razovel
11 Pode ser necessrio ajuda de ndices: tabelas especiais mantidas em ordem especfica
22 No contm todos os dados, somente a(s) coluna(s)
22 Informaes (ponteiros) sobre a localizao das linhas fisicamente

Captulo 7 - Subconsultas, ndices e vises

121

ndices so usados para melhorar o desempenho dos bancos de dados. Um ndice


permite ao servidor de banco de dados encontrar linhas ou tuplas de uma tabela especfica
com muito mais rapidez do que faria sem o ndice.
Esse benefcio, porm, acaba por produzir um trabalho adicional para o SGBD, pelo fato de
ter de se manter estruturas que indicam quais so os ndices existentes e que podero ser
manipulados pelas aplicaes que acessam as tabelas correspondentes. De qualquer modo,
os ndices podem melhorar o desempenho de operaes envolvendo junes, atualizaes e
excluses que contenham condio de procura.
O PostgreSQL implementa quatro tipos de ndices, cada um com o seu grau de eficincia, e

que devem ser utilizados de acordo com as caractersticas da aplicao que deles far uso.
So eles:
11 B-tree: o tipo padro (assume quando no indicamos). So ndices que podem
tratar consultas de igualdade e de faixa, em dados que podem ser classificados.Indicado para consultas com os operadores: <, <=, =, >=, >. Tambm pode ser utilizado
com LIKE, ILIKE, ~ e ~*;
11 R-tree: tipo mais adequado a dados espaciais. Adequado para consultas com os operadores: <<, &<, &>, >>, @, ~=, &&;
11 HASH: indicados para consultas com comparaes de igualdade simples. Atualmente
recomenda-se o B-tree em seu lugar;
11 GiST: utilizado para retornar resultados com perdas, isto , retorna os dados mais rapidamente comparando por coincidncias de bits, prefira usar b-tree que mais confivel.
Os tipos B-tree e GiST suportam ndices comvrias colunas. ndices com mais de um campo
somente sero utilizados se as clusulas com os campos indexados forem ligadas por AND.
Um ndice com mais de trs campos dificilmente ser utilizado.
Os arquivos que contm as informaes dos registros de uma determinada tabela so gravados nos servidores como uma lista. Inicialmente essa lista pode ser consultada por meio
de uma varredura conhecida como table scan, tendo bom funcionamento com uma quantidade reduzida de registros (a consulta percorre cada um dos registros na tabela).
Com o crescimento do conjunto de informaes gravadas em uma tabela, o recurso de table
scan acaba se tornando ineficiente, ponto a partir do qual devemos comear a pensar no
uso de ndices.
ndices so estruturas que foram desenvolvidas com o objetivo nico de facilitar e agilizar o
processo de manuteno de informaes armazenadas nas tabelas de um banco de dados.
11 Por que ento no indexar todas as tabelas em um SGBD?

Modelagem de Bancos de Dados

11 Por que no indexar tudo?

122

22 ESPAO: Todo ndice um tipo especial de tabela


22 PROCESSAMENTO: Qualquer incluso/remoo na tabela (e at atualizao que
afete a(s) coluna(s) do ndice), altera tambm o ndice (atualizao de ponteiros)
11 Portanto, em casos especiais: indexar, executar a rotina e remover o ndice
11 Manter ndices para chaves (primria/estrangeira)
11 Indexar quaisquer colunas que sero frequentemente empregadas em consultas
22 coluna do tipo data boa candidata

Chamamos a ateno para o fato de que h um limite para uso de ndices. Um ndice, antes
de mais nada, um tipo especial de tabela que utilizar espao fsico em disco para armazenar suas informaes. Outro ponto importante que os ndices sempre sero consultados
e atualizados durante o processamento das informaes que esto em suas tabelas.
Dessa forma, orientamos para o uso dos campos que representam chaves primrias ou
estrangeiras, ou mesmo algumas colunas que sero frequentemente empregadas em consultas, como possveis candidatos a ndices de tabelas no banco de dados.
Na realidade, o ideal avaliar a necessidade de criao de cada novo ndice. Para tanto,
podemos medir o tempo para realizar algumas consultas sem o uso do ndice e depois comparar se existem ganhos na realizao das mesmas consultas fazendo uso do ndice. Se os
ganhos no forem significativos, considere excluir o ndice criado.
Os SGBDs mais modernos possuem um otimizador de consultas que ajuda a determinar a
maneira mais eficiente de executar operaes. No PostgreSQL podemos utilizar o comando
EXPLAIN, que permite visualizar todas as etapas envolvidas no processamento de uma consulta SQL/DML. Essa viso do funcionamento interno do banco permite fazer melhorias em
consultas que estejam tomando tempo excessivo.
A sintaxe do EXPLAIN :

EXPLAIN [ANALYZE] [VERBOSE] <consulta SQL>


Onde:
ANALYSE executa de fato o comando e retorna o tempo de execuo.
VERBOSE vai detalhar ainda mais o resultado do comando EXPLAIN.
Na figura 7.14, temos um exemplo do uso do comando EXPLAIN e o resultado exibido aps
sua execuo.

EXPLAIN
SELECT pnome, unome
FROM empregado e
INNER JOIN dependente d ON e.ssn = d.essn
WHERE e.sexo = d.sexodep;

Figura 7.14
Resultado do
EXPLAIN.

J a figura 7.15 demonstra o uso do EXPLAIN com a clusula ANALYZE, fazendo com que o
resultado obtido traga tambm os tempos envolvidos em cada etapa.

Captulo 7 - Subconsultas, ndices e vises

123

EXPLAIN ANALYZE
SELECT pnome, unome
FROM empregado e
WHERE e.ssn IN (SELECT d.essn

FROM dependente d

WHERE e.sexo = d.sexodep);

Figura 7.15
Resultado do
EXPLAIN ANALYZE.

Criando, renomeando e removendo ndices


Podemos utilizar a sintaxe a seguir para a criao explicitas de ndices no SGBD, lembrando
que no PostgreSQL ndices so automaticamente criados quando se define uma PRIMARY
KEY ou FOREIGN KEY durante a criao da estrutura da uma nova tabela.

CREATE [UNIQUE] INDEX <nomeIDX> ON <nomeTB>


[USING Algoritmo] (nomeCOL1 [ASC|DESC]
[NULLS {FIRST|LAST}] [,nomeCOL2...]);
Onde:
11 UNIQUE: no permite a ocorrncia de dados duplicados (ndice exclusivo);
11 nomeIDX: nome da estrutura de ndice que ser criada;
11 nomeTB: nome da tabela que contm a coluna na qual ser criada o ndice de acesso;
11 Algoritmo: mtodo utilizado para manter o ndice e utilizado na busca (BTREE, GIN,
GIST e HASH), sendo BTREE o mtodo escolhido por padro. A escolha do algoritmo
depender do total de registros existentes, variabilidade entre valores da coluna,
entre outros;

Modelagem de Bancos de Dados

11 nomeCOL: nome da(s) coluna(s) sobre a(s) qual(is) ser o criado ndice (pode ser de

124

parte do campo, com uso de funes);


11 Opo ASC/DESC: indica se a criao do ndice ser ordenada de forma crescente
(ASC)-padro ou decrescente (DESC);
11 NULLS {FIRST|LAST}: especifica que nulos sero ordenados primeiro ou no final.
Quando DESC utilizado, nulos so os primeiros por padro.
possvel tambm criar um ndice atravs do assistente do PostgreSQL, conforme
demonstrado na figura 7.16.

Por padro, se nenhum nome for atribudoai ndice,


receber o nome nomeTB_nomeCOL_idx

A sintaxe dos comandos para renomear (ALTER.. RENAME) e excluir (DROP) um ndice bastante simples, conforme mostramos a seguir:

ALTER INDEX <nomeIDX> RENAME TO <novoNomeIDX>;


DROP INDEX [ IF EXISTS ] <nomeIDX> [CASCADE|RESTRICT];
No DROP, a clusula IF EXISTS restringe a emisso de mensagens de erro caso os ndices a
serem excludos no existam. O padro a emisso de erro ao se tentar excluir um ndice
inexistente. As demais clusulas, que so opcionais, explicadas a seguir:
11 CASCADE: remove objetos que dependam do ndice;
11 RESTRICT: faz com que o ndice no seja eliminado se existirem objetos filhos, sendo esta
a opo padro do PostgreSQL.

Vises
Viso (view): mecanismo de consulta de dados

11 Qualquer relao/tabela que no faa parte do modelo conceitual mas seja visvel a
um usurio como uma relao/tabela virtual
11 Armazena a estrutura do script SELECT da SQL
22 um componente do BD (tabela virtual) como sequncia, ndice, etc.
11 uma tabela lgica, composta de linhas de uma ou mais tabelas (agrupadas ou no)
e no ocupa espao no BD
11 Produz uma tabela temporria (resultSet) ou cursor, a partir das tuplas das tabelas
bsicas (que existem de forma fsica no BD)
Em SQL, uma viso (view) uma tabela nica derivada de outra(s) tabela(s), no existindo
fisicamente e por isso mesmo sendo considerada uma tabela virtual.

Captulo 7 - Subconsultas, ndices e vises

Figura 7.16
Criao de ndice
pelo assistente.

125

Vises so comumente utilizadas na criao de tabelas temporrias que precisam ser consultadas frequentemente, sem que haja a necessidade de ter uma representao fsica.
Aplicaes bem projetadas expem uma interface pblica que mantm privados os detalhes de sua
implementao. Dessa forma, mudanas futuras no projeto no impactam o usurio final. Portanto,
uma viso tambm pode ser vista como um mecanismo de consulta de dados, tendo como resultado uma tabela virtual com relaes ou tabelas que no fazem parte de modelo conceitual.
As principais aplicaes para vises so:

11 Segurana de dados: exibir partes da tabela;


11 Agregao de dados: relatrio comum j montado pelo projetista do BD sem interveno do desenvolvedor;
22 Exemplo: mensalmente mostrar a conta e o total de depsitos.
11 Esconder complexidade: s executa a subconsulta se a coluna for informada;
11 Juntar dados particionados: tabelas separadas com dados atuais e de histrico (UNION).

Criao de viso
Em SQL, o comando para especificar ou criar uma viso o CREATE VIEW. A viso dever
receber um nome, uma lista de atributos e uma instruo SQL, geralmente uma consulta
SELECT, para especificar o contedo dessa viso.

CREATE [OR REPLACE] VIEW <nomeVW> [(nomeCOL1, ...)] AS <query> ;


Onde:
11 nomeVW: nome da viso a ser criada;
11 nomeCOL: relao opcional de nomes a serem usados para as colunas da viso;
22 Quando fornecidos, esses nomes substituem os nomes inferidos a partir da
consulta SQL.
11 query: uma consulta SQL (ou seja, um comando SELECT ) que gera as colunas e as
linhas da viso.
Uma viso pode ser tambm criada com o auxlio do assistente do pgAdmin3, conforme

Modelagem de Bancos de Dados

demonstrado na figura 7.17.

126

No exemplo a seguir, cria-se uma viso com os nomes dos departamentos e seus respectivos empregados.

CREATE OR REPLACE VIEW empPorDepto AS


SELECT d.dnome AS departamento,
e.pnome || ' ' || e.inicialm || ' ' ||
e.unome AS empregado
FROM departamento d
JOIN empregado e ON e.dno = d.dnumero
ORDER BY 1, 2;
Existem algumas restries na criao de vises, similares s restries existentes para a

criao de tabelas, tais como:


11 No pode haver no resultado duas colunas com o mesmo nome;
11 No pode referenciar variveis de sistema.
Outro ponto importante a se destacar que no possvel a insero de valores dentro de
uma viso. Novos valores s aparecero dentro da viso quando as tabelas que a compem
tiverem novos registros ou mesmo uma atualizao sobre os registros j existentes.

Executando uma viso


Podemos especificar uma consulta SQL em uma viso da mesma forma que especificamos
as consultas envolvendo as tabelas de um banco de dados. Dessa forma, podemos selecionar total ou parcialmente os dados retornados pela viso, ou mesmo combinar a viso
com qualquer outra clusula e junto com outras vises e tabelas. A figura 7.18 mostra um
comando SELECT sendo aplicado em uma viso atravs do assistente do pgAdmin3.

Captulo 7 - Subconsultas, ndices e vises

Figura 7.17
PgAdmin III
Assistente para
criao de vises.

127

Vises
Executando uma viso
SELECT * FROM <nomeVW);
Combinando com qualquer outra clusula e junto com outras vises e tabelas

Figura 7.18
PgAdmin III
Consulta em
uma viso.

A figura 7.19, por sua vez, mostra como consultar as informaes contidas em uma viso
atravs do pgAdmin3.

SELECT * FROM empPorDepto;

Alterando e removendo uma viso


possvel alterar uma viso por meio do comando de criao, adicionando o parmetro de
substituio REPLACE, como segue:

CREATE OR REPLACE VIEW <nomeVW> ... ;


O parmetro REPLACE indicar para o SGBD que a view dever ser atualizada, sendo possvel
atualizar seu nome ou a composio de sua consulta SQL.

Modelagem de Bancos de Dados

J a excluso da viso pode ser feita pelo comando a seguir:

128

DROP VIEW <nomeVW>;


Excluir uma viso no exclui os dados das tabelas aos quais os mesmos pertencem.
Somente a estrutura da viso ser descartada.

Figura 7.19
Resultado da
execuo da viso
empPorDepto.

8
Obter viso geral da programao usando a linguagem PL/pgSQL e possibilidades
de sua aplicao no desenvolvimento de procedimentos armazenados e na
manipulao de dados.

conceitos

Programao; Procedimentos armazenados; Declarao de parmetros; Estruturas


de controle; PL/pgSQL.

Exerccio de nivelamento e
Voc j trabalhou com alguma linguagem que possibilitou a manipulao de dados via procedimentos armazenados? Qual linguagem utilizou? Em qual SGBD?

PL/pgSQL
A linguagem estrutural PL/pgSQL, desenvolvida como uma extenso da linguagem SQL, tem como
principal objetivo permitir a programao de tarefas no PostgreSQL. A incorporao de caractersticas procedurais SQL agregam benefcios e facilidades de controle de fluxo de execuo de
instrues, tais como loops estruturados (for, while) e controle de deciso (if then else).
Os objetivos de projeto da linguagemPL/pgSQLforam no sentido de criar uma linguagem procedural que pudesse:
11 Ser utilizada para criar procedimentos de funes e de gatilhos;
11 Adicionar estruturas de controle linguagemSQL;
11 Realizar processamentos complexos;
11 Herdar todos os tipos de dados, funes e operadores definidos pelo usurio;
11 Ser definida como confivel pelo servidor;
11 Ser fcil de utilizar.

Captulo 8 - Introduo programao SQL (pl/pgsql)

objetivos

Introduo programao SQL


(pl/pgsql)

129

Dessa forma, programar em PL/pgSQL significa ter disposio um ambiente procedural


totalmente desenvolvido para aplicaes de bancos de dados, beneficiando-se do controle
transacional inerente aos SGBDs.
Outro ponto a se considerar que PL/pgSQL no a nica linguagem que podemos usar dentro
do PostgreSQL. Alm dela, podemos citar PL/Tcl, PL/PERL, PL/Python, entre outras. Essas
linguagens podem ser instaladas como mdulos adicionais ao PostgreSQL (caso no estejam
presentes na sua instalao padro). De modo geral, todas essas linguagens permitem o uso de
DMLs (CRUD) e instrues de controle de transao (COMMIT, ROLLBACK e SAVEPOINT).
Caractersticas do PL/pgSQL:

11 Capacidade procedural (comandos de controle e repetio)


11 Reduo de trfego de rede
11 Permite DMLs (SELECT, INSERT, UPDATE, DELETE)
11 Instrues de controle de transao (COMMIT, ROLLBACK, SAVEPOINT)
11 No PostgreSQL 9.x o PL/pgSQL instalado automaticamente
22 possvel remove-lo (mdulo carregvel), mas no recomendvel.
Linguagens procedurais no PostgreSQL:
11 PL/pgSQL, PL/Tcl, PL/PERL, PL/Python
No PostgreSQL 9.0, o PL/pgSQL instalado automaticamente, embora seja possvel
remov-lo ( visto como um mdulo carregvel). Alguns administradores podem querer
excluir essa funcionalidade do SGBD, mas entendemos que isso no recomendvel.

Funes
11 Funes so blocos de cdigo SQL armazenados no servidor do banco de dados

11 Podem ser invocados a qualquer momento com o objetivo de realizar algum


processamento
11 Procedimentos encarregam-se da lgica de negcio e no retornam valor
22 No PostgreSQL funes esto mescladas com os procedimentos
Funes devem ser vistas como blocos de cdigo contendo instrues SQL que esto localizados do lado do servidor. Um dos objetivos alcanados com o uso desse recurso o de
diminuio de trfego de rede, uma vez que determinados controles e fluxo de execuo
podem ser transferidos para dentro do SGBD, no sendo necessria sua implementao em
interfaces de acesso ao banco de dados.
Uma vez definidas as funes, podem ser invocadas a qualquer tempo, sempre que for

Modelagem de Bancos de Dados

necessria a realizao do processamento de suas instrues SQL no banco de dados.


Na especificao do PosgreSQL, funes esto mescladas com os procedimentos, sendo os
procedimentos encarregados da lgica de negcios sobre as tabelas de um terminado banco
de dados, no retornando valores aps sua chamada. J as funes podem ou no retornar
valores aps a realizao de suas lgicas de negcios.

Criao funes
A seguir, apresentamos a estrutura sinttica utilizada em PL/pgSQL para a criao de funes.

CREATE [OR REPLACE] FUNCTION <nomeF>( [<argumentos>] )


RETURNS <tipoRetorno> AS $$ [<<label>>]

130

[DECLARE
/* declarao de variveis, constantes, ... */]
BEGIN
/* Seo das instrues SQL */
[RETURN <valor>;]
END [label];
$$
LANGUAGE <linguagem>;
Onde:
11 OR REPLACE: atualiza uma funo se esta j existe;
11 $$ so conhecidos como delimitadores de string que indica o incio e fim da funo SQL;
11 <<label>> e label so delimitadores de blocos de uso no obrigatrio;
11 LANGUAGE: especifica o tipo da linguagem utilizada na escrita da funo.
Blocos so usados para agrupamento lgico de instrues SQL que fazem parte da funo
sendo desenvolvida, no sendo obrigatria o seu uso.
Quantos aos comentrios, podemos inclu-los dentro do processo de escrita das funes,
sendo que estes seguem as mesmas regras da linguagem SQL.
Por padro, todas as palavras-chave utilizadas no processo de estruturao de uma funo

so case-insensitive, ou seja, tanto faz escrev-las com letras maisculas ou minsculas.


A sintaxe de comentrios apresentada a seguir:

-- para comentar o restante da linha


/* [bloco] */ para escrever um comento em bloco, com mais de uma linha
A figura 8.1 traz um exemplo de funo cujo retorno vazio (VOID). Nesse exemplo, $BODY$
o delimitador de string indicando o incio e fim dos comandos que compem a funo.
Temos ainda o comando de sada RAISE NOTICE, utilizado para enviar uma mensagem para
valor que vai compor a mensagem.

CREATE OR REPLACE FUNCTION teste()


RETURNS void AS
$BODY$
DECLARE din REAL; taxa REAL;
BEGIN
din := 100; taxa := 0.15;
RAISE NOTICE 'Rendimento de R$ %', (din * taxa);
END;
$BODY$

Captulo 8 - Introduo programao SQL (pl/pgsql)

o console padro, onde % funciona como um caractere coringa a ser substitudo por um

LANGUAGE plpgsql;
131

Figura 8.1
RAISE NOTICE:
exemplo de
mensagem via
console.

Declarao, inicializao e atribuio


Uma funcionalidade importante dentro do processo de construo de funes a possiblidade de utilizao de identificadores, que compreende as etapas de declarao, inicializao
e atribuio de valores iniciais. Identificadores so vistos como variveis ou constantes,
entre outros recursos (disponibilizados pelo PostgreSQL) que podemos usar durante o processamento das instrues de uma determinada funo.
A sintaxe da instruo para inicializao de uma varivel :

<nomeId> [CONSTANT] <tipo> [NOT NULL]


[{DEFAULT|:=} <expresso>];
Onde <nomeId> o nome utilizado para identificar a varivel, seguido da clusula CONSTANT
(que opcional) quando o valor atribudo varivel for fixo. Em seguida temos <tipo>,
indicando o tipo da varivel como, por exemplo, numrico, real, ou at mesmo um tipo
especfico de uma estrutura criada. J a clusula DEFAULT, tambm opcional, indicar o valor
inicialmente assumido pela varivel. O operador := funciona da mesma forma, indicando a
atribuio de um valor ou resultado de uma expresso para a varivel em questo.
No exemplo a seguir, temos a declarao de algumas variveis que sero utilizadas pela
funo Teste2.

CREATE OR REPLACE FUNCTION teste2()


RETURNS void AS
$BODY$
DECLARE

vNome VARCHAR;

raio NUMERIC := 5;
pi CONSTANT REAL := 3.1415927;
BEGIN
RAISE NOTICE 'A rea do crculo de raio % %', raio, (pi * POW(
raio, 2));

Modelagem de Bancos de Dados

SELECT pjnome INTO vNome

132

FROM projeto WHERE pnumero = '20';


RAISE NOTICE 'Projeto 20: %', vNome;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

Ainda sobre o exemplo anterior, podemos ver o uso de POW(), que uma funo nativa do
PostgreSQL. Ou seja, no h nenhum problema em usar funes no processo de criao de
novas funes. Alm disso, percebam que a clusula INTO utilizada junto com um SELECT,
permitindo que o resultado obtido inicialize a varivel vNome.
Por fim, na ltima linha do exemplo, aparece a clusula VOLATILE.
Na verdade, o PostgreSQL disponibiliza trs possveis categorias para as funes, indi-

cando como ser o comportamento em relao ao banco de dados. So elas:


11 VOLATILE (padro): que pode alterar os dados do banco;
11 STABLE: no modifica a base de dados e retornar os mesmos valores caso sejam
fornecidos os mesmos parmetros na mesma chamada;
11 IMMUTABLE: no altera jamais a base de dados e sempre retornar os mesmos
valores para os mesmos parmetros.
Utilize VOLATILE se a funo for usar INSERT, UPDATE ou DELETE (altera os dados da base). O
uso de STABLE indicado em instrues SELECT internas, onde seu resultado pode variar a
cada chamada da funo. J IMMUTABLE usado nos demais casos, como funes sem uso
de comando SELECT, que realizam clculos matemticos, entre outras operaes que no
alteram a base de dados.
A sintaxe para executar uma funo qualquer bastante simples:

SELECT <nome_da_funao>();
Basta utilizar o comando SELECT seguido do nome da funo. Se esta fizer uso de parmetros,
esses devero ser referenciados entre parnteses, logo aps o nome da funo.
No custa lembrar, contudo, que tambm podemos criar e executar funes utilizando o
assistente do pgAdminIII. Na figura 8.2, podemos ver a janela exibida quando acionamos o
menu flutuante (com o boto esquerdo do mouse) para criar uma nova funo. Essa janela
trs uma srie de abas onde so informadas as propriedades e caractersticas da funo.

Figura 8.2
pgAdminIII:
assistente para
criar de funes.

Captulo 8 - Introduo programao SQL (pl/pgsql)

As instrues que vo compor a funo devem ser informadas na aba CODE.

133

A figura 8.3, por sua vez, mostra os passos que devem ser observados para executar uma
funo pelo assistente.

Outro aspecto a ser lembrado no processo de declarao de variveis diz respeito possibilidade de especificarmos o tipo de dado de uma varivel tomando como base o tipo de um
campo existente em uma tabela no banco de dados. Ao fazer isso, temos uma preocupao
a menos, j que passa a se responsabilidade do SGBD identificar e utilizar o tipo de dado
correto quando da execuo da funo.
Mostramos a seguir a sintaxe para esse tipo de declarao, seguido de um exemplo de seu uso:
Declarar uma varivel do mesmo tipo de dado de uma coluna da tabela

11 Utilizao da clusula %TYPE

<nome_variavel> <tabela>.<campo>%TYPE ;
11 exemplo:

DECLARE
vNome PROJETO.pjnome%TYPE;
v REAL := cell(2.15) ;
BEGIN
RAISE NOTICE 'x = %', x ;
SELECT pjnome INTO vNOME FROM projeto
WHERE pnumero '20';

Modelagem de Bancos de Dados

RAISE NOTICE 'Projeto 20: %', vNome;


END;
Basicamente, aps o nome da varivel, preciso indicar respectivamente o nome da tabela
e campo, seguidos da clusula %TYPE.

Declarao de parmetros
Ao declarar parmetros considere:
11 Parmetros passados para

as funes so declarados por apelidos.


11 Podem ser referenciados pelo apelido ou $1, $2, e assim por diante, na ordem informada nos parnteses.

134

Figura 8.3
pgAdminIII:
assistente para
execuo de
funes.

Uma funo pode fazer uso de parmetros, responsveis por receber possveis valores durante
a sua chamada, e que sero utilizados para realizao de algum processamento interno.
O exemplo a seguir ilustra a declarao e uso do parmetro taxa:

CREATE OR REPLACE FUNCTION teste4(taxa REAL) RETURNS void AS


$BODY$

DECLARE valor REAL := 100 ;

BEGIN
RAISE NOTICE 'A aplicao de R$100 com taxa de % rendeu R$ %',
taxa, (valor * taxa);
END; $BODY$ LANGUAGE plpgsql;
Observe que o comando:

taxa, (valor * taxa);


Pode ser substitudo por:

taxa, (valor * $1);


Dentro do corpo da funo, podemos referenciar o parmetro pelo seu nome ou pelo identificador $ seguido da posio que esse ocupa, da esquerda para a direita, na sequncia de
parmetros declarados entre parnteses aps o nome da funo. Reforamos esse conceito
com mais um exemplo:

CREATE OR REPLACE FUNCTION teste5soma(IN x real, IN y real, OUT r


real) RETURNS real AS

$BODY$
BEGIN
-- r := x + y ;
r := $1 + $2 ;
RAISE NOTICE 'Resultado %', r;
END;

LANGUAGE plpgsql;
Destacamos, no exemplo anterior, o uso de IN e OUT na declarao dos parmetros.
Essas clusulas indicaro o modo como cada parmetro ser utilizado, admitindo as
seguintes possibilidades:
Modos do parmetro:
11 IN: entrada;
11 OUT: sada;
22 Varivel que comea NULL;
22 Deve ser atribudo um valor durante a execuo da funo;
22 O valor final do parmetro retornado.
11 IN OUT: entrada e sada;

Captulo 8 - Introduo programao SQL (pl/pgsql)

$BODY$

135

11 VARIADIC: nmero variado de argumentos;

22 Array.
22 Devem ser do mesmo tipo de dado.
A figura 8.4 a seguir exibe a aba Parameters da janela onde so declarados os parmetros
de uma funo atravs do assistente

Figura 8.4
pgAdminIII:
assistente para
declarao de
parmetros.

J a figura 8.5 trs janelas com o resultado da execuo da funo teste5soma(), apresentada em um exemplo anterior. Atente para o fato de que no aparece no corpo da funo a
palavra reservada RETURN, j que o valor a ser retornado fica definido pelo uso de OUT na

Modelagem de Bancos de Dados

declarao da varivel r.

136

Figura 8.5
Data Output e
Messages.

Varivel composta heterognea (ou tipo-linha)


11 Varivel que pode armazenar toda uma linha de um SELECT (resultado da consulta)

11 Os campos individuais do valor linha so acessados utilizando a notao de ponto


<varivel_linha>.campo
11 possvel a utilizao da clusula %ROWTYPE para declarar uma varivel do mesmo
tipo de dado de uma coluna da tabela
Assim como na linguagem de programao, funes em PL/pgSQL tambm permitem a manipulao de variveis compostas heterogneas, ou tipo-linha, como so conhecidas no PostgreSQL.
Esse tipo de varivel pode armazenar toda uma linha resultante de uma instruo SELECT,
desde que o conjunto de colunas do comando corresponda ao tipo declarado para a varivel.
Aps o armazenamento dos valores, podemos utilizar a notao de ponto para manipular
individualmente os campos resultantes do SELECT.

<varivel_linha>.campo
Tambm temos a possibilidade de usar a clusula %ROWTYPE para declarar uma varivel do
mesmo tipo de dado de uma coluna da tabela.

<tabela>%ROWTYPE ;
A figura 8.6 trs um exemplo da declarao e uso de variveis tipo-linha.

CREATE OR REPLACE FUNCTION teste6rowtype(dnum character)


RETURNS text AS
$BODY$
DECLARE
vDepto departamento%ROWTYPE;
BEGIN
SELECT * INTO vDepto

WHERE dnumero = dnum ;


RETURN 'Nome Depto: ' || vDepto.dnome || ', Gerente: ' || vDepto.

gerssn;
Figura 8.6
Console com
mensagem
utilizando
%ROWTYPE.

END;
$BODY$
LANGUAGE plpgsql;

Captulo 8 - Introduo programao SQL (pl/pgsql)

FROM departamento

137

Varivel tipo RECORD (Registro)


11 Variveis de registro so semelhantes ao tipo-linha, mas elas no tm nenhuma

estrutura pr-definida
11 Assumem a estrutura da linha definida no SELECT
11 A subestrutura de uma varivelregistro pode mudar cada vez que atribudo
22 Consequncia que qualquer tentativa de acessar um campo no definido no
momento ir apresentar um erro em tempo de execuo<identificador>
Outro tipo disponvel para declarao de variveis dentro de funes em PL/pgSQL o
RECORD. Variveis do tipo registro so semelhantes ao tipo-linha, sem a presena de uma
estrutura pr-definida.

<identificador> RECORD ;
Isso faz com que a varivel assuma a estrutura da linha definida na instruo SQL definida
no corpo da funo, podendo sofrer alterao a cada nova atribuio. Como consequncia,
qualquer tentativa de acessar um campo no definido no momento da atribuio dessa
varivel vai gerar um erro em tempo de execuo.
Um exemplo com a declarao e uso de uma varivel registro pode ser visto na figura 8.7.

CREATE OR REPLACE FUNCTION teste7record()


RETURNS void AS
$BODY$ DECLARE
vEmp RECORD ;
BEGIN
SELECT (pnome||' '||inicialm||'. '|| unome) AS nome,

TO_CHAR(datanasc, 'DD/MM/YYYY') AS data INTO vEmp


FROM empregado
WHERE ssn = '123456789';
RAISE NOTICE 'Nome: % , DataNasc: %', vEmp.nome, vEmp.data;

END;$BODY$

Modelagem de Bancos de Dados

LANGUAGE plpgsql;

138

Figura 8.7
Console com
mensagem
utilizando RECORD.

Clusula RETURNING
11 Pode ser necessrio recuperar valores em operaes de atualizao

(INSERT/UPDATE/DELETE)
11 Exemplo: recuperar o cdigo do cliente (serial) inserido para que possa ser empregado em outra operao
Existem situaes onde pode ser necessrio recuperar determinados valores durante a
execuo de operaes de atualizao (INSERT/UPDATE/DELETE). Para tanto utilizada a
clusula RETURNING, que no exemplo a seguir permite recuperar o cdigo do cliente inserido para que possa ser empregado em outra operao.

CREATE OR REPLACE FUNCTION testeReturning(vcli VARCHAR)


RETURNS void AS
$BODY$
DECLARE vid INTEGER ;
BEGIN
INSERT INTO cliente (codcli, nomecli)
VALUES (DEFAULT, vcli) RETURNING codcli INTO vid;
RAISE NOTICE 'ID = % ', vid ;
END;
$BODY$
LANGUAGE plpgsql;
A chamada para esta funo ser feita da seguinte forma:

SELECT testeReturning('SERGIO SILVA');


Produzindo o retorno:

Atividade de Prtica

Estruturas de controle
As estruturas de controle provavelmente so a parte mais til (e mais importante) da
linguagemPL/pgSQL. Essas estruturas possibilitam uma forma mais flexvel e poderosa
para a manipulao de dados noPostgreSQL. Apresentaremos a seguir algumas estruturas
condicionais e de repetio.

Captulo 8 - Introduo programao SQL (pl/pgsql)

ID = 7

139

Condicional IF
Permite executar comandos alternativos baseados em certas condies, de acordo com

a seguinte sintaxe:

IF <expressoCondicional> THEN
<comandosSQL>;
[ELSIF <expressoCondicional2> THEN
<comandosSQL2>;
[ELSIF <expressoCondicional3> THEN
<comandosSQL3>; ...]]
[ELSE <comandosSQLn>; ]
END IF;
Assim, podemos ter a execuo de um conjunto de comandos baseado apenas em uma
nica condio, ou um conjunto aninhado de condies delimitando diversos blocos de
comandos entre os quais sero executados apenas os que correspondem condio
que for avaliada como verdadeira.

IF ... THEN END IF;


IF ... THEN ... ELSE END IF;
IF ... THEN ... ELSIF ... THEN ... ELSE END IF;
A figura 8.8 trs um primeiro exemplo onde a instruo IF.. THEN .. END IF usada para
determinar se o nmero passado como parmetro par ou mpar.

CREATE OR REPLACE FUNCTION teste9if(n integer)


RETURNS character varying AS
$BODY$
BEGIN
IF MOD(n,2) = 0
THEN RETURN 'PAR';
END IF;
RETURN 'IMPAR';

Modelagem de Bancos de Dados

END;

140

$BODY$
LANGUAGE plpgsql;

Figura 8.8
Resultado da
execuo da funo
teste9if().

J o exemplo da figura 8.9 usa uma estrutura um pouco mais complexa para informar a
situao de um determinado aluno de acordo com sua mdia.

CREATE OR REPLACE FUNCTION teste10elsif(media real)


RETURNS void AS
$BODY$
DECLARE vSituacao VARCHAR;
BEGIN
IF media <= 5
THEN vSituacao := 'REGULAR';
ELSIF media < 7
THEN vSituacao := 'BOM';
ELSE vSituacao := 'EXCELENTE';
END IF;
RAISE NOTICE 'Situao do aluno %', vSituacao;
END;
$BODY$
LANGUAGE plpgsql;

Figura 8.9
Resultado da
execuo da funo
teste10elsif().

Condicional CASE
A estrutura condicional CASE outra forma para executar blocos de comandos com base

em condies. Essa estrutura deve ser utilizada de acordo com a seguinte sintaxe:

WHEN <valor1> THEN <comandosSQL1>;


[ WHEN <valor2> THEN <comandosSQL2>; ... ]
[ ELSE <comandosSQLn>; ]
END CASE;
Ou
CASE
WHEN <expresso> THEN <comandosSQL>;
[ WHEN <expresso2> THEN <comandosSQL2>; ... ]
[ ELSE <comandosSQLn>; ]
END CASE;

Captulo 8 - Introduo programao SQL (pl/pgsql)

CASE <expresso>

141

Um exemplo para tratar a opo de menu escolhida pode ser visto na figura 8.10.

CREATE OR REPLACE FUNCTION teste11case(opcao integer)


RETURNS void AS $BODY$
DECLARE msg VARCHAR(20);
BEGIN
CASE opcao
WHEN 1 THEN msg := 'Opo de Saldo';
WHEN 2 THEN msg := 'Opo de Extrato';
WHEN 3 THEN msg := 'Opo Sair';
ELSE msg := 'Opo invlida!!';
END CASE;
RAISE NOTICE 'Voc escolheu %', msg;
END; $BODY$
LANGUAGE plpgsql;

Figura 8.10
Resultado da
execuo da funo
teste11case().

Um segundo exemplo utilizando CASE, nesse caso para exibir a faixa do valor que passado
como parmetro, pode ser visto na figura 8.11.

CREATE OR REPLACE FUNCTION teste12case(x real)


RETURNS void AS $BODY$
DECLARE msg VARCHAR;
BEGIN
CASE
WHEN x BETWEEN 0 AND 10
THEN msg := 'valor entre 0 e 10';

Modelagem de Bancos de Dados

WHEN x BETWEEN 11 AND 20

142

THEN msg := 'valor entre 11 e 20';


ELSE msg := 'valor menor que 0 ou maior que 20';
END CASE;
RAISE NOTICE '%', msg;
END; $BODY$
LANGUAGE plpgsql;

Figura 8.11
Resultado da
execuo da funo
teste12case().

Repetio
So estruturas que permitem repetir um conjunto de comandos at que se chegue a

uma condio de sada (EXIT). A instruo LOOP obedece seguinte sintaxe:

LOOP
-- comandos
IF <expressoFIM>
THEN EXIT;
END IF;
END LOOP;
Ou
LOOP
-- comandos
EXIT WHEN <expressoFIM>;
END LOOP;
Na figura 8.12, temos um exemplo onde o bloco de comandos executado por dez vezes.

CREATE OR REPLACE FUNCTION teste13loop()


RETURNS void AS $BODY$
DECLARE i INTEGER := 1;
BEGIN
LOOP

i := i + 1;
EXIT WHEN i > 10;
END LOOP;
END; $BODY$
LANGUAGE plpgsql;

Captulo 8 - Introduo programao SQL (pl/pgsql)

RAISE NOTICE '%', i;

143

Outra estrutura de controle semelhante o WHILE (enquanto), que tem a seguinte sintaxe:

WHILE <expressoTRUE> LOOP


-- comandos
END LOOP;
O exemplo da figura 8.13 apresenta o mesmo resultado do exemplo anterior, mas nesse
caso utilizando o comando WHILE.

CREATE OR REPLACE FUNCTION teste14while()


RETURNS void AS $BODY$
DECLARE i INTEGER := 1;
BEGIN
WHILE i <= 10 LOOP
RAISE NOTICE '%', i;
i := i + 1 ;
END LOOP;
END; $BODY$

Modelagem de Bancos de Dados

LANGUAGE plpgsql;

144

Figura 8.12
Resultado da
execuo da funo
teste13loop().

Figura 8.13
Resultado da
execuo da funo
teste14lwhile().

Temos tambm o comando FOR (para), com a sintaxe:

FOR <cont> IN [REVERSE] <ini>..<fim> [BY <passo>] LOOP


-- comandos
END LOOP;
O mesmo exemplo onde um bloco de comandos executado por dez vezes, dessa vez
atravs do uso do FOR, apresentado na figura 8.14.

CREATE OR REPLACE FUNCTION teste15for()


RETURNS void AS $BODY$
DECLARE i INTEGER;
BEGIN
FOR i IN 1..10 LOOP
RAISE NOTICE '%', i;
END LOOP;
END; $BODY$

Figura 8.14
Resultado da
execuo da funo
teste15for().

Captulo 8 - Introduo programao SQL (pl/pgsql)

LANGUAGE plpgsql;

145

J o exemplo da figura 8.15 ilustra o uso de algumas clusulas opcionais do FOR, como o
REVERSE (o intervalo definido percorrido em modo decresente) e o BY (que determina o
tamanho do passo a cada interao). Assim, a varivel i receber inicialmente o valor 40 e,
na medida em que a ordenao da repetio est invertida, vai decrescendo de 5 em 5 at
atingir o limite final do intervalo. Perceba que a declarao de i est no formato de comentrio, j que tal declarao no necessria.

CREATE OR REPLACE FUNCTION teste15reverse()


RETURNS void AS $BODY$
-- DECLARE i INTEGER;
BEGIN
FOR i IN REVERSE 40..0 BY 5 LOOP
RAISE NOTICE '%', i;
END LOOP;
END; $BODY$
LANGUAGE plpgsql;

Modelagem de Bancos de Dados

Figura 8.15
Resultado da
execuo da funo
teste15reverse().

146

9
Aprender sobre o processo de programao em PL/pgSQL para escrita de procedures,
function e triggers; Entender o processo de tratamento de erros e uso de cursor
no processo de manipulao de dados.

conceitos

Stored procedures; triggers; Tratamento de erros; EXCEPTION; OPEN; FETCH e CLOSE.

Exerccio de nivelamento e
Voc j trabalhou com o tratamento de erros ou excees durante o desenvolvimento de
aplicaes? Esse tratamento foi realizado em qual camada?

Tratamento de erros
Como foi visto no captulo anterior, a linguagem estrutural PL/pgSQL possibilita, entre
outras coisa, a implementao de algumas regras de negcios da aplicao em desenvolvimento diretamente no SGBD.
A simples possibilidade de podermos pensar em implementar processamento sobre os
dados no servidor traz consigo a necessidade de nos preocuparmos com possveis erros que
possam ocorrer durante a execuo de alguma regra de negcio.
Pensando nisso, os projetistas de SGBDs implementaram um conjunto de funcionalidades
prprias para que possamos incorporar testes sobre as instrues que sero executadas
por uma determinada funo e assim evitar interrupes inesperadas, ao mesmo tempo,
controlando o fluxo de execuo da funo de forma a garantir a integridade dos dados.
Por padro, qualquer erro que ocorre em uma funo PL/pgSQL interrompe a execuo da
funo e, de fato, da transao envolvida.
Dessa forma, podemos detectar erros e fazer o tratamento apropriado a partir deles, usando
um bloco BEGIN com uma clusula de exceo EXCEPTION.

Captulo 9 - Stored Procedures

objetivos

Stored Procedures

147

Nesse caso, o processamento dos comandos SQL abandonado e o controle passa para a
lista de excees, onde os comandos correspondentes so executados e, em seguida, o controle passa para a prxima instruo aps END; (fim do bloco de EXCEPTION). A estrutura
geral de como isso programado pode ser vista a seguir:
11 Por padro, qualquer erro que ocorre em uma funo PL/pgSQL interrompe a exe-

cuo da funo e, de fato, da transao envolvida


11 possvel detectar erros e recuperar a partir deles, usando um bloco BEGIN com uma
clusula de exceo EXCEPTION

BEGIN
<comandosSQL>;
EXCEPTION
WHEN <condio> THEN <comandosTratarErro>;
[ WHEN <condio2> THEN <comandosTratarErro2>; ... ]
END;
Se nenhum erro for encontrado na execuo do bloco de comandos SQL, o controle do fluxo
de execuo da funo ignora as instrues previstas em EXCEPTION e passa para a prxima
instruo aps END; (fim do bloco).
O erro se propaga, ou seja, deixar de ser tratado, caso nenhuma correspondncia EXCEPTION seja encontrada.
A figura 9.1 trs um exemplo de funo, onde foi programado o tratamento de erro (no caso,
diviso por zero) atravs do uso de EXCEPTION:

CREATE OR REPLACE FUNCTION teste1exception()


RETURNS integer AS $BODY$
DECLARE x INTEGER := 10;
BEGIN
INSERT INTO trabalha (essn, pno, horas)
VALUES('123456789', '3', 20);
BEGIN -- try
UPDATE trabalha SET horas = '35'

Modelagem de Bancos de Dados

WHERE essn = '123456789' AND pno = '3';


x := 5 / 0;
EXCEPTION
WHEN division_by_zero THEN -- catch
RAISE NOTICE 'ERRO: diviso por zero';
RETURN x;

-- finally

END;
END; $BODY$

148

LANGUAGE plpgsql;

Figura 9.1
Resultado da
execuo da funo
teste1exception().

Vejamos os principais passos na execuo da funo teste1exception() apresentada

nesse exemplo:
11 Na execuo da funo, a varivel x inicializada com 10;
11 realizada a insero na tabela TRABALHA (horas=20) e um novo bloco de comandos
iniciado;
11 Para esse sub-bloco, feita uma tentativa de atualizao na tabela TRABALHA
(horas=35) e tambm uma tentativa de diviso por 0;
11 Como o segundo comando gera uma exceo, sendo tratada pela clusula EXCEPTION, os dois comandos anteriores so desfeitos (horas continuar com 20 e x continuar com 10) e a execuo desviada para depois do bloco EXCEPTION.

Clusula UNIQUE_VIOLATION
A clusula UNIQUE_VIOLATION muito utilizada para o tratamento de excees em operaes de INSERT ou UPDATE. Ela permite verificar a violao de unicidade durante a incluso
ou atualizao de registros dentro de um banco de dados. Um exemplo de utilizao dessa
clusula pode ser visto a seguir:

CREATE OR REPLACE FUNCTION set_cliente


(_nome VARCHAR, _email VARCHAR, _senha VARCHAR )
RETURNS INTEGER AS $$
DECLARE iIdCliente INTEGER;
BEGIN
BEGIN
INSERT INTO cliente (nome, email, senha)

RETURNING id_cliente INTO iIdCliente;


EXCEPTION
WHEN UNIQUE_VIOLATION THEN
UPDATE cliente SET nome = _nome, senha = _senha
WHERE email = _email
RETURNING id_cliente INTO iIdCliente;

Captulo 9 - Stored Procedures

VALUES (_nome, _email, _senha)

149

END;
RETURN iIdCliente;
END; $$ LANGUAGE 'plpgsql' VOLATILE;

Clusula FOUND
Podemos usar a clusula FOUND para verificar se uma instruo SELECT retornou ou no
registros. No exemplo a seguir, podemos tratar essa condio sem precisar usar a clusula
EXCEPTION, at porque isso implica em menor uso de recursos computacionais.
11 Varivel especial para verificar retorno no SELECT: FOUND

Exemplo FOUND: verifica se houve retorno no SELECT.


DECLARE reg RECORD ;
BEGIN
SELECT * INTO reg FROM categoria WHERE codcat = id;
IF not found
THEN RAISE NOTICE 'Categoria % no encontrada', id;
END IF;
END;
11 Dica: Um bloco que contm a clusula EXCEPTION significativamente mais caro para
entrar e sair do que um bloco qualquer. Portanto, no use EXCEPTION sem necessidade

Comando RAISE (levantar)


O comando RAISE, j usado no exemplo acima, permite reportar mensagem ou lanar
uma exceo. Assim, alm de erros que so internamente identificados e tratados pelo
PostgreSQL, possvel programar uma situao que equivale a ocorrncia de um erro,
mas comandada pelo programador.

RAISE <Nvel Severidade> 'mensagem' [, expresso [,...]];


Nveis do comando RAISE:
11 DEBUG;
11 LOG;
11 INFO;
11 NOTICE;
Modelagem de Bancos de Dados

11 WARNING;

150

11 EXCEPTION.
Entre esses nveis, apenas EXCEPTION cria uma situao equivalente a um erro (que
normalmente interrompe a transao corrente).

Na figura 9.2 apresentada uma funo onde o comando RAISE usado tanto para gerar
uma exceo (equivale a um erro) como uma mensagem.

CREATE OR REPLACE FUNCTION teste3exception(id integer)


RETURNS void AS $BODY$
DECLARE reg RECORD; i INTEGER := 10;
BEGIN
SELECT * INTO reg FROM produto WHERE codprod = id;
IF not found THEN

-- RAISE registro_nao_encontrado;

RAISE EXCEPTION 'Produto % no existe!', id;


END IF;
IF reg.quantprod <= reg.estoqueminprod THEN
-- RAISE fazer_pedido (escrever em tabela, por ex.)
RAISE NOTICE 'Produto % com estoque baixo!', id;
END IF;
RAISE INFO 'i = %', i;
END;$BODY$
LANGUAGE plpgsql VOLATILE;
10 ERRO: Produto 10 no existe!
****** Error ****** SQL state: P0001
2 NOTA: Produto 2 com estoque baixo!
INFO: i = 10
1 INFO: i = 10

Cursor
uma varivel (rea de memria) composta de linhas e colunas que armazena o resul-

tado de uma consulta (zero ou mais registros).


11 Normalmente, preciso seguir os seguintes passos para usar um cursor:
11 Declarar variveis para armazenar os valores das colunas de uma linha;
11 Declarar cursor, o qual conter uma consulta;
11 Abrir o cursor;
11 Buscar uma linha do cursor por vez e armazenar os valores das colunas nas variveis declaradas no passo 1, realizando em seguida os processamentos previstos para a funo;
11 Fechar o cursor aps seu uso.
Conforme j apresentado em 5.6, um cursor uma tabela temporria que pode ser entendida como uma matriz em que cada linha contm um registro e cada coluna corresponde a
um campo indicado no comando SELECT que deu origem ao cursor.

Captulo 9 - Stored Procedures

Figura 9.2
Exemplo de usos
do comando RAISE.

151

O interessante que tambm possvel declararmos cursores para utiliz-los dentro da


lgica de negcio programada atravs do PL/pgSQL. Um cursor se comporta como uma varivel (ocupa rea de memria) capaz de armazenar o resultado de uma (consulta de) seleo
que retorna 0 (zero) ou mais registros.
A sintaxe a ser observada no uso de cursores pode ser vista a seguir, lembrando que

todo cursor deve ser explicitamente declarado na rea DECLARE.

<nomeC_refcursor> REFCURSOR;
Ou
<nomeC> [[NO]SCROLL] CURSOR [(args)] FOR|IS <QUERY> ;
Onde:
11 REFCURSOR: utilizado para identificar uma varivel do tipo cursor;
11 [[NO]SCROLL]: define o tipo de movimentao do cursor;
11 <QUERY>: consulta SQL utilizada para criar a tabela temporria para o cursor.
A seguir, exemplos de declarao de cursores:

DECLARE
curs1 refcursor;
curs2 CURSOR FOR SELECT * FROM empregado;
curs3 CURSOR (np CHAR) IS SELECT * FROM projeto
WHERE pnumero = np;
Aps declarado, o cursor manipulado com os comandos OPEN, que abre o cursor, FETCH,
que percorre os registros do cursor, e CLOSE, que fecha o cursor. A sintaxe de cada um
desses comandos pode ser vista a seguir.

OPEN <nomeC_refcursor> [[NO] SCROLL] FOR QUERY;

Ou
OPEN <nomeC> [([arg1 :=] argVlr [, ...])];
FETCH [<direo> {FROM|IN}] <nomeCursor> INTO <reg>;
No comando FETCH, se no existir a prxima linha, a varivel <reg> recebe o valor NULL. A
clusula FOUND pode ser utilizada para verificar se uma linha foi retornada ou no. No
preciso especificar <direo>, mas nesse caso o padro considerar que a direo especificada NEXT. Outras possibilidades para <direo> so: pRIOR, FIRST, LAST, ABSOLUTE n,
RELATIVE n, FORWARD ou BACKWARD (cursor aberto ou declarado com SCROLL).

Modelagem de Bancos de Dados

CLOSE <cursor>; -- libera memria

152

Na figura 9.3 apresentado exemplo de uma funo onde um cursor percorrido atravs
do LOOP at que a condio NOT FOUND (fim do cursor) seja verdadeira, causando a sada
do LOOP atravs do EXIT.

CREATE OR REPLACE FUNCTION teste1cursor(ndepto character)


RETURNS void AS $BODY$
DECLARE c_empPorDepto CURSOR IS
SELECT * FROM empregado WHERE dno = $1;

-- $1 ref. para ndepto


reg RECORD;

BEGIN
OPEN c_empPorDepto;
LOOP
FETCH c_empPorDepto INTO reg;
IF NOT FOUND
THEN EXIT;
END IF;
RAISE NOTICE 'Empregado % %. %', reg.pnome,
reg.inicialm, reg.unome;
END LOOP;
CLOSE c_empPorDepto;
END; $BODY$

LANGUAGE plpgsql;

Figura 9.3
Resultado da
execuo da funo
teste1cursor().

O PostgreSQL disponibiliza uma forma alternativa para a instruo FOR que permite iterao nas linhas retornadas por um cursor. Essa estrutura encapsula as aes de abertura,
movimentao e fechamento do cursor, deixando o cdigo da funo menor e mais legvel. A
sintaxe desse FOR :

FOR recordvar IN bound_cursorvar [ ( [ argument_name := ]

<statements>
END LOOP

Captulo 9 - Stored Procedures

argument_value [, ...] ) ] LOOP

153

Na figura 9.4, mostrado um exemplo utilizando essa alternative de FOR.

CREATE OR REPLACE FUNCTION teste2cursor(ndepto character)


RETURNS void AS $BODY$
DECLARE c_empPorDepto CURSOR (id character) IS
SELECT * FROM empregado WHERE dno = id;
reg RECORD;
BEGIN
-- abre cursor, carrega registro no 'contador' e
-- fecha cursor
FOR reg IN c_empPorDepto(ndepto) LOOP
RAISE NOTICE 'Emp: % %. %', reg.pnome,
reg.inicialm, reg.unome;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;

Figura 9.4
Resultado da
execuo da funo
teste2cursor().

Outro exemplo, apresentado na figura 9.5, realiza a classificao de alunos de acordo com a
nota (desempate pela idade). Nota 0 desclassificada.

Modelagem de Bancos de Dados

Exemplo: classicar alunos


de acordo com a nota
(desempate pela idade).
Nota 0 desclassicado

154

Figura 9.5
Resultado da
execuo da funo
teste3cursor().

Atividade de Prtica

Trigger
11 Composio de um trigger:

11 Momento: BEFORE (antes), AFTER (depois) ou INSTEAD OF (ao invs de).


11 Evento(s): INSERT e/ou DELETE e/ou UPDATE.
11 Tabela: nome da tabela afetada pelo trigger.
11 Tipo: STATEMENT (default) ou ROW: indica se a trigger ser executada uma nica vez
(considerando o STATEMENT como um todo) ou se ser executada para cada linha
(ROW) afetada pela instruo que disparou o gatilho.
11 Corpo: o bloco de cdigo (PL/pgSQL).
Um trigger (gatilho) uma procedure executada (ou disparada) automaticamente pelo
banco de dados, quando uma instruo DML (INSERT, UPDATE OU DELETE) executada em
uma tabela predeterminada. Triggers podem ser disparados antes ou depois da execuo de
uma instruo DML.
Geralmente so aplicadas para garantir restries de integridade complexas e que no podem
ser geradas na criao das tabelas, para registrar informaes diversas sobre modificaes de
tabelas e para sinalizar outros programas sobre modificaes ocorridas.
A definio do momento de execuo de um trigger deve considerar que o BEFORE faz com
que esta seja executada antes de modificar os dados, sendo por isso mesmo indicado para
inicializar variveis globais, validar regras de negcio, alterar o valor de flags ou salvar o
valor da coluna antes de modificar seu valor. J o AFTER faz com que a trigger seja executada
somente depois que os dados tenham sido modificados, sendo normalmente utilizado
quando necessrio completar dados em outras tabelas do SGBD. O INSTEAD OF, por sua
vez, faz com que a instruo que o disparou seja substituda pelo prprio trigger.
Uma funo (procedure) de gatilho criada com o comando CREATE FUNCTION, decla-

rando-a como uma funo sem argumentos e com um tipo de retorno TRIGGER, conforme o exemplo a seguir.

CREATE OR REPLACE FUNCTION <nomeTriggerFunction>


RETURNS trigger AS $BODY$
BEGIN
<comandos>;
END; $BODY$

Quando uma funo de gatilho executada, variveis especiais so automaticamente


criadas, como por exemplo:
11 OLD: do tipo RECORD, contm o valor anterior (antigo) da coluna no banco de dados
em operaes de UPDATE/DELETE;
11 NEW: do tipo RECORD, contm o novo valor da coluna no banco de dados em operaes de UPDATE/INSERT;
11 TG_OP: do tipo TEXT, contm a operao que disparou o gatilho (INSERT, UPDATE, DELETE).

Captulo 9 - Stored Procedures

LANGUAGE plpgsql;

155

A sintaxe para criao da funo a ser executada pelo trigger a seguinte:

CREATE OR REPLACE TRIGGER <nomeTrigger>


{BEFORE|AFTER}
{DELETE OR INSERT OR UPDATE [OF <coluna>]} ON <nomeTab>
{FOR EACH ROW|STATEMENT}
[WHEN] -- Restringe linhas que dispararo o gatilho
EXECUTE PROCEDURE < nomeTriggerFunction >;
A figura 9.6 mostra a janela que exibida pelo assistente do pgAdmin3 ao acionar a criao
de um novo trigger.

Figura 9.6
Criao de
Trigger atravs
do assistente
pgAdmin3.

Como exemplo de restrio de integridade a ser verificada, temos um trigger upSalario que
ser aplicado para cada registro (ROW) que vier a ser atualizado na tabela empregado:

CREATE TRIGGER upSalario


BEFORE
UPDATE OF salario ON empregado

Modelagem de Bancos de Dados

FOR EACH ROW

156

EXECUTE PROCEDURE upSalarioEmp();


A funo upSalarioEmp(), por sua vez, ser executada pela trigger upSalario antes de consolidar a instruo SQL UPDATE, fazendo a verificao se o novo salrio menor que o velho,
antes de proceder com a atualizao, conforme podemos ver a seguir:

CREATE OR REPLACE FUNCTION upSalarioEmp()


RETURNS trigger AS $BODY$
BEGIN
IF NEW.salario < OLD.salario
THEN RAISE NOTICE 'Novo salrio menor que antigo';
END IF;
RETURN NEW;
END; $BODY$
LANGUAGE plpgsql;
Nesse outro exemplo, envolvendo um campo derivado, o total de empregados por departamento (na tabela DEPARTAMENTO) atualizado durante o processo de manuteno (INSERT,
UPDATE, DELETE) de registros na tabela EMPREGADO. Assim, temos uma trigger manEmp:

CREATE TRIGGER manEmp


AFTER INSERT OR UPDATE OR DELETE

ON empregado

FOR EACH ROW EXECUTE PROCEDURE manipulaEmp();


E a funo manipulaEmp que ser executada pela trigger manEmp antes de consolidar a
instruo SQL INSERT/UPDATE/DELETE.

CREATE OR REPLACE FUNCTION manipulaEmp()


RETURNS trigger AS $BODY$
BEGIN
IF TG_OP = 'INSERT' THEN
UPDATE departamento SET numemp = numemp + 1
WHERE dnumero = NEW.dno;
ELSIF TG_OP = 'DELETE' THEN
UPDATE departamento SET numemp = numemp 1
WHERE dnumero = OLD.dno;
ELSIF TG_OP = 'UPDATE' THEN

WHERE dnumero = OLD.dno;


UPDATE departamento SET numemp = numemp + 1
WHERE dnumero = NEW.dno;
END IF;
RETURN null;

Captulo 9 - Stored Procedures

UPDATE departamento SET numemp = numemp 1

END; $BODY$ LANGUAGE plpgsql;


157

Teste: inserir um registro na tabela empregado

INSERT INTO empregado(ssn,pnome,unome, sexo,dno, salario)


VALUES ('111111111','CARLA','SILVA','F','1',55000);

Exerccio de Fixao e
Quais so trs possveis categorias que podem ser indicadas quando da criao de uma

Modelagem de Bancos de Dados

funo em PostgreSQL? O que os diferenciam?

158

10
Conhecer, entender o contexto e ver exemplos do processo de controle de transaes
concorrentes no Banco de Dados.

conceitos

Transaes; Concorrncia; Bloqueio (lock); Impasse (dead-lock); Semforo; MVCC;


ACID; COMMIT; ROLLBACK; log e savepoint.

Exerccio de nivelamento e
Voc j desenvolveu alguma aplicao em que teve de se preocupar com um grande nmero
de usurios executando transaes concorrentes no Banco de Dados? Se sim, cite um processo onde foi necessrio realizar tal controle.

Concorrncia
Qualquer banco de dados geralmente prev uso por um grupo considervel de usurios.
Isso levanta preocupaes com o processo de administrao e controle de concorrncia das
informaes que sero manipuladas, necessrios quando existe a possibilidade de usurios
distintos tentarem acessar a mesma informao ao mesmo tempo. Nesses casos, preciso
garantir a integridade das informaes, por exemplo, cuidando para no permitir duas
vendas de um nico produto em estoque.
Geralmente temos como cenrio um SGBD com grande volume de informaes nele

armazenado e uma quantidade considervel de usurios manipulando essas informaes. Exemplos disso so sistemas de reserva de passagens, bancos, processamento de
cartes de crdito, mercado de aes, supermercados etc. Em todos eles os usurios
querem sempre:
11 Alta disponibilidade;
11 Baixo tempo de resposta;
11 Confiabilidade.
O problema que sistemas computacionais so complexos e podem existir falhas em sua

Captulo 10 - Transaes

objetivos

Transaes

operao, sendo necessrio lidar com situaes inesperadas.


159

At agora nos preocupamos somente com a execuo de instrues SQL de forma

isolada, como se um nico usurio pudesse ter todo o banco de dados somente para ele.
Porm, em BD multiusurios, instrues SQL so concorrentes.
11 Exemplo: consultar saldo de todas as C/C de uma agncia;
11 Mltiplos usurios podem:
22 Fazer depsitos;
22 Sacar dinheiro.
11 O prprio sistema pode lanar rendimentos sobre o saldo em conta;
11 Quais sero os saldos apresentados no relatrio final?
11 Depende de como o SGBD trata o bloqueio de dados: lOCKING
Importante: em SO, acesso concorrente ao dado: sofre Condio de corrida que pode
levar a Inconsistncia do dado.
11 Tratamento: problema da Seo Crtica;
11 Soluo: sincronizao (semforo: WAIT e SIGNAL).
Uma possibilidade de implementao de controle por meio de multiprogramao. A ideia
executar alguns comandos de um processo, depois suspender esse processo e executar
alguns comandos do prximo processo, sendo que de tempos em tempos o processo que
foi suspenso deve ser retomado do ponto em que foi suspenso. Isso faz com que tenhamos
uma execuo intercalada com o controle de concorrncia dos processos acessando uma
determinada informao no banco de dados.
Na figura 10.1, a seguir temos uma simulao onde dois processos concorrentes esto reservando lugares em um voo qualquer.

Tempo

Sra. Maria

13:45

L registro de voo e encontra


25 lugares disponveis

13:48
13:52

13:56

Sr. Eduardo

L registro de voo e encontra


25 lugares disponveis
Deduz 4 lugares, grava registro
do voo atualizado, indicando
21 lugares disponveis
Deduz 6 lugares, grava registro
do voo atualizado, indicando
19 lugares disponveis

Modelagem de Bancos de Dados

Porm, neste ponto, o registro de voo deveria mostrar 15 lugares disponveis!

160

A figura descreve uma situao onde a estratgia de multiprogramao parece no funcionar. Na verdade, existem diversas tcnicas de controle de concorrncia que podem ser
utilizadas como forma de assegurar a propriedade de no interferncia entre uma operao
e outra, ou o isolamento das transaes executadas ao mesmo tempo.

Figura 10.1
Acesso concorrente
a informaes
de reserva de
passagens.

Grande parte dessas tcnicas garante a serializao, que a execuo das transaes de
forma serial (uma atrs da outra). Para isso, necessrio saber quais so todas as operaes
executadas entre o incio e o fim de uma transao. No exemplo da figura 10.1 podemos
supor que a transao de reserva engloba os comandos de consultar ao nmero de lugares
disponveis, verificar se a quantidade disponvel igual ou maior do que a quantidade de
lugares desejados e, finalmente, subtrair o total de assentos reservados do estoque de lugares
disponveis. Mais frente, vamos detalhar melhor o conceito de transaes em um SGBD.

Bloqueios
Locking ou bloqueio o mecanismo que o SGBD usa para controlar o acesso simultneo

aos dados nele armazenados. Esse controle pode ser obtido por meio de duas estratgias distintas, que dependem das operaes bsicas de leitura e gravao (r/w). So elas:
11 1 Write lock / n Read lock.
22 Mais restritivo. Exemplo: problema escritor/leitores.
11 Write lock.
22 Gerao de verso para leitor no incio (versionamento).
Em ambos os casos, o tempo de espera pode ser longo.

Granularidade dos Bloqueios


Outro aspecto a ser considerado em bloqueios sua granularidade, ou nvel dos objetos
ou componentes que podem ser bloqueados, impedindo assim que mltiplos usurios
acessem ou modifiquem um determinado dado no nvel apropriado.
Os possveis nveis de bloqueio so:

11 Banco de dados;
11 Tabela (table locks): a mesma tabela simultaneamente;
11 Pgina (page locks): a mesma pgina de uma tabela:
22 Pgina: segmento de memria entre 2 a 16 KB.
11 Linha (row locks): a mesma linha de uma tabela;
11 Campo.
O Postgre SQL, assim como o Oracle, implementa o bloqueio de linha (row lock). Apesar do
bloqueio de tabela exigir poucos recursos computacionais, ele impede que outros usurios
acessem qualquer dado naquela tabela at que a mesma seja liberada. Em um ambiente
com muitos usurios, isso acaba resultando em um tempo de espera que inaceitvel.
Assim, o bloqueio por linha acaba por exigir mais recursos computacionais, mas permite
que mais usurios possam modificar simultaneamente recursos de uma mesma tabela
(desde que em linhas diferentes).

querem acessar uma mesma linha ser muito menor se comparado com o tempo que teriam
de esperar por todos os demais usurios (mesmo que estivessem acessando outras linhas).

Captulo 10 - Transaes

O resultado final que no bloqueio por linha o tempo de espera quando dois usurios

161

MVCC
O PosgreSQL utiliza o modelo de bloqueio multiverso Multiversion Concurrency Control

(MVCC), que permite que uma leitura no bloqueie uma escrita e nem que uma escrita
bloqueie uma leitura. um mtodo ainda mais caro em termos computacionais, j que o
SGBD cria uma verso dos dados acessados (snapshot) para ser utilizada por uma transao
qualquer, evitando assim o problema de uma transao acessar dados inconsistentes.
Dessa forma, o PostgreSQL consegue gerenciar a concorrncia entre transaes de forma

automtica, mas existem limitaes que devem ser consideradas. De qualquer modo,
possvel desligar o piloto automtico e estabelecer granularidade de bloqueio de tabela ou
linha em situaes onde o MVCC no for a melhor alternativa.

Bloqueios e impasses

Saiba mais
Mais frente, mostraremos como lidar com
essas questes.

Em algumas situaes, o uso de bloqueios pode levar a um impasse, tambm conhecido


como deadlock, conforme demonstrado na figura 10.2.

Tempo

Sra. Joana

Sr. Pedro

10:15

Obtm e bloqueia registro de porcas

10:16
10:17

Obtm e bloqueia registro


de parafusos
Tenta obter (e bloquear) registro de
parafusos, mas est bloqueado ao
Sr. Pedro

10:18

Tenta obter (e bloquear) registro


de porcas, mas est bloqueado a
Sra. Joana
DEADLOCK!

Uma possvel soluo para esse impasse a aloo total dos recursos para um dos usurios,
sendo que os demais s podero utiliz-los aps a concluso das operaes sendo realizadas pelo primeiro usurio. Mas para isso funcionar, necessrio implementar mecanismos de monitoramento pelo SGBD que consigam identificar a ocorrncia de situaes de
impasse e atuar para resolv-las.
Uma alternativa o uso de versionamento em conjunto com mecanismos de monitoramento. Nesse caso, so fornecidas cpias dos recursos (dados) para cada transao de cada
Modelagem de Bancos de Dados

cliente, sendo de responsabilidade do monitor lidar com possveis conflitos. Em geral, a

162

transao mais antiga priorizada e as demais so reiniciadas em seguida.

Figura 10.2
Acesso concorrente
com gerao de
impasse (deadlock).

Transaes
At agora, o termo transao foi referenciado mais de uma vez, sem, no entanto, ter sido
claramente definido. Uma transao em um SGBD vista como um programa em execuo
que inclui uma ou mais operaes SQL.
Essas transaes podem estar embutidas em um mdulo ou sistema acessando o SGBD
atravs de conexes cliente, ou podem ser definidas atravs de uma ferramenta com interface grfica amigvel, como o caso do pgAdminIII j utilizado nesse curso. Atravs dessas
ferramentas, podem ser criadas e executadas transaes para manipular os dados armazenados em um banco de dados qualquer.
O mais importante, contudo, estabelecer os limites da transao, ou seja, definir exatamente seu inicio e fim. Por conta disso, podemos entender uma transao como uma
unidade atmica de trabalho que, ou realizada com sucesso, ou simplesmente no realizada, mas que jamais ser executada somente em parte.
Transaes so uma forma de dar suporte s operaes concorrentes, garantindo a

segurana e integridade dos dados, apresentando um conjunto de propriedades que


forma a sigla ACID. So elas:
11 Atomicidade: indivisvel (todas as operaes so executadas ou nada acontece);
11 Consistncia: transaes no podem quebrar as regras do BD (manter consistncia);
11 Isolamento: transaes simultneas no sofrem interferncias umas das outras;
11 Durabilidade/permanncia: efeitos de uma transao de sucesso so persistidos no
BD (mesmo em presena de falhas).
Conforme j visto na sesso 4, um SGBD em geral dispem de uma DTL, que a linguagem
de Controle de Transaes e que fornece mecanismos para controlar transaes no banco de
dados. No exemplo a seguir veremos como os comandos COMMIT e ROLLBACK so utilizados.
Exemplo: transferir R$ 500,00 da conta corrente para conta poupana. Durante a transferncia, expirou bloqueio ou o servidor desligou.
Etapas:

1. Inicia
2. Invoca instrues SQL
3. Se algo errado, ROLLBACK (desfaz os comandos, abortando a operao como um todo).
Se no, COMMIT (efetiva a transao operaes executadas no banco de dados).
Vejamos agora, na figura 10.3, como a transao do exemplo acima implementada com

Captulo 10 - Transaes

comandos SQL.

163

START TRANSACTION;
/*

saca dinheiro da primeira conta, certificando-se de que o

saldo suficiente */
UPDATE conta SET saldo = saldo 500 WHERE numero = 1 AND saldo >
500;
IF <exatamente uma linha foi atualizada pela instruo anterior>
THEN

/* deposita dinheiro na segunda conta /*

UPDATE conta SET saldo = saldo + 500 WHERE numero = 2;

IF <exatamente uma linha foi atualizada pela instruo


anterior> THEN
/* tudo ocorreu bem /*
COMMIT;
ELSE
/*algo deu errado, desfaa todas as mudanas dessa
transao*/

ROLLBACK;

END IF;

ELSE

/*fundos insuficientes ou erro encontrado durante a

atualizao*/

Figura 10.3
Controle de
transao no banco
de dados.

ROLLBACK;

END IF;

De um modo geral, temos a seguinte sintaxe para uma transao:

START TRANSACTION / BEGIN [WORK|TRANSACTION];


<comandos>;

Modelagem de Bancos de Dados

COMMIT [WORK|TRANSACTION];

164

ou
ROLLBACK [WORK|TRANSACTION];
J foi mencionado, contudo, que apesar do PostgreSQL conseguir gerenciar a concorrncia
entre transaes de forma automtica, existem situaes em que isso pode ocasionar problemas. Nesses casos, o mais indicado desativar esse recurso, conhecido como autoefetivao (autocommit) e assumirmos a tarefa de realizao do controle de transaes por
conta prpria.

Considere, por exemplo, uma transao de atualizao de saldo de uma conta dentro de
uma tabela do banco de dados:

CREATE TABLE conta( numero integer NOT NULL,

saldo real,

CONSTRAINT conta_pkey PRIMARY KEY (numero));

INSERT INTO conta VALUES (1, 500);


Nessa situao, pode ser necessria a implementao de controle de transao para possibilitar a correta atualizao dos dados de um determinado registro durante a execuo de
instrues SQL em processos de interfaces diferentes que necessitam atualizar ou consultar
dados de um mesmo registro, conforme ilustrado na figura 10.4.
t

Transao 1 (ACCESS SHARE)


SELECT*FROM conta
WHERE numero=1;

Transao 2 (ROW EXCLUSIVE)

numero
integer

saldo
real

500

BEGIN;
UPDATE conta SET saldo = 300
WHERE numero=1;
SELECT*FROM conta
WHERE numero=1;

saldo
real

500

numero
integer

saldo
real

300

COMMIT;
SELECT*FROM conta
WHERE numero=1;

O mais indicado seria desativar o modo autocommit de forma permanente e se habituar a


executar todas as suas operaes SQL dentro de uma transao. Dessa forma, a verificao
do estado final do banco de dados aps a execuo de uma instruo SQL passa ser
obrigatria para qualquer uma das transaes realizadas.

Bloqueios no PostgreSQL
De modo a permitir o controle de concorrncia, o PostgreSQL reconhece oito tipos

de bloqueios:
11 ACCESS SHARE
11 ROW SHARE
11 ROW EXCLUSIVE
11 SHARE UPDATE EXCLUSIVE
11 SHARE
11 SHARE ROW EXCLUSIVE
11 EXCLUSIVE
11 ACCESS EXCLUSIVE.
Sintaxe:

LOCK [ TABLE ] [ ONLY ] name [,...] [ IN lockmode MODE ] [ NOWAIT ]

Captulo 10 - Transaes

Figura 10.4
Fluxo de execuo
de transao sobre
registro na tabela
conta.

numero
integer

165

Onde LOCKMODE pode ser:


11 Access Share: bloqueio requerido apenas por instrues SELECT e ANALYZE so simples
leitura em geral permitidas, a menos que alguma outra transao tenha requerido Access
Exclusive;
11 Row Share: a instruo SELECT com a clusula FOR UPDATE obtm esse nvel de bloqueio. Ele conflita apenas com os nveis mais retritos Exclusive e Access Exclusive;
11 Row Exclusive: bloqueio solicitado automaticamente por instrues INSERT, UPDATE,
DELETE. Conflita com quem precisar, alm de Access Exclusive e Exclusive, tambm com
Share Row Exclusive e Share;
11 Share Update Exclusive: bloqueio padro do comando VACUUM sem a opo FULL.
Conflita com todos os prximos nveis de bloqueio e com ele prprio. Bloqueia a tabela
inteira;
11 Share: bloqueia toda a tabela e requerido por instrues CREATE INDEXEMPLO:
11 Share Row Exclusive: similar ao Exclusive (ver a seguir), mas apenas no nvel de linha.
No h instruo SQL que automaticamente solicite esse nvel de bloqueio;
11 Exclusive: esse s no conflita com Access Share. requerido automaticamente apenas
em tabelas de catlogo em determinadas operaes;
11 Access Exclusive: conflita com todo mundo. Ou seja, nenhuma outra transao pode
operar na mesma tabela bloqueada por alguma transao que solicitou Access Exclusive.
Instrues ALTER TABLE, DROP TABLE, TRUNCATE, REINDEX, CLUSTER e VACUUM FULL
necessitam desse modo de bloqueio.
Vejamos a seguir, nas figuras 10.5 e 10.6, mais alguns exemplos de transaes no PostgreSQL
e os respectivos tipos de bloqueio por elas utilizados.

Transao 1 (ACCESS SHARE)


SELECT*FROM conta
WHERE numero=1;

Transao 2 (ACCESS EXCLUSIVE)

numero
integer

saldo
real

500

BEGIN;
ALTER TABLE conta
ADD COLUMN nome VARCHAR;
SELECT*FROM conta
WHERE numero=1;

Modelagem de Bancos de Dados

COMMIT;

166

Figura 10.5
Fluxo de execuo
de transao de
atualizao de
tabela.

Transao 1 (ACCESS SHARE)


SELECT*FROM conta
WHERE numero=1;

Transao 2 (ROW EXCLUSIVE)

numero
integer

saldo
real

500

BEGIN;
UPDATE conta SET saldo = 300
WHERE numero=1;
SELECT*FROM conta
WHERE numero=1;
SELECT*FROM conta
WHERE numero=1;

saldo
real

500

numero
integer

saldo
real

500

saldo
real

300

ROLLBACK;
SELECT*FROM conta
WHERE numero=1;

Log e Savepoints
Os SGBDs mantm umlogde transaes (o dirio do SGBD) para controlar todas as ope-

raes da transao que afetem valores armazenados no banco de dados.


No PostgreSQL ele chamado Write Ahead Log (WAL).
Caractersticas do WAL so:
11 Entradas:
22 [ start_transaticon T]
22 [ write, T, X, valor_antigo, novo_valor]
22 [ read, T, X]
22 [ commit, T]
22 [ abort, T]
11 armazenado em disco (bufferna MP), no diretrio pg_xlog;
11 Recursos alocados so liberados quando a transao concluda (desfeita ou executada);
11 Permite a restaurao de falhas. Se servidor desligado:
22 Antes do COMMIT/ROLLBACK: quando ficar on-line, deve desfazer transaes
incompletas;
22 Durante COMMIT: reaplicar modificaes registradas no log (propriedade de
DURABILIDADE).
J os Savepoints so pontos dentro de uma transao que indicam que os comandos posteriores podem sofrer rollback, enquanto os comandos anteriores so mantidos no banco de
dados mesmo que a transao tenha sido abortada. Uma transao pode ter mais de um
Savepoint, que indicado por um nome fornecido pelo programador.
No PostgreSQL, este recurso chamado de Point In Time Recovery (PITR), e permite
voltar a um ponto especfico no tempo (por meio do WAL). Existem comandos especficos para indicar um SAVEPOINT, que deve ter sempre um nome. Esses comandos esto
resumidos nas tabelas a seguir:

Captulo 10 - Transaes

Figura 10.6
Fluxo de execuo
de transao que
no se concretiza.

numero
integer

numero
integer

167

Opo

Descrio

SAVEPOINT nome

Registra um ponto de passagem na transao que


poder ser utilizado pela posteriormente.

RELEASE SAVEPOINT nome

Elimina um determinado ponto de passagem que


tenha sido criado anteriormente sua chamada.

ROOLBACK TO SAVEPOINT nome

Retorna a transao at o ponto de passagem


informado.

Para concluir, apresentamos um exemplo fazendo uso de um SAVEPOINT:

-- incio da transao
BEGIN;
-- considerando a existncia do registro (1, 500)
INSERT INTO conta VALUES(2, 500);
SAVEPOINT aqui;
INSERT INTO conta VALUES(3, 1000);
SELECT * FROM conta; -- so mostrados os registros 1, 2 e 3
DELETE FROM conta;
SELECT * FROM conta; -- nada mostrado
ROLLBACK TO aqui;
SELECT * FROM conta; -- so mostrados os registros 1 e 2
ROLLBACK;
SELECT * FROM conta; -- mostrado o registro 1
-- fim da transao

Exerccio de Fixao e
Transaes

Modelagem de Bancos de Dados

Descreva as funcionalidades presentes no acrnimo ACID.

168

Tabela 10.1
Comandos
especficos
para indicar um
SAVEPOINT.

Paulo Henrique Cayres possui graduao no curso Superior de Tecnologia


em Processamento de Dados pela
Universidade para o Desenvolvimento
do Estado e da Regio do Pantanal
(UNIDERP), especializao em Anlise
de
Sistemas
pela
Universidade
Federal de Mato Grosso do Sul (UFMS) e mestrado em
Cincias da Computao pela Universidade Federal do Rio
Grande do Sul (UFRGS). Atuou como coordenador curso de
Bel. em Sistemas de Informao e Superior de Tecnologia
em Redes de Computadores na Faculdade da Indstria do
Sistema FIEP, onde tambm coordenou as atividades do
SGI - Setor de Gesto de Informaes. Atualmente coordenador do Ncleo de Educao a Distncia - NEaD da
Faculdade da Indstria do Sistema FIEP. Scio-diretor da
CPP Consultoria e Assessoria em informtica Ltda.
Tem experincia na rea de Cincia da Computao, com
nfase em Engenharia de Software, atuando principalmente nos seguintes temas: linguagens de programao,
engenharia de software, modelagem de sistemas, desenvolvimento de aplicaes para web e gerncia de projetos.
Professor titular em cursos de graduao e ps-graduao
ministrando disciplinas de desenvolvimento de sistemas
desde 1995. Instrutor de treinamento na linguagem Java
de programao junto ao CITS em Curitiba e na ESR-RNP.

LIVRO DE APOIO AO CURSO

O curso apresenta uma viso geral sobre bancos de


dados, bem como conceitos e metodologias para
modelagem conceitual, lgica e fsica de banco de dados
relacionais. Aborda as principais caractersticas e funcionalidades de um sistema gerenciador de bancos de
dados usando como base o PostgreSQL. Explora de
forma prtica a criao e manuteno de bases de
dados bem como a pesquisa de informaes nelas
armazenadas atravs da linguagem SQL.

ISBN 978-85-63630-50-6

9 788563 630506

You might also like