Você está na página 1de 88

Bancos de Dados

Conceitos Iniciais

A Ciência da Computação é um conjunto de conhecimentos que busca receber dados,


fazer processamento sobre estes dados e devolver o resultado do processamento para o
público externo conforme uma necessidade específica. Um dos campos essenciais
dentro da computação é justamente fornecer ao equipamento computacional a
capacidade de armazenar a maior quantidade de informações possível, de forma
estruturada de modo a facilitar operações sobre esta informação com menor quantidade
de manipulação manual possível. Este conceito que norteia os estudos dos sistemas de
bancos de dados.

Bancos de Dados, dentro da Computação, designa os sistemas que buscam


armazenar dados de forma a oferecer a outras aplicações e ao usuário final
informações relevantes (a diferença entre dados e informações você verá na seção
seguinte).

Em geral, os profissionais que se especializam em bancos de dados atuam em


colaboração com outros profissionais de computação, informática, tecnologia e outras
áreas, pois gerenciam os sistemas de dados que fornecerão a informação necessária para
que estes profissionais possam executar suas ações. É importante salientar que no
Brasil, é comum profissionais como programadores, analistas de sistemas e outros,
executarem (além das suas funções) ações de administradores e desenvolvedores de
bancos de dados: isto se manifesta pela tentativa de algumas empresas reduzirem o
custo de manutenção de profissionais de TI, o que cria profissionais "faz-tudo". Em
empresas maiores, devido à alta complexidade dos grandes bancos de dados, é mais
comum que se contrate um profissional exclusivo para administrar estes bancos de
dados.

Definindo dado e informação

Para iniciarmos nossos estudos sobre bancos de dados, é necessário, em primeiro lugar,
definir o que é dado e o que é informação, e como estes são trabalhados em bancos de
dados.

Dado é o nome que damos a um valor qualquer, independente se tenha sentido ou


não. Por exemplo, se falamos 1, Maria, 2222, é muito provável que você entenda o que
falamos, mas não entenda o porque estamos falando. Isto porque, no caso, são apenas
valores, sem sentido próprio.

Informação é o nome que damos a um conjunto de dados estruturados de forma a


obter um sentido. Se falamos que Maria é o nome da sua tia, Maria agora não é apenas
um dado, mas está em uma estrutura que dá sentido ao valor mencionado.
O armazenamento de dados

Através da história, o ser humano sempre buscou desenvolver ferramentas e técnicas


para armazenar dados- quer em sua mente, através da escrita em pedra, papel e outras
mídias. Logicamente, cada tipo de armazenamento traz suas vantagens e desvantagens
no seu uso.

Os primeiros sistemas computacionais possuíam pouca memória física, e as


informações necessárias para o processamento computacional eram armazenadas em
mídias como fitas perfuradas. Com o aumento da quantidade de informação a ser
armazenada e processada, surgiu o conceito de arquivo, isto é, um grupo de dados
estruturados, com um nome e armazenados no disco rígido do computador. Como ainda
não se tinha a noção de conectar computadores em rede, cada departamento de uma
organização tinha seu arquivo de dados que não se comunicavam entre si. Logicamente,
isto trouxe problemas diversos: se um departamento precisa-se de uma informação que
não estava em seus arquivos de dados, deveria ir buscá-la em outro departamento.
Informações que eram necessárias a diversos departamentos deveriam ser gravadas nos
arquivos de cada departamento, o que, conforme o passar do tempo, gerava informações
desatualizadas.

Desta forma, tornou-se necessário integrar as informações de uma organização em um


local único e estabelecer controles de acesso de quem poderia fazer o que sobre estes
dados. As pesquisas em torno destas necessidades trouxeram o desenvolvimento dos
bancos de dados e dos sistemas de gerenciamento de bancos de dados. Os primeiros
sistemas de bancos de dados surgiram nos meados da década de 1960.

Definindo bancos de dados

Chamamos de bancos de dados (ou bases de dados) a um conjunto de dados


organizados de forma a fornecer informações aos seus usuários e permitir operações
como inserção, remoção e atualização dos dados. Existem diversas formas (modelos) de
construirmos um banco de dados:

 Flat file: arquivos simples que armazenam informações.


 Relacional: tem este nome pois organiza os dados em tabelas e estabelece
relacionamentos entre estas tabelas. Este é o modelo mais popular e que utilizaremos
para estudar os conceitos de nosso curso.
 Orientado a objetos: tem este nome pois organiza os dados em classes e objetos.
 Hierárquico: modelo que organiza os dados em forma de árvore. Foi um dos primeiros
modelos de bancos de dados propriamente ditos.
 Rede: organiza os dados em tabelas, que são ligadas por referências, criando-se uma
estrutura semelhante a redes.
 Dimensional: organiza e integra os dados em múltiplas dimensões, o que facilita
consultas em datawarehouses.
Sistema de Gerenciamento de Bancos de Dados (SGBD)

Sistema de Gerenciamento de Bancos de Dados (SGBD) é o nome dado a um conjunto


de programas de computadores que gerencia um banco de dado. Seu principal
objetivo é evitar a manipulação direta por parte de um usuário de um banco de dados,
além de estabelecer uma estrutura padrão para que os dados sejam organizados e
manipulados e possuam uma interface padrão para que outros programas possam
acessar o banco de dados. SGBDs também fornecem ferramentas adicionais que visam
ajudar a manipulação de dados de um banco de dados.

Existem diversos sistemas de SGBDs no mercado. Nos bancos de dados relacionais, os


mais populares são os sistemas:

 Oracle
 SQL Server
 MySQL
 PostgreSQL

Para prosseguir os estudos deste conteúdo, utilizaremos o MySQL como


ferramenta principal. Isto porque o MySQL é um sistema de bancos de dados gratuito,
open-source e com diversos recursos para usuários iniciantes, e mais leve do que
sistemas de características semelhantes como o PostgreSQL. É importante divisar que,
atualmente, no mercado, o MySQL é mais valorizado no segmento de desenvolvimento
web (isto decorre do fato que MySQL conversa bem com linguagens como PHP). O
mercado de banco de dados, em geral, tem valorizado mais profissionais Oracle e SQL
Server, o que pode ser um bom caminho caso você pretenda seguir na área de bancos de
dados.

Usuários de SGBDs

Os principais tipos de usuários dos sistemas de bancos de dados são:

 Administradores de Bancos de Dados (DBAs): profissionais responsáveis pela


administração dos sistemas de SGBDs. Sua função é assim regular o acesso dos
usuários aos bancos de dados e garantir a manutenção e segurança dos destes.
 Analistas de Bancos de Dados: profissionais responsáveis por desenhar e implementar
SGBDs e fazer as devidas integrações com cada conjunto de usuários do sistema.
 Usuários finais: este termo designa todos os usuários que não lidam diretamente com
o gerenciamento do banco de dados. Isto engloba desde outros profissionais de TI que
necessitam acessar o banco (p.ex. programadores, analistas de sistemas) até outros
usuários comuns (como gerentes, profissionais financeiros e afins) que manipulam o
banco de dados, quer diretamente (através de uma interface de alto nível), quer
indiretamente (através de uma aplicação que acesse o banco de dados).

Engenharia de Bancos de Dados


Engenharia de bancos de dados lida com a construção do banco de dados e com os
aspectos relacionados. Apesar de algumas pessoas quererem “meter a mão na massa”
diretamente, construir um banco de dados demanda um planejamento cuidadoso, pois
erros ou desajustes na Engenharia dos Bancos de Dados podem trazer problemas
imediatos ou futuros. Uma análise mais detalhada mostrará que o processo de
Engenharia de Bancos de Dados é semelhante ao processo de Engenharia de Software.

Muitas das ações relacionadas à Engenharia de Bancos de Dados são ações que podem ser
realizadas de forma mecânica, mas existem diversas ferramentas que visa facilitar a vida do
desenvolvedor e administrador de bancos de dados. Estas ferramentas são conhecidas como
ferramentas CASE (Computer- Aided Software Engineering). Conforme prosseguirmos em
nossos estudos relacionados a Bancos de Dados, iremos conhecer diversas ferramentas que
visam auxiliar cada etapa, mas também aprenderemos a fazer cada coisa manualmente para
entender os aspectos teóricos.

Passos a se implementar para criar um banco de dados

 Implementar um sistema de documentação e uma metodologia de trabalho e


desenvolvimento: no desenvolvimento de qualquer coisa em TI, o primeiro passo deve
ser estabelecer um sistema de documentação, que sirva para orientar todo o projeto,
e uma metodologia de trabalho e desenvolvimento. Metodologia implica possuir
processos transparentes e bem definidos para executar cada ação proposta, assim
como possuir meios para detectar falhas e erros no processo de implementação para
rápida correção.
 Estabelecer o objetivo do banco de dados: definir a necessidade inicial da
implementação do banco de dados e o tipo de banco de dados que será utilizado no
caso.
 Determinar a equipe de trabalho, recursos a serem utilizados e os cronogramas de
trabalho: baseado nos dois primeiros passos, pode-se estimar a equipe necessária
para executar a implantação, além dos recursos financeiros e tecnológicos a serem
utilizados. Baseado nisto, pode-se estabelecer um cronograma para determinar os
prazos de cada ação a ser realizada.
 Análise de Requisitos: coletar os dados necessários para a construção do banco de
dados, que envolvem os casos de uso, os dados que serão armazenados, as
necessidades de tempo e acesso e a conversão das necessidades humanas para as
necessidades técnicas. Determinar o principal problema a ser resolvido e os sub-
problemas, descartando o que é desnecessário.
 Modelo conceitual: conversão das especificações em diagramas (modelagem de
dados). Neste caso, se abstraem as informações obtidas. O principal método é o uso
do MER.
 Modelo lógico: conversão dos diagramas em diagramas lógicos (mapeamento),
determinando os relacionamentos e as regras que operam sobre cada relacionamento.
Nesta fase é feita a conversão do MER para um modelo que facilite a conversão para o
banco de dados especificado. Nesta fase é efetuada a normalização, que consiste na
aplicação de diversas regras lógicas de forma a otimizar o sistema a ser desenvolvido.
 Projeto físico: conversão para as necessidades específicas da implementação.
 Implantação: criação da estrutura do banco de dados.
 Verificação e Validação: são efetuados testes sobre o banco, verificando possíveis
erros e analisando a interação dos usuários com o sistema. Baseado nos resultados
obtidos, são propostas novas soluções e correções de modo a otimizar o sistema em
questão.
 Manutenção: a manutenção envolve analisar o funcionamento do sistema
continuamente e fazer as devidas correções, atualizações e alterações (hardware,
software, pessoas ou técnicas) conforme se mostre necessário.

Passos a serem executados ao se assumir um banco de dados já existente

 Verificar o Banco de Dados (modelo, versão) : isto é, verificar o SGBD existente, qual
sua versão e quais são as aplicações da organização que acessam a base de dados.
 Verificar a existência de documentação e impacto na organização: isto é, verificar se
existe alguma documentação (mínima que seja) que descreva a estrutura do banco de
dados. Também deve-se verificar a importância do banco de dados na organização.
 Entender a estruturação do banco de dados.
 Verificar as possibilidades de alterações e migrações.
 Adotar as técnicas de “Passos a se implementar para criar um banco de dados”.

Modelagem Conceitual

O modelo conceitual é o primeiro modelo que desenvolvemos para criar um banco de


dados. Seu objetivo é rascunhar a estrutura do banco de dados sem se preocupar, ainda,
em como esta estrutura será feita. Existem diversas formas de criar este modelo
conceitual: a mais utilizada pelo desenvolvedores de Bancos de Dados é o Modelo
Entidade- Relacionamento (MER), modelo desenvolvido pelo estadunidense Peter Pin-
Shan Chen e apresentado ao público em 1975. A idéia básica deste Modelo é abstrair
problemas do mundo real, convertendo seres, eventos e coisas em entidades, e
estabelecendo ligações entre estes eventos (o que chamamos de relacionamento).

Modelo Entidade-Relacionamento (MER)


Para montarmos o MER, adotamos os seguintes passos:

1. Definimos o problema a ser resolvido pelo banco de dados: isto significa entender para quê
o banco será utilizado. Por exemplo, vamos imaginar que a necessidade de nosso banco de
dados é armazenar os dados das compras dos clientes de um supermercado.

2. Dividir o problema em entidades: se entendemos qual a necessidade que a criação do


banco deve solucionar, devemos agora esquematizar as entidades que farão parte do nosso
banco. Chamamos de tipo de entidade, um conjunto de elementos (ser, evento, coisa) com as
mesmas características. Para cada tipo de entidade fazemos a representação com um
retângulo e o nome do tipo da entidade no centro. Cada elemento que faça parte deste
conjunto chamamos de entidade. Baseado no nosso exemplo do super-mercado, podemos
visualizar dois tipos de entidade principais: clientes e compras. Logicamente, estamos
trabalhando com um exemplo de apenas duas entidades: um banco de dados comum possui
diversas entidades relacionadas.

3. Determinar os atributos de cada entidade: chamamos de tipo de atributo cada


característica que nos interessa armazenar de cada tipo de entidade. Isto significa que
devemos determinar quais informações queremos de cada tipo de entidade, e descartar
aquelas que não são convenientes. Utilizamos círculos ovais com o nome de cada
atributo no centro, ligados à entidade com quem se relaciona. No nosso exemplo, o
que pode nos interessar dos clientes ? Como exemplo, escolheremos nome e CPF. Da
compra, escolheremos produto, valor do produto e valor da compra. Cada valor
diferenciado que temos dentro de um tipo de atributo é chamado de atributo.

4. Determinar o identificador: após determinar os atributos, devemos escolher um


atributo para ser o identificador. Identificador significa que este campo será utilizado
para diferenciar os dados de um mesmo tipo de entidade. Para determinar o
identificador, sublinhamos o campo que escolhermos. Em geral, escolhemos um
campo já existente para ser o identificador, um campo que para cada vez que inserirmos
um valor, sabemos que ele nunca irá se repetir. Caso não exista, podemos criar um novo
campo apenas com este propósito. Dentro do nosso modelo, sabemos que CPF pode ser
um identificador, pois é um número único para cada cliente. No entanto, na entidade
compras, qualquer um dos campos pode ter valores repetidos. Neste caso, podemos
criar um novo campo (que chamaremos de Código de Compra) que sempre será
diferente para cada compra.

5. Definir os relacionamentos: um relacionamento é o que faz a ligação entre duas entidades.


Em geral, é representado por uma ação, que é posicionado no centro de um losango. No
nosso exemplo, um cliente faz compras. Logo, o relacionamento entre cliente e compra é
“FAZ”.

6. Definir a cardinalidade de cada relacionamento: cardinalidade representa como


funciona um relacionamento entre duas tabelas. Devemos definir dois tipos de
cardinalidades:

 Cardinalidade mínima - diz se o relacionamento é obrigatório ou não. Se um


elemento é obrigatório na relação, marcamos 1 ao seu lado. Se o elemento não é
obrigatório, marcamos 0 ao seu lado.
 Cardinalidade máxima – diz o máximo de relacionamentos que as entidades
podem ter. Se um elemento pode ter no máximo uma ocorrência em uma
relação, marcamos ao seu lado 1. Se um elemento pode ter diversas ocorrências
em uma relação, marcamos ao seu lado N.

No nosso exemplo, vamos definir primeiro a cardinalidade mínima: um cliente


obrigatoriamente deve ter uma compra cadastrada ? Provavelmente não. Então
compras, nesta relação, possui valor 0 neste quesito. Mas, no entanto, toda compra
deve possuir um cliente: isto significa que clientes recebe o valor 1.

Em seguida, veremos a cardinalidade máxima: um cliente pode fazer uma ou mais


compras. Assim, Compras receberá a cardinalidade máxima N, mas Clientes receberá
a cardinalidade 1.
Para combinar a cardinalidade mínima e máxima, ao lado de cada entidade marcamos
os valores acima designados na forma (MÍNIMO, MÁXIMO). Assim colocaremos ao
lado de Clientes 1,1 e ao lado de Compras 0,N.

7. Refinar o modelo e retirar os elementos desnecessários: até agora, apenas


desenhamos a estrutura de um banco de dados, sem nos preocuparmos com aspectos
lógicos (por exemplo, nossa entidade Compras só possui um campo para Produto e
Valor do Produto. Mas, e se o Cliente quiser comprar mais de um produto ?). Porém,
podemos refinar melhor nosso modelo conceitual: verificar se não há entidades,
relacionamentos ou atributos desnecessários ou se não há falta deles. O MER possui
diversos outros recursos para melhorar a criação e visualização de um banco de dados,
mas para este curso, o que foi aprendido até agora é suficiente para nossos objetivos.

Modelagem Lógica

Modelagem Lógica é o nome dado os processos que convertem um modelo


conceitual em um modelo mais técnico e apropriado para a posterior conversão no
banco de dados em si. Cada modelo de bancos de dados possui modelos lógicos
diferentes.

Em geral, para compor o modelo lógico de um banco de dados relacional, usamos o processo
de normalização, que é um conjunto de regras para determinar a construção correta do banco
de dados. Conforme organizarmos os passos para construção do modelo lógico, explicaremos
as regras de normalização. Para compor a estrutura lógica bancos de dados em MySQL, existe
uma ferramenta CASE recomendada para a Modelagem Lógica que é o MySQL Workbench.

Projeto Lógico (Modelo Relacional)


Para fazermos a conversão do modelo conceitual para o modelo lógico, fazemos os seguintes
passos:

1. Convertemos as entidades do MER em tabelas com os nomes dos atributos e seus


tipos: o formato de uma tabela no modelo lógico é o seguinte:
Na parte superior, é incluído o nome da tabela. Na parte inferior são inseridos os nomes dos
campos e seus tipos. Em geral, convertemos o nome da tabela e o nome do campo em um
formato amigável para o computador. Isto significa que:

 Nomes não terão espaço


 Nomes começam com letras.
 Nomes podem ter letras e números no seu corpo. Não utilizamos caracteres especiais
para criar o nome, exceto a barra inferior ( _ ).

O tipo de um campo limita os tipos de dados que podem ser inseridos neste campo. Os
principais tipos são:

 INT: aceita dados do tipo inteiro (exemplo, 1, 2, 834, 2342, -674).


 DOUBLE: aceita dados com casas decimais.
 MONEY: aceita dados em formato de dinheiro.
 CHAR(): aceita dados do tipo texto (letras e números). Dentro do parênteses, deve ser
colocado a quantidade de caracteres máximos que o campo suportará.
 VARCHAR(): aceita dados do tipo texto (letras e números). Dentro do parênteses, deve
ser colocado a quantidade de caracteres máximos que o campo suportará. Quando
estabelecemos um limite para CHAR, ele separará a quantidade de bits de acordo com
este limite, independente se todos os caracteres forem utilizados ou não. Já VARCHAR
utiliza apenas a quantidade de bits de acordo com os caracteres utilizados. Porém,
como VARCHAR usa dois bits extras de controle, recomenda-se o uso de VARCHAR
apenas se não é possível estabelecer um limite fixo da quantidade de caracteres que
serão inseridos.
 DATE: aceita dados no formato de data.
 TIME: aceita dados no formato de hora.
 BOOL: aceita dados do tipo booleano, isto é, que só possua dois valores possíveis.

Caso queiramos que um campo seja obrigatório (isto é, seja obrigatória a inserção de dados
neste campo), coloca-se NN na frente do tipo de campo (NN significa NOT NULL). Assim, nosso
exemplo anterior de Clientes e Compras assume a seguinte forma:
2. Para os campos que são identificadores, colocamos PK (PRIMARY KEY) na frente do seu
tipo: chave primária é o nome que damos ao campo que será único em cada registro. Para
facilitar a visualização, colocamos os campos que serão chaves primárias na primeira posição
da tabela em que estão:

3. Convertemos os relacionamentos em gráficos apropriados: ou seja, no modelo lógico, ao


convertermos os relacionamentos, devemos estabelecer como ocorre a interação entre as
tabelas. Trocamos o losango pela reta simples, e convertemos os valores 0 para O, 1 para | e N

para .

4. Criamos as chaves estrangeiras (FK): a chave estrangeira é o nome dado ao campo de uma
tabela que se liga a chave primária de uma outra tabela. Significa que quando a chave primária
de uma tabela e a chave estrangeira de outra tabela forem iguais, as tabelas podem ser
amarradas. Sem a chave estrangeira, as tabelas são isoladas em si e não possuem ligação. Em
geral, para criar uma chave estrangeira, copiamos o nome e o tipo da chave primária e
transfira como chave estrangeira de outra tabela, com FK (de Foreign Key) designando que é
uma chave estrangeira (A chave estrangeira pode ter um nome diferente da chave primária de
outra tabela, mas o tipo deve ser sempre o mesmo). Outros fatores devem ser considerados:

 Quando uma linha é incluída ou alterada na tabela que possui a chave estrangeira, o
valor da chave estrangeira deve existir na chave primária da tabela principal, caso
contrário a inclusão não poderá ser efetuada.
 Se alguma linha de dados é excluída da tabela principal, o registro na tabela com chave
estrangeira também deve ser excluída senão será retornado erro.

Assim, sabemos que um Cliente não necessita ter uma compra, mas uma Compra sempre tem
que ter um Cliente. Logo, a chave estrangeira deve estar na tabela Compras, e deve se
relacionar com o CPF do Cliente.

5. Eliminamos campos repetidos (isto é, que possam ter mais de um valor) colocando-os em
uma tabela separada: isto significa que quando há uma relação 1-N, e os valores na tabela N
podem, ao mesmo tempo, assumir mais de um valor ao mesmo tempo, criamos uma tabela
separada para estes campos. Isto se adequa à 1a Forma Normal (1FN) de Normalização em
Bancos de Dados que define que todos os atributos devem ser atômicos e monovalorados.

No nosso caso, um Cliente ao fazer uma Compra, pode escolher diversos produtos. Então é
recomendado que os valores relacionados aos produtos sejam colocados em uma tabela
separada de Compras. Porém, a relação entre Compras e Produtos se tornaria uma relação N-
N, o que obriga a criação de uma entidade associativa, que no caso é Itens de Compra.
6. Não misturamos assuntos em uma mesma tabela: isto significa que em uma tabela só deve
constar dados relacionados ao assunto (título) daquela tabela. Neste caso, verificamos se não
há campos desnecessários, e ajustamos para que cada campo esteja organizado onde é
conveniente.

7. Todos os elementos de uma tabela são dependentes da chave: diretamente relacionado ao


tópico anterior, todos os campos de uma tabela devem depender exclusivamente da chave
primária da tabela em que está. Se isto não ocorre, provavelmente o campo em questão não é
pertinente ao assunto da tabela. Isto se adequa à 2a Forma Normal (2FN) que diz que além de
estar em 1FN, os atributos da tabela devem ser totalmente dependentes da chave primária.
Também orienta à 3a Forma Normal (3FN) que diz que a tabela deve estar em 2FN e que os
atributos não-chave devem ser independentes entre si.

utilizando o MySQL

O MySQL é um sistema de gerenciamento de bancos de dados relacional que utiliza a


linguagem SQL (Structured Query Language- Linguagem de Consulta Estruturada). É
um SGBD open-source, lançado em 1995, que depois foi adquirido pela Sun
Microsystems em 2008 (posteriormente, em 2009, a Oracle comprou a Sun).

SQL é o nome de uma linguagem desenvolvida para formulação de pesquisa em bases


de dados. É uma linguagem surgida no início dos anos 70, que se baseia no inglês para
formular os comandos, e que atualmente é padronizada pela ISO e pela ANSI.
Atualmente, a maior parte dos SGBDs relacionais e em outros formatos buscam seguir
o padrão SQL para formalizar suas consultas, apesar de que cada empresa
desenvolvedora adapta esta linguagem para suas necessidades, o que significa que se
você está aprendendo MySQL, poderá aprender a utilizar o Oracle ou MS SQL Server,
mas não sem uma revisão do seu aprendizado anterior.

Instalação e uso do MySQL


Estes são os passos para a instalação do MySQL:

1. Acesse o endereço http://www.mysql.com/downloads/ e clique na opção MySQL


Community Center.
2. Escolha a versão apropriada de acordo com seu sistema operacional.
3. Na página seguinte, clique em No thanks, just take me to the downloads!.
4. Escolha o mirror conveniente, clicando em HTTP do mirror apropriado, e faça
o download.
5. Faça a instalação padrão. Ao final do processo será solicitada a configuração do
MySQL.
6. Siga a configuração padrão, e modifique a configuração de senha de root para uma
que seja conveniente.
7. Finalize a instalação.
Acessando o MySQL no Windows

Existem diversas interfaces gráficas e programas úteis para utilizar o MySQL (como,
por exemplo, o PHPMyAdmin). Por padrão, o acesso ao MySQL é feito por uma
interface acessado via prompt, que é o MySQL Command Line Client, que pode ser
executado a partir do Iniciar -> Programas -> MySQL-> MySQL Command Line
Client . Ao ser executado, será solicitada a senha informada na instalação. Após entrar
no sistema, poderão ser executados os comandos SQL.

Instalação casada

Algumas instalações do servidor Apache possuem uma versão do MySQL que pode ser
instalada em conjunto com o servidor (com o intuito de minimizar o trabalho de
configuração de servidores para páginas web). Nestes casos, em geral, a manipulação do
MySQL funciona via interface PHPMyAdmin, e a instalação e uso do MySQL são
extremamente facilitados. Exemplos de pacotes que integram estas soluções são:

 EasyPHP
 WAMP Server
 XAMP

Você pode ler a documentação do MySQL em http://dev.mysql.com/doc/

Comandos DDL

DDL (Data Definition Language) é o nome dado em SQL para os comandos utilizados
para criar e modificar tabelas. Ao contrário da DML, a função dos comandos DDL não
manipulam os dados em si, mas a estrutura das tabelas em que os dados serão
armazenados.

Para auxiliar em nossos estudos, utilizaremos dois símbolos (que não pertencem ao SQL), mas
que nos facilitará a compreensão:

 # significa que deve ser digitado ENTER


 [ ] significa que o que está entre os colchetes é opcional.

Criação de Tabela
A criação de uma tabela deve-se fazer obedecendo os padrões estabelecidos em um modelo
lógico. Todas as tabelas e relacionamentos devem ser criadas utilizando o comando CREATE
TABLE. A sintaxe básica de criação de uma tabela é a seguinte:
Vamos entender esta sintaxe:

 O comando inicial é CREATE TABLE seguido do nome da tabela e parêntese


conforme estabelecido pelo desenvolvedor. O nome da tabela deve ser iniciado
com letras e não pode incluir caracteres especiais, com exceção da _ (barra
inferior).
 Dentro da estrutura do CREATE TABLE, declaramos em primeiro lugar os
campos que compõe a tabela. Cada campo deve possuir um nome (que deve ser
iniciado com letra e não pode incluir caracteres especiais, com exceção da _
(barra inferior)), seguido pelo tipo deste campo. O tipo de um campo limita os
tipos de dados que podem ser inseridos neste campo. Os principais tipos são:
o INT: isto é, o campo assume valores numéricos inteiros.
o REAL: o campo assume valores com casas decimais.
o MONEY: o campo assume valor com formato financeiro.
o CHAR(): o campo pode possuir letras e números. O valor entre os
parênteses é a quantidade máxima de caracteres suportada.
o VARCHAR(): o campo pode possuir letras e números. O valor entre os
parênteses é a quantidade máxima de caracteres suportada.
o DATE: o campo pode possuir valores em formato de data (por padrão,
AAAA-MM-DD).
o TIME: o campo pode possuir valores em formato de horário (por padrão,
HH:MM:SS).
o BOOL: o campo pode assumir entre dois valores expostos.
 Caso o desenvolvedor deseje que um campo seja obrigatório (isto é, seja
obrigatório seu preenchimento) inserimos na frente do tipo NOT NULL . Caso o
campo não seja obrigatório, não há necessidade.
 Caso o desenvolvedor deseje que um campo seja incremental (isto é, acrescente
+1 para cada novo dado inserido), inserimos AUTO_INCREMENT na frente do
tipo do campo.
 O comando

 estabelece a chave primária da tabela. O nome que estiver dentro dos parênteses é o
campo que será utilizado como chave primária.

 O comando

 é opcional e obriga que um campo só possua os valores cadastrados aqui. Após


CHECK deve ser colocado o nome do campo, e após o IN devem ser estabelecidos os
valores que serão aceitos pelo campo.
 O comando

 é opcional e determina a chave estrangeira que serve de ligação para outra


tabela. Após o comando FOREIGN KEY deve ser colocado o campo da tabela
que será ligado com outra tabela. Depois de REFERENCES deve ser colocado o
nome da tabela que deverá haver a ligação, e em Nome_Chave deve ser
colocado o nome da chave primária da tabela a que se está fazendo referência.

Vamos criar, então, as tabelas conforme nosso modelo lógico anterior. As tabelas
devem ser criadas na ordem de dependência entre as tabelas, ou seja, primeiro devem
ser criadas as tabelas que não possuem chaves estrangeiras, e depois as tabelas que
dependem das primeiras tabelas criadas.

Alteração de Tabela
Se uma tabela foi criada, ela pode ter sua estrutura modificada conforme a conveniência:

Após o comando ALTER TABLE deve ser inserido o nome da tabela que deverá ser
alterada, e escolhida a operação que deverá ser realizada sobre a tabela. A operação
deve ser :

 ADD: adiciona um novo campo.


 MODIFY: altera a estrutura de um campo já existente, isto é, tipo ou tamanho.
 DROP: exclui um campo já existente.

O campo ADD pode ser utilizado para inserir um novo campo (no formato campo tipo),
uma chave primária, uma chave estrangeira ou um campo de check, obedecendo sua
sintaxe como ensinada anteriormente. O campo MODIFY pode ser utilizado para
modificar um campo já existente.
Por exemplo, vamos considerar que queremos incluir um campo chamado idade na
tabela Clientes criada anteriormente.

Vamos considerar que queremos modificar o tipo do CPF da tabela clientes para INT ao invés
de CHAR(11).

Vamos considerar que queremos modificar o tipo do CPF da tabela clientes para INT ao
invés de CHAR(11).

1ALTER TABLE Clientes


2MODIFY CPF INT;#

Caso um campo deva ser inserido antes ou depois de um determinado campo de nossa
tabela, utilizamos a seguinte sintaxe:

1ALTER TABLE Nome_Tabela


2ADD Nome_Campo Nova_Regra [FIRST ou AFTER] Campo_Determinado;#

Se, por exemplo, queremos colocar um campo chamado Idade na primeira posição,
podemos usar o comando:

1ALTER TABLE Clientes


2ADD Idade INT FIRST CPF;#

Também poderíamos fazer um comando que “coloque o campo Idade depois do campo
CPF que seria escrito na forma:

1ALTER TABLE Clientes


2ADD Idade INT AFTER CPF;#

Exclusão de Tabela
Podemos excluir uma tabela qualquer dentro de um banco de dados. A sintaxe para esta
operação é:

1DROP TABLE nome_tabela;#

No entanto, devemos nos atentar que ao excluir uma tabela que possui relacionamento com
outras tabelas, o SGBD retornará erro. Neste caso se realmente for necessário excluir uma
tabela, deve-se fazer as alterações necessárias em todas as tabelas relacionadas. Também
deve ser analisado se a tabela a ser excluída não possui dados cadastrados.

No nosso exemplo, só conseguiríamos excluir as tabelas Clientes e Produtos, se antes


excluirmos as tabelas que dependem destas tabelas. Assim, existe uma ordem apropriada para
eliminar as tabelas.
Comandos DML

Comandos DML (Data Manipulation Language, ou Linguagem de Manipulação de Dados) é o


conjunto de comandos que manipulam os dados de um banco de dados. Assim, estes
comandos não manipulam a estrutura de um banco (como o DML) mas os dados que estão
armazenados nestas estruturas. Aqui mantemos as convenções de código que não pertencem
ao SQL:

 # significa que deve ser clicado o botão ENTER.


 [ ] significa que o que está entre os colchetes é opcional.

Inserção de Dados
Este comando permite inserir dados em um banco de dados, e sua sintaxe é :

1INSERT INTO Nome da Tabela [(Campo1, Campo2, Campo3,...)]

2VALUES (Valor1, Valor2, Valor3...);#

Após o INSERT INTO, colocamos o nome da tabela que queremos fazer a inserção. Após o
nome da tabela, colocamos o nome dos campos em que serão inseridos os dados. Não é
necessário colocar o nome dos campos caso a inserção ocorra em todos os campos pela ordem
em que está estruturada a tabela. Após o comando VALUES colocamos os valores que
queremos inserir na tabela separados por vírgula, sendo que os dados do tipo número podem
ser colocados diretamente e os dados do tipo texto devem ser inseridos entre aspas simples.

Na estrutura que criamos no conteúdo anterior, podemos inserir os valores que desejamos. Por
exemplo, vamos cadastrar dois clientes na tabela Clientes:

1INSERT INTO Clientes VALUES ('11111111111', 'João');#

2INSERT INTO Clientes VALUES ('22222222222', 'Maria');#

Agora vamos inserir dois produtos na tabela Produtos:

1INSERT INTO Produtos VALUES (1, 'Caneta', 0.50);#

2INSERT INTO Produtos VALUES (2, 'Lápis', 0.25);#

Agora, podemos inserir valor na tabela Compras. É importante notar que no campo CPF deve
ser inserido um valor que já exista na tabela Clientes. Assim, se necessitamos saber de quem é
a compra, basta vermos a chave primária da tabela Clientes.

INSERT INTO Compras VALUES (1, 100.00, '11111111111');#


1
INSERT INTO Compras VALUES (2, 25.00, '11111111111');#
2

Para finalizar, vamos cadastrar na tabela ItensCompra. Como esta é uma tabela associativa, os
campos Codigo_do_Produto e Codigo_da_Compra devem existir nas tabelas aos quais faz
referência. Visualizando os dados inseridos abaixo, vemos que fazem parte da mesma compra:

1INSERT INTO ItensCompra VALUES (1, 1, 1);#

2INSERT INTO ItensCompra VALUES (2, 2, 1);#

Se desejamos inserir diversos valores em uma mesma tabela, não precisamos repetir o INSERT
INTO. Basta colocar vírgula, e os parênteses com os novos valores.

INSERT INTO Clientes VALUES ('33333333333', 'Pedro'),('44444444444',


1
'Mateus');#

Alterando Dados
Este comando permite alterar os dados já existentes em um banco de dados. Sua sintaxe é:

1UPDATE Nome_Tabela

2SET coluna a ser atualizada= valor atualizado

3[WHERE condição];#

Este comando pode ser utilizado sem o WHERE. Neste caso, todos os dados da tabela serão
modificados. Porém, se queremos que sejam alterados apenas os dados que atendem uma
determinada condição, utilizamos a cláusula WHERE, com as condições que devam ser
consideradas. É importante ressaltar que duas ou mais condições podem ser combinadas
utilizando as cláusulas AND e OR, que atuam conforme o estabelecido pela Lógica das
Proposições.

Por exemplo, imagine que queremos alterar todos os nomes da tabela Clientes para Mário. O
comando é:

1UPDATE Clientes

2SET Nome= 'Mário';#

Mas se queremos mudar para “Mário” apenas os Clientes com o nome de Pedro, o comando é:

1UPDATE Clientes

2SET Nome= 'Mário'

3WHERE Nome='Pedro';#
O restante dos Clientes não terão seus nomes alterados.

Excluindo dados

Na linguagem SQL, para apagar dados em uma determinada tabela, utilizamos a seguinte
sintaxe:

1DELETE FROM Nome_Tabela

2[WHERE condição ];#

Este comando, como o anterior, pode ser realizado sem o WHERE. Neste caso todas as linhas
da tabela determinada serão excluídas. Podemos utilizar o WHERE quando desejamos eliminar
apenas os registros que obedecem determinada condição.

Se usarmos o comando

1DELETE FROM Produtos;#

todos os dados da tabela Produtos serão excluídos. Mas se queremos excluir apenas os
produtos que possuam valor igual a 0.50, a sintaxe pode ser:

1DELETE FROM Produtos

2WHERE Valor_Produto =0.50;#

Mais sobre condições

Acima aprendemos sobre o comando WHERE, que é um comando que permite estabelecer
condições para que determinado processamento possa ser executado. Assim como nas
linguagens de programação, podem ser estabelecidos operadores que quando forem
verdadeiros, fará a operação ser executada. Os principais operadores são:

 = – igual
 <> – diferente
 > – maior que
 < – menor que
 >= – maior ou igual que
 <= -menor ou igual que
 AND – E
 OR – Ou
 NOT – Não

Como usamos o comando igual, por exemplo, em


1DELETE FROM Produtos

2WHERE Valor_Produto =0.50;#


podemos, no lugar de=, usar outro operador, como por exemplo,

1DELETE FROM Produtos

2WHERE Valor_Produto <0.50;#

Neste caso, não seriam pegos apenas os Produtos cujos valores sejam iguais a 0.50, mas todos
os Produtos cujos valores sejam menores do que 0.50.

No caso dos três últimos operadores, eles são em geral, utilizados para amarrar condições e
obedecem à Lógica das Proposições. Por exemplo, se usarmos o comando:

1DELETE FROM Produtos

2WHERE Valor_Produto <0.50

3OR Valor_Produto>10.00 ;#

Significa que só serão excluídos os produtos cujo valor seja menor do que 0.50 OU maior do
que 10.00. Ou seja, qualquer produto que atenda a uma destas condições será excluído.

Comando SELECT

Em um banco de dados, selecionar dados significa efetuar uma consulta enviando o comando
que retornará com as informações solicitadas se existirem. Para efetuar estas consultas
utilizamos o comando SELECT que faz parte dos comandos DML, mas que pelas suas
características próprias, será analisada de forma separada.

A sintaxe básica para efetuar a consulta é:

1SELECT Nome_ campo

2FROM Nome_Tabela

3[WHERE condição];#

 Após o SELECT inserimos os campos que queremos trazer da tabela, separados por
vírgula. Caso a necessidade seja trazer todos os campos da tabela, utiliza-se o * como
símbolo neste caso.
 Após o FROM, inserimos o nome da tabela da qual extrairemos os dados que
utilizaremos.
 Após o WHERE, podemos estabelecer as condições para filtrar os registros que devem
ser retornados. Podemos combinar duas ou mais condições usando AND e OR, como
vimos na aula anterior.

Vamos tomar a tabela Clientes criada anteriormente:


CPF Nome

11111111111 João

22222222222 Maria

33333333333 Pedro

44444444444 Mateus

Se queremos trazer todos os dados usamos o comando

1SELECT *

2FROM Clientes;#

Se queremos trazer apenas o Nome de todos os Clientes, utilizamos o comando

1SELECT Nome

2FROM Clientes ;#

Se queremos trazer apenas o Nome do Cliente que possui o CPF 44444444444, utilizamos o
comando

1SELECT Nome

2FROM Clientes

3WHERE CPF = '44444444444';#

Ordenação

Podemos ordenar os resultados de uma consulta por um ou diversos campos de uma


tabela. O comando que utilizamos neste sentido é o ORDER BY, que podemos utilizar
como ascendente (ASC) ou descendente (DESC), que é inserido no código da seguinte
forma:

1SELECT Nome_ campo

2FROM Nome_Tabela

3[WHERE condição]

4[ORDER BY Nome_campo [ASC ou DESC]];#

Imagine que queremos trazer todos os dados dos nossos Clientes, mas ordenados por ordem
alfabética de Nome. Neste caso, utilizamos:

1SELECT *
2FROM Clientes

3ORDER BY Nome ASC;#

Agrupamento

Podemos agrupar dados utilizando a cláusula GROUP BY. Este comando permite
unificar em uma única linha todas as linhas selecionadas que possuam os mesmos
valores. Sua sintaxe é:

1SELECT Nome_ campo

2FROM Nome_Tabela

3[WHERE condição]

4[GROUP BY Funções de Agregação] #;

As funções de agregação permitem tratar e retornar um resultado de várias linhas de um


campo de uma tabela. Para exemplificar o uso das funções de agregação, iremos utilizar a
tabela Produtos com dados adicionais:

Codigo_do_Produto Produto Valor_do_Produto

1 Caneta 0.50

2 Lápis 0.25

3 Borracha 1.00

4 Caderno 5.00

Sum

A função Sum permite a soma de um campo numérico. Sua sintaxe é:

1SELECT SUM(Nome_Campo)

2FROM Nome_tabela ;#

No nosso exemplo, se queremos somar, por exemplo, todos os valores de produto, ao usarmos
o comando

1SELECT SUM(Valor_do_Produto)

2FROM Produtos ;#

Teremos como resultado 6.75 (que é a soma dos elementos do campo Valor_do_Produto).
Como um SELECT comum, podemos estabelecer condições no WHERE tanto para o SUM como
para qualquer agregação. Por exemplo, o comando
1SELECT SUM(Valor_do_Produto)

2FROM Produtos

3WHERE Valor_do_Produto <2.00 ;#

trará a soma do Valor_do_Produto de todos os produtos com valor abaixo de 2.00. O resultado
que a consulta retornará é 1.75.

Avg

A função Avg retorna o valor médio entre os conjuntos de valores de um campo


numérico. Sua sintaxe é:

1SELECT AVG(Nome_Campo)

2FROM Nome_tabela;#

No nosso exemplo, se executarmos o comando

1SELECT AVG(Valor_do_Produto)

2FROM Produtos ;#

o resultado retornado será 1.6875, que é o valor médio do campo em questão (6,75/4).

Count

A função Count conta a quantidade de dados de um campo dado. Sua sintaxe é :

1SELECT COUNT(Nome_Campo)

2FROM Nome_tabela;#

No nosso exemplo, se executarmos o comando

1SELECT COUNT(Valor_do_Produto)

2FROM Produtos ;#

o resultado retornado será 4, ou seja, existem 4 linhas com valores no campo


Valor_do_Produto.

Max

A função Max retorna o maior valor encontrado entre os dados de um campo dado. Sua
sintaxe é:

1SELECT MAX(Nome_Campo)
2FROM Nome_tabela;#

No nosso exemplo, se executarmos o comando

1SELECT MAX(Valor_do_Produto)

2FROM Produtos ;#

O valor retornado será 5.00, que é o maior valor disponível no campo


Valor_do_Produto.

Min

A função Min retorna o menor valor encontrado entre os dados de um campo dado. Sua
sintaxe é:

1SELECT MIN (Nome_Campo)

2FROM Nome_tabela;#

No nosso exemplo, se executarmos o comando

1SELECT MAX(Valor_do_Produto)

2FROM Produtos ;#

O valor retornado será 0.25, que é o menor valor disponível no campo


Valor_do_Produto.

Distinct

A função Distinct não permite que valores iguais de uma mesma coluna sejam
retornados. Sua sintaxe é:

1SELECT DISTINCT(Nome_Campo)

2FROM Nome_tabela;#

No nosso exemplo, imagine que existisse, além das 4 linhas, mais uma linha com
Valor_do_Produto 0.50. Ao executarmos o comando

1SELECT DISTINCT(Valor_do_Produto)

2FROM Produtos ;#

é retornado todos os valores existentes em Valor_do_Produto, mas no caso dos


produtos com Valor_do_Produto igual a 0.50, seria exibido apenas uma vez este valor,
e não duas.
Having

Conforme aprendemos anteriormente utilizamos a cláusula WHERE quando queremos


definir uma condição de retorno de um comando SELECT. No entanto a cláusula
WHERE determina os dados que serão agregados, e não podem definir as condições
para uma agregação já realizada (ou seja, possuir condições com agregações). Neste
caso, utilizamos a cláusula Having que seleciona grupos de linhas após as agregações e
agrupamentos serem efetuados (ou seja, o HAVING possui funções de agregação). A
sintaxe é:

1SELECT Operação (Nome_Campo)

2FROM Nome_tabela

3[WHERE Condições ]

4[HAVING Condição para a Agregação];#

Por exemplo, vamos imaginar que precisamos pegar o maior valor do nosso campo
Valor_do_Produto, mas que este maior valor tenha que estar em uma faixa menor do
que 2.00. Nossa consulta terá a forma

1SELECT MAX(Valor_do_Produto)

2FROM Produto

3HAVING MAX(Valor_do_Produto)<2.00;#

Junções

Em um banco de dados podemos criar consultas que tragam dados de duas ou mais tabelas ao
mesmo tempo. Os critérios que estabelecemos para fazer o agrupamento entre tabelas é
chamada de junção.

Junção de produto cartesiano


Uma junção de produto cartesiano é uma junção entre duas (ou mais tabelas) que cria uma
tabela virtual que une os dados da primeira tabela que possuam chaves estrangeiras na
segunda tabela. Assim, para fazermos este tipo de consulta:

 No SELECT, ao invés de utilizamos os nomes dos campos como utilizamos até agora,
usaremos nome da tabela em que está o campo. nome do campo .
 Em FROM, utilizaremos os nomes das tabelas das quais queremos trazer os campos,
separados por vírgula.
 Em WHERE, as primeiras condições devem estabelecer as dependências entre as
tabelas que queremos casar. Assim, este casamento especifica as chaves estrangeiras
que ligam as tabelas.
 Caso escrever constantemente o nome da tabela seja trabalhoso, pode-se utilizar alias
para substituir o nome da tabela por um nome que seja conveniente.

Para nosso exemplo, consideremos duas tabelas relacionadas chamadas de Pacientes e


Doenças.
Pacientes

Codigo_Paciente(PK) Nome Idade Cod_Doenca(FK)

1 Bruno 23 2

2 José 55 1

3 Maria 75 1

Doencas

Codigo_Doenca(PK) Nome

1 Gripe

2 Pneumonia

3 Anemia

4 Bulimia

Queremos trazer o Nome do Paciente e o Nome da Doença que possui. Para isto devemos
pegar um campo da primeira tabela e relacioná-la com um campo da segunda tabela.

1SELECT Pacientes.Nome,Doencas.Nome

2FROM Pacientes, Doencas

3WHERE Pacientes.Cod_Doenca=Doencas.Cod_Doenca;#

O resultado obtido pela consulta será:

Nome Nome

Bruno Pneumonia

José Gripe

Maria Gripe
Como chamar as tabelas Pacientes e Doencas todas as vezes em que houver necessidade é
cansativo, associaremos à tabela Pacientes o nome de PAC e à tabela Doencas o nome de DOE.

1SELECT PAC.Nome,DOE.Nome

2FROM Pacientes PAC, Doencas DOE

3WHERE PAC.Cod_Doenca=DOE.Cod_Doenca;#

Podemos acrescentar, no WHERE, condições que nos sejam convenientes. Por exemplo,

1SELECT PAC.Nome,DOE.Nome

2FROM Pacientes PAC, Doencas DOE

3WHERE PAC.Cod_Doenca=DOE.Cod_Doenca

4AND PAC.Idade<30;#

Isto fará com que o resultado traga apenas os Nomes dos Pacientes e Nomes das Doenças, dos pacientes
cuja Idade seja menor do que 30.

Junção Interna (Inner Join)


Uma Junção Interna é caracterizada por uma seleção que retorna apenas os dados que
atendem às condições de junção, isto é, quais linhas de uma tabela se relacionam com as
linhas de outras tabelas. Para isto utilizamos a cláusula ON, que é semelhante à cláusula
WHERE. Assim, a sintaxe é :

1SELECT nomes dos campos

2FROM tabela1 INNER JOIN tabela2 ON tabela1.campo=tabela2.campo

3[WHERE condições];#

É necessário ter algum cuidado quando se combinam colunas com valores nulos (NULL), já que
o valor nulo não se combina com outro valor, ou outro valor nulo, exceto quando se agregam
predicados como IS NULL ou IS NOT NULL.

Utilizando nosso exemplo anterior, podemos trazer o nome dos Pacientes com suas respectivas
Doenças:

SELECT Pacientes.Nome, Doencas.Nome


1
FROM Pacientes INNER JOIN Doencas ON
2Pacientes.Cod_Doenca=Doencas.Cod_Doenca;#

O resultado obtido pela consulta será:

Nome Nome
Bruno Pneumonia

José Gripe

Maria Gripe

Junção Externa (Outer Join)


Uma Junção Externa é uma seleção que não requer que os registros de uma tabela possuam
registros equivalentes em outra. O registro é mantido na pseudo-tabela se não existe outro
registro que lhe corresponda. Este tipo de junção se subdivide dependendo da tabela do qual
admitiremos os registros que não possuem correspondência: a tabela esquerda, a direita ou
ambas.

Left Outer Join


O resultado desta seleção sempre contém todos os registros da tabela esquerda (isto é, a
primeira tabela mencionada na consulta), mesmo quando não exista registros
correspondentes na tabela direita. Desta forma, esta seleção retorna todos os valores da
tabela esquerda com os valores da tabela direita correspondente, ou quando não há
correspondência retorna um valor NULL.

1SELECT nomes dos campos

2FROM tabela1 LEFT OUTER JOIN tabela2 ON tabela1.campo=tabela2.campo

3[WHERE condições];#

Por exemplo, queremos trazer todas as Doenças da Tabela Doenças, com o nome dos Pacientes
relacionados. Vemos que nem todas as Doenças possuem pacientes relacionados. Nestes casos,
ao invés de trazer o valor requerido, o sistema retornará NULL. Então,

SELECT Doencas.Nome, Pacientes.Nome


1
FROM Doencas LEFT OUTER JOIN Pacientes ON
2Doencas.Codigo=Pacientes.Cod_Doenca;#

Assim, o resultado obtido é :

Nome Nome

Gripe Bruno

Gripe José

Pneumonia Maria

Anemia NULL

Bulimia NULL
Right Outer Join
Esta operação é inversa à anterior e retorna sempre todos os registros da tabela à direita (a
segunda tabela mencionada na consulta), mesmo se não existir registro correspondente na
tabela à esquerda. Nestes casos, o valor NULL é retornado quando não há correspondência.

1SELECT nomes dos campos

2FROM tabela1 RIGHT OUTER JOIN tabela2 ON tabela1.campo=tabela2.campo

3[WHERE condições];#

Para nosso exemplo, faremos o inverso do anterior

1 SELECT Pacientes.Nome, Doencas.Nome

FROM Pacientes RIGHT OUTER JOIN


2
Doencas ON
3 Pacientes.Cod_Doenca=Doencas.Cod_Doenca

4 ;#

Nome Nome

Bruno Gripe

José Gripe

Maria Pneumonia

NULL Anemia

NULL Bulimia

Full Outer Join


Esta operação apresenta todos os dados das tabelas à esquerda e à direita, mesmo que não
possuam correspondência em outra tabela. A tabela combinada possuirá assim todos os
registros de ambas as tabelas e apresentará valores nulos para os registros sem
correspondência.

1SELECT nomes dos campos

2FROM tabela1 FULL OUTER JOIN tabela2 ON tabela1.campo=tabela2.campo

3[WHERE condições];#

Outros conceitos de interesse


O aprendizado em Bancos de Dados é um aprendizado contínuo. Um curso como este, no
entanto, não consegue contemplar tudo o que é necessário a um desenvolvedor saber. Abaixo,
porém, são disponibilizados conceitos e comandos importantes para que o estudante possa
evoluir em seu aprendizado em bancos de dados.

Sub-consultas
Uma sub-consulta é uma consulta SQL aninhada dentro de uma consulta principal. Em geral,
utilizamos a sub-consulta quando precisamos de uma informação que não pode ser facilmente
trazida por um WHERE (em geral, duas consultas que devem ser executadas ao mesmo tempo
na mesma tabela). Assim, a sub-consulta é estabelecida entre parênteses e comparada com a
consulta principal utilizando-se os comandos = (igual), <> (diferente), in ou not in, sendo estes
dois últimos utilizados quando a sub-consulta trouxer mais do que um resultado.

Considere uma tabela chamada Clientes com Código do Cliente, Nome, Idade, CPF, UF.
Queremos trazer o CPF de uma pessoa com a maior idade no sistema usando uma sub-
consulta.

1SELECT *
FROM Clientes
2
WHERE CodCliente = (SELECT Cod_Cliente FROM Clientes HAVING
3max(Idade););

Operações Básicas
No MySQL podemos fazer operações aritméticas básicas com qualquer campo que seja
baseado em números. Estas operações podem ser utilizadas tanto no corpo do comando como
nas condições estabelecidas pelo WHERE.

Comentários
MySQL suporta comentários através do símbolo – . Este símbolo só vale, no entanto, até o final
da linha, sendo necessário que o desenvolvedor coloque linha-a-linha caso comente múltiplas
linhas. Exemplo:

1SELECT * --Trago todos os usuários


FROM Clientes -- da tabela Clientes
2
WHERE CodCliente = (SELECT Cod_Cliente FROM Clientes HAVING
3max(Idade););

In e Not In

In e Not In permitem que uma condição selecione uma opção entre diversas opções
(IN) ou que não selecione nenhuma das opções (NOT IN). Por exemplo, imaginemos
que temos uma tabela Clientes com Código do Cliente, Nome, Idade, CPF e UF e
queremos trazer os nomes de todos os clientes de SP, MG e ES. A consulta teria a
seguinte forma:
1SELECT Nome

2FROM Clientes

3WHERE UF in ('SP','MG','ES');

Se quisermos criar uma consulta que traga todos os clientes desta tabela, menos os
clientes de RJ e RS, por exemplo, usamos:

1SELECT Nome

2FROM Clientes

3WHERE UF in ('RJ','RS');

Like e Not Like


Comandos utilizados para comparar strings (em termos de igualdade). No conteúdo da
comparação pode-se utilizar % como elemento coringa para expressar zero ou mais caracteres
antes ou depois do termo comparado.

Considere uma tabela chamada Clientes com Código do Cliente, Nome, Idade, CPF, UF.
Queremos trazer os usuários que o nome seja igual a Luana.

1SELECT Nome

2FROM Clientes

3WHERE Nome like ('Luana');

Agora queremos trazer os Clientes cujo primeiro nome seja Luana, mas independente do
sobrenome.

1SELECT Nome

2FROM Clientes

3WHERE Nome like ('Luana%');

Agora queremos trazer os Clientes em que o primeiro nome pode ser qualquer um, mas o
último nome seja Luana.

1SELECT Nome

2FROM Clientes

3WHERE Nome like ('%Luana');

Agora queremos trazer os Clientes em que o primeiro nome e o sobrenome podem ser qualquer
um, mas que possuam Luana incluso.
1SELECT Nome

2FROM Clientes

3WHERE Nome like ('%Luana%');

Between
Permite estabelecer um intervalo entre dois valores. Desta forma a instrução pega todos os
elementos que estão entre os dois valores estabelecidos.

Considere uma tabela chamada Consulta, com Data de Consulta, Horário e Nome do Paciente.
Queremos trazer todos os pacientes que terão consulta entre 01-01-2011 e 10-01-2011.

1SELECT Nome_Paciente

2FROM Consultas

3WHERE Data_Consulta between '2011-01-01' and '2011-01-10';

Considere uma tabela chamada Clientes com Código do Cliente, Nome, Idade, CPF, UF.
Queremos trazer os usuários em que a idade esteja entre 18 e 30 anos.

1SELECT Nome

2FROM Clientes

3WHERE Idade between 18 and 30;

Now()
Traz a data e hora atual do sistema.Considere uma tabela chamada Consulta, com Data de
Consulta, Horário e Nome do Paciente. Queremos trazer todos os pacientes que terão consulta
entre 01-01-2011 e agora.

1SELECT Nome_Paciente

2FROM Consultas

3WHERE Data_Consulta between '2011-01-01' and now();

Formato de Datas
No MySQL podemos transformar o formato de data padrão em um formato de data
conveniente para trabalharmos em nossa aplicação. A sintaxe de formatação é

1DATE_FORMAT (data,formato)

Abaixo segue os principais identificadores que podem ser combinados em uma string na
posição do formato:

 %M : nome do mês (January…December).


 %m: número do mês
 %W: nome da semana (Sunday..Saturday)
 %Y: ano com 4 dígitos
 %y: ano com 2 dígitos
 %d: dia do mês numérico (00…31)
 %e: dia do mês numérico (0…31)
 %H: hora no formato (00…23)
 %h: hora no formato (01…12)
 %i: minutos no formato (00…59)
 %S: segundos no formato (00…59)

Considere uma tabela chamada Consulta, com Data de Consulta, Horário e Nome do Paciente.
Queremos trazer todos os pacientes que terão consulta entre 01-01-2011 e agora, mas com
formato padrão brasileiro.
1SELECT Nome_Paciente, DATE_FORMAT(Data_Consulta,'%e %m %Y')

2FROM Consultas

3WHERE Data_Consulta between '2011-01-01' and now();

Tratamento de Strings
MySQL possui diversos comandos para tratar strings. As principais são:

 UCASE: torna o texto com todas as letras em maiúsculas.

1SELECT UCASE(Nome_Paciente)

2FROM Consultas

3WHERE Data_Consulta between '2011-01-01' and now();

 LCASE: torna o texto com todas as letras em minúsculas.

1SELECT LCASE(Nome_Paciente)

2FROM Consultas

3WHERE Data_Consulta between '2011-01-01' and now();

 REPLACE: retorna uma string com todos os valores especificados substituídos.

1SELECT REPLACE('Bancos de Dados II', 'I', '2');

Irá substituir (de forma virtual) o II por 22 resultando em Bancos de Dados 22. Esta função
pode ser recombinada com um UPDATE para higienizar o banco de dados.
Visões

Uma visão (view) é uma consulta armazenada em um banco de dados. Ela é utilizada para que
não precisemos redigitar uma consulta toda vez que for necessário utilizá-la, criando uma
tabela virtual que armazena as informações que necessitamos.

Criando uma visão


A sintaxe para criar uma visão é a seguinte:

1CREATE VIEW Nome_da_View AS Consulta Armazenada;

Na consulta armazenada, podem ser incluídas consultas normais, consultas com junções ou
funções. Para invocar a visão utilizamos o Select normalmente.

Por exemplo, vamos considerar que temos uma tabela chamada Clientes com Código do
Cliente, Nome do Cliente, CPF e Idade, e queremos criar uma consulta que sempre traga o
Nome e a Idade do Cliente.

1CREATE VIEW IdadeCliente AS SELECT Nome, Idade FROM Clientes;

Ao clicar em ENTER, a VIEW será guardada no SGBD. Para chamar a visão quando
necessitarmos, iremos fazer:

1SELECT * FROM IdadeCliente;

Atualizando uma visão


Em geral, os valores de uma Visão são manipulados através da alteração nas suas tabelas-base.
Já quando nos referimos diretamente a uma visão, quando esta é composta de SELECTS
simples (isto é, sem agregação) podem receber comandos UPDATE e DELETE. Já uma Visão
com funções de agregação não podem receber atualizações.

Excluindo uma visão


Para excluir uma visão, basta utilizar o comando:

1DROP VIEW nome da view;

Procedimentos e Funções

Procedimento em MySQL designa um conjunto de instruções com um nome, que faz um


processamento mas não devolve um resultado. Uma Função é um conjunto de instruções que
devolve um resultado. Um procedimento é recomendado quando um processamento fechado
deve ser efetuado, já a função é recomendada quando uma consulta necessita de um pré-
processamento. Procedimentos e Funções podem conter códigos SQL comuns, mas também
podem contar com comandos de controle, próprios das linguagens de programação.

Por padrão, o SQL não é uma linguagem de programação normal, e por isto possui seu poder
extendido através do uso de linguagens de programação específicas. Ex. PL-SQL para Oracle, e
Transact-SQL para Sybase e SQL Server. O MySQL utiliza o SQL:2003 para sintaxe (o mesmo
utilizado pelo DB2 da IBM). O MySQL neste sentido é bem mais limitado do que seus
semelhantes Oracle e SQL Server, mas possui recursos que permite desenvolver
processamento semelhante às linguagens de programação.

Em geral, criamos as estruturas dos procedimentos e compilamos e depois apenas os


chamamos, passando os parâmetros necessários para a execução do código. Procedimentos e
Funções utilizam as estruturas de controle padrão das linguagens de programação, que devem
ser estudadas para uso correto. São utilizados quando as operações básicas feitas em um BD
são as mesmas independente das linguagens de programação que as acessam, o que aumenta
a performance e a segurança do BD.

Criando um procedimento ou função


1CREATE PROCEDURE Nome do Procedimento (Parâmetros)

2BEGIN

3 --Corpo da Rotina

4END;

1CREATE FUNCTION Nome (Parâmetros tipo) RETURNS Tipo do Retorno

2BEGIN

3 --Corpo da Rotina

4 RETURN Valor Retornado;

5END;

Parâmetro é o nome dado aos valores que passamos para o procedimento ou função
executar e realizar uma ação.

1CALL Nome do Procedimento ou Função (Parâmetros);

Como exemplo do uso do procedimento básico, vamos fazer um código que exiba Olá Mundo
ao usuário:

1CREATE PROCEDURE OlaMundo ()

2BEGIN
3 SELECT 'Olá Mundo';

4END;

Ao clicarmos em ENTER, o procedimento será armazenado e poderá ser invocado utilizando-se


o comando:

1CALL OlaMundo ();

Um exemplo de procedimentos com uso de parâmetros e com uma estrutura condicional pode
ser feito com o procedimento abaixo, que verifica através de um comando SE…ENTÃO…SENÃO
se determinados campos estão preenchidos ou não:

1
DELIMITER //
2
CREATE PROCEDURE InsiraCliente(vnome VARCHAR(60), vcpf CHAR(11))
3BEGIN

4 IF ((vnome != '') && (vcpf != '')) THEN

5 INSERT INTO Cliente (nome, cpf) VALUES (vnome, vcpf);

6 ELSE

SELECT 'Nome e cpf devem ser preenchidos!' AS Msg;


7
END IF;
8
END; //
9

Se quisermos agora inserir valores utilizando o procedimento, basta chamar:

1CALL InsiraCliente('João da Silva', 11111111111');

Agora um exemplo de uso de funções. Um comando básico que recebe duas notas e retorna a
média entre elas:

1
DELIMITER //
2CREATE FUNCTION media (n1 FLOAT, n2 FLOAT) RETURNS FLOAT

3BEGIN

4 DECLARE media FLOAT;

5 SET media=(n1+n2)/2;

6 RETURN media;

END
7
; //
8
Um exemplo básico para uso da função é o comando:

1SELECT media (10,8.5);

Atualizando um procedimento ou função


1ALTER PROCEDURE | FUNCTION Nome

2 --Código Modificado

Excluindo um procedimento ou função


1DROP PROCEDURE | FUNCTION [IF EXISTS] Nome da Procedure ou Função;

Por exemplo:

1DROP PROCEDURE InsiraCliente;

Uma boa recomendação é sempre utilizar este comando antes de criar uma função ou
procedimento para que não haja conflito. Um exemplo:

1DROP PROCEDURE IF EXISTS OlaMundo;

2CREATE PROCEDURE OlaMundo ()

3BEGIN

4 SELECT 'Olá Mundo';

5END;

Comandos de Programação

A programação em MySQL obedece aos mesmos elementos aprendidos em Lógica de


Programação e possuem a seguinte estrutura:

1. Todos os códigos, linha-a-linha terminam com ponto-e-vírgula (;).


2. Para criar variáveis dentro do corpo do código (entre BEGIN e END) usamos DECLARE
nome_da_variável tipo_variável;
3. Para associar um valor a uma variável utilizamos o comando SET nome_da_variável=
novo_valor;
Comandos de controle principais
IF… ELSE… END IF;

O comando IF…ELSE…END IF; permite estabelecer uma estrutura condicional onde


se a condição é verdadeira, é executado o primeiro bloco de comandos, senão, o
segundo bloco.

1
DELIMITER //
2
CREATE FUNCTION Comparacao(numero1 INT, numero2 INT) RETURNS
VARCHAR(20)
3
BEGIN
4
DECLARE texto VARCHAR(20);
5
IF numero1 < numero2 THEN
6
SET texto = '<';
7
ELSEIF numero1 = numero2 THEN
8 SET texto = '=';

9 ELSE

10 SET texto = '>;';

11 END IF;

SET texto = CONCAT(numero1, ' ', texto, ' ', numero2);


12
RETURN texto;
13
END // DELIMITER ;
14

WHILE… DO… END WHILE;


O comando While permite que enquanto uma determinada condição é verdadeira, o comando
seja repetido.

DELIMITER //
1
CREATE PROCEDURE TesteEnquanto()
2
BEGIN
3
DECLARE valor INT;
4
SET valor=0;
5
WHILE valor &lt; 10 DO
6 SELECT 'Olá Mundo' AS Msg;
7 SET valor = valor + 1;

8 END WHILE;

END //DELIMITER;
9

10

CASE… WHEN…END CASE;


Implementa um conjunto de condições, sendo mais fácil de manipular do que o IF e ELSE.

1
DELIMITER //
2
CREATE PROCEDURE ExemploCase(opcao INT)
3
BEGIN
4 CASE opcao

5 WHEN 1 THEN SELECT * FROM Clientes;

6 WHEN 2 THEN SELECT Nome,Idade FROM Clientes;

7 WHEN 3 THEN SELECT Nome FROM Clientes;

8 ELSE

SELECT "Opção digitada errada" AS MSG;


9
END CASE;
10
END
11
//DELIMITER;
12

Gatilhos

Gatilho é o nome de um conjunto de comandos que são executados antes ou depois de uma
alteração é feita em uma tabela (INSERT, UPDATE e DELETE). Criamos o código de um gatilho,
que será armazenado no banco e executado todas as vezes que alguma alteração relacionada
for feita na tabela com a qual trabalha.Não é possível criar uma trigger para uma visão e não é
possível chamar uma trigger isoladamente (com CALL p.ex.).

A sintaxe do gatilho é :

1CREATE TRIGGER nome do gatilho [BEFORE|AFTER] [INSERT|REPLACE|


2DELETE|UPDATE]

3ON tabelaqueserámanipulada [FOR EACH ROW]


BEGIN
4
--definições do que o gatilho deverá fazer. Se possuir mais de uma
5linha usa-se BEGIN e END.

END;

Um exemplo de código utilizando um gatilho:

1
DELIMITER //
2
CREATE TRIGGER teste BEFORE INSERT
3 ON Cliente FOR EACH ROW

4 BEGIN

5 SET @nome=NEW.NomeCliente;

6 IF ((@nome=' ') OR (CHAR_LENGTH(@nome)&lt;10) ) THEN

7 SET NEW.NomeCliente = NULL;


END IF;
8
END;
9
// DELIMITER ;
10

Neste exemplo, todas as vezes que tentarmos realizar um INSERT na tabela Clientes, o gatilho
será acionado, verificando se o nome do cliente que será inserido é vazio ou menor do que 10.
Caso uma destas condições se cumpra, o que será inserido na tabela cliente será NULL.

Se queremos alterar um gatilho, usamos a sintaxe:

ALTER TRIGGER nome do gatilho [BEFORE|AFTER] [INSERT|REPLACE|


1DELETE|UPDATE]

2ON tabelaqueserámanipulada [FOR EACH ROW]

3BEGIN

4--definições do que o gatilho deverá fazer. Se possuir mais de uma


linha usa-se BEGIN e END.
5
END;

Para excluir um gatilho, usamos a sintaxe:

1DROP TRIGGER nome do gatilho;


Operadores NEW e OLD
Dentro dos gatilhos, usamos os operadores NEW e OLD para acessar campos de uma tabela
conforme nossa necessidade. OLD serve para acessar os valores que já estão no banco de
dados e NEW serve para acessar os valores que serão inseridos no bancos de dados.
Logicamente, o método de manipulação dos valores NEW e OLD varia de acordo com o tipo de
operação a ser feita no banco:

 INSERT: o operador NEW.nome_coluna, nos permite verificar o valor enviado para ser
inserido em uma coluna de uma tabela. OLD.nome_coluna não está disponível.
 DELETE: o operador OLD.nome_coluna nos permite verificar o valor excluído ou a ser
excluído. NEW.nome_coluna não está disponível.
 UPDATE: tanto OLD.nome_coluna quanto NEW.nome_coluna estão disponíveis, antes
(BEFORE) ou depois (AFTER) da atualização de uma linha.

Exemplo:
1
DELIMITER //
2
CREATE TRIGGER Teste 3 AFTER INSERT
3ON Cliente FOR EACH ROW

4BEGIN

5IF (NEW.email IS NOT NULL) THEN

6INSERT INTO CadastroContato SET email=NEW.email;

7END IF;
END;
8
// DELIMITER;
9

Transações

Transação é o nome que é dado à unidade de trabalho (dentro de um procedimento ou


função) única, lógica e indivisível dentro de um SGBD. O código da transação é criada e
disponibilizada dentro de um procedimento ou uma função: se o processamento não for feito
de forma completa, é cancelado todo o processamento. Isto é feito para manter a consistência
dos dados e das operações dentro do banco.

Para visualizarmos a idéia de como funciona uma transação, podemos imaginar uma
transferência bancária entre duas contas: para fazer uma transferência, é retirado o dinheiro
de uma conta e depositada em uma outra. Se a retirada ou o depósito não ocorre, todo o
processo de transferência é abortado.
Nem todo tipo de tabela em MySQL suporta transações. No MySQL as tabelas que dão suporte
a tal são as InnoDB. Por default, este é o tipo de tabela padrão depois da versão 5.5, mas antes
da versão 5.5, o MySQL cria tabelas do tipo MyISAM, sendo necessária a conversão para uso
de transações. Esta conversão pode ser feita de duas formas: criando-se tabelas do tipo
InnoDB diretamente ou fazendo a conversão de uma tabela já existente.

Convertendo tabelas de MyISAM para InnoDB


Para criar uma tabela do tipo InnoDB, basta inserir o comando type=innodb, após o comando
CREATE TABLE, antes do ponto-e-vírgula final. Por exemplo:

1CREATE TABLE teste (

2 teste_id int(2),

3 teste_nome varchar(10))

4 type=innodb; #

A conversão de uma tabela existente pode ser feita utilizando-se o comando ALTER TABLE,
usando type=innodb;. Por exemplo, se possuímos uma tabela chamada teste1 e queremos
alterá-la para o tipo innodb, usamos o comando:

1ALTER TABLE teste1 type=innodb;

Trabalhando com transações


Por padrão, o MySQL trabalha com autocommit=1, o que significa que todo comando
executado é imediatamente processado/gravado , seja ele certo ou errado. Para podermos
trabalhar com transações, devemos desabilitar o autocommit, o que fazemos digitando o
código:

set autocommit=0;

Existem formas diferenciadas de escrevermos uma transação. Neste curso aprenderemos a


forma mais conhecida. A sintaxe neste caso é:

1START TRANSACTION;

2--Comandos

3COMMIT | ROLLBACK; --selecionar uma opção: Commit ou Rollback

O final da transação (COMMIT ou ROLLBACK) deve ser escolhido conforme a


conveniência do desenvolvedor:

 COMMIT: indica o término de uma transação bem-sucedida. O comando indica ao


gerenciador de transações que os comandos da transação foram concluídos com
sucesso e o banco de dados está em um estado consistente, permitindo que todas as
atualizações da transação se tornem permanentes.
 ROLLBACK: assinala o término de uma transação mal-sucedida. O comando indica ao
gerenciador de transações que os comandos da transação tiveram alguma falha na sua
execução e que qualquer alteração feita pela transação deve ser desfeita.

Agora criaremos um procedimento de transferência de valores entre contas, utilizando o que


já aprendemos sobre transações. Imagine que possuímos uma tabela chamada cliente, que
possui um campo de identificação e um campo de saldo. Se fazemos uma transferência,
devemos retirar de uma determinada conta e transferir para outra. Se as duas ações
ocorrerem sem problemas, as atualizações são permanentes. Senão, as ações não são
executadas.
1 CREATE PROCEDURE transferencia (de_conta int, para_conta int, valor
numeric(10,2))
2
BEGIN
3
START TRANSACTION;
4
UPDATE cliente
5
SET saldo=saldo-valor
6
WHERE cod_cliente=de_conta;
7

8 UPDATE cliente

9 SET saldo=saldo+valor

10 WHERE cod_cliente=para_conta;

11 COMMIT;

END;
12

Savepoint
O comando SAVEPOINT permite salvar pontos de salvação dentro de uma transação.
SAVEPOINT permite que a transação não seja totalmente anulada, mas permite que o
processamento seja anulado apenas até o ponto do SAVEPOINT. Para utilizarmos este recurso,
são necessários dois comandos:

1SAVEPOINT identificador;

Que determina o ponto em que a transação deve retornar. O comando a seguir é o que
termina o código e diz para a transação retornar até o comando anterior:

1ROLLBACK TO SAVEPOINT identificador;

Índices
Em um Banco de Dados, a busca de um conjunto de dados pode ser demorada devido à
quantidade de dados total do sistema. Isto porque, em geral, ao buscar um determinado
dado, o sistema inicia do primeiro dado da coluna indo um-a-um até encontrar o dado
conveniente. Neste sentido, a maioria dos SGBDs oferecem sistemas de indexação dos
dados para agilizar a busca. A indexação permite agilizar consulta de campos que
estejam no WHERE, que sejam utilizados em junções ou para encontrar valores para
funções max e min de colunas específicas.

O MySQL possui três tipos de indexação: PRIMARY, UNIQUE e INDEX.

Criando Índices
Em geral, os índices são criados quando construímos as tabelas. O primeiro tipo PRIMARY, se
refere às chaves primárias (que são uma espécie de índice ) e que já criamos da seguinte
forma:

1CREATE TABLE clientes (

2 codigo INT NOT NULL,

3 nome VARCHAR(60) NOT NULL,

4 PRIMARY KEY (codigo));

O segundo tipo de índice (UNIQUE) obriga que um campo (que não seja a chave primária)
também só possa ter um valor específico dentro do banco de dados. Por exemplo:

1CREATE TABLE clientes (

2 codigo INT NOT NULL,

3 nome VARCHAR(60) NOT NULL,

4 cpf char(11) NOT NULL,

5 PRIMARY KEY (codigo),

UNIQUE (cpf));
6

O terceiro tipo (INDEX) cria um índice utilizando um campo específico:

CREATE TABLE clientes (


1
codigo INT NOT NULL,
2
nome VARCHAR(60) NOT NULL,
3
cpf char(11) NOT NULL,
4
PRIMARY KEY (codigo),
5
INDEX (cpf));
6

Em INDEX, quando os campos são char e varchar podemos pegar apenas uma quantidade
específica de caracteres, ao invés de todo o campo. Por exemplo:

1
CREATE TABLE clientes (
2 codigo INT NOT NULL,

3 nome VARCHAR(60) NOT NULL,

4 cpf char(11) NOT NULL,

5 nome_mae VARCHAR(60) NOT NULL,

6 PRIMARY KEY (codigo),

UNIQUE (cpf),
7
INDEX mae (nome_mae(10)));
8

irá pegar apenas os primeiros 10 caracteres de nome_mae para tranformar em índice.

Para criar indíces para tabelas já criadas, a sintaxe é:

1CREATE [UNIQUE|FULLTEXT] INDEX nome_indice

2ON nome_tabela (campos,...);

Índices de múltiplos campos


Podemos criar índices para múltiplos campos, sendo que um índice pode possuir até 15
campos. Um exemplo:

1CREATE TABLE pacientes (

2 codigo INT NOT NULL,

3 primeiro_nome VARCHAR(60) NOT NULL,

4 sobrenome VARCHAR(30) NOT NULL,

5 PRIMARY KEY (codigo),

INDEX nome (primeiro_nome,sobrenome));


6

É criado um índice chamado nome, que será utilizado em um limite entre primeiro_nome ->
primeiro_nome e sobrenome.

Excluindo Índices
Para excluir um índice de uma tabela, usamos a seguinte sintaxe que é mapeada para um
ALTER TABLE:
1DROP INDEX nome_indice ON tabela;

Comandos DCL

Comandos DCL (Data Control Language) é o sub-conjunto da linguagem SQL que


trata da criação, manipulação, exclusão e controle de acesso de usuários a um banco de
dados. Em MySQL os comandos Grant e Revoke permitem aos DBAs criarem usuários
e dar os privilégios necessários em cada caso.

Criando usuários e concedendo privilégios em MySQL


A sintaxe básica para criar usuários e conceder privilégios em MySQL é:

1GRANT privilégios [colunas]

2ON item

3TO usuário [IDENTIFIED BY senha]

4[WITH GRANT OPTION];

 A opção Privilégios determina as ações que um determinado usuário pode fazer em


um banco de dados. Dentre os diversos privilégios que podem ser estabelecidos, os
principais são (separadas por vírgula caso se utilize mais de uma):
o SELECT
o INSERT
o UPDATE
o DELETE
o INDEX
o ALTER
o CREATE
o DROP
o SHUTDOWN
o ALL
 A opção Colunas é opcional e determina a coluna (ou colunas) que o usuário pode
manipular dentro das tabelas de um banco de dados.
 A opção Item determina o banco de dados ou a tabela em que o usuário poderá ter os
privilégios. Algumas opções possíveis são:
o *.* : os privilégios do usuário serão para todos os bancos de dados do sistema.
o Nome do Banco.* : os privilégios serão para todas as tabelas de um banco de
dados específicos.
o Nome do Banco. Tabela: o privilégio será para uma tabela específica.
 A opção Usuário determina o nome do usuário que poderá utilizar o sistema.
 A opção Senha determina uma senha que o usuário deverá utilizar para acessar o
sistema.
 A opção WITH GRANT OPTION, se for especificada, permite que o usuário possa dar
permissões a outros usuários.

Os privilégios do MySQL são armazenados em quatro tabelas do sistema, que podem ser
manipuladas diretamente conforme a conveniência do DBA:
mysql.user

mysql.db

mysql.tables_priv

mysql.columns_priv

Removendo privilégios de usuário


Para remover privilégios de um usuário, usamos a sintaxe:

1REVOKE privilégios [colunas]

2ON item

3FROM usuário;

Deletando usuários

Podemos excluir um usuário que não possua nenhum privilégio no sistema. Para isto
verificamos os privilégios do usuário no sistema e revogamos todos estes privilégios.
Depois disto, usamos o comando:

1DROP USER nome_usuario;

Backup e Segurança

Backup
Backup é o nome que damos aos arquivos salvos de um sistema, de tal forma que possamos
recuperar o sistema em seu estado mais atual caso ocorra algum problema com este sistema.
As bases de dados do MySQL são criadas automaticamente na pasta mysql do sistema, onde
cada base de dados possui uma pasta específica com arquivos referentes às tabelas criadas. A
forma menos sofisticada é salvar o conteúdo destas pastas copiando para outro lugar
conveniente. Porém, como as bases de dados possuem modificações constantes, a cópia feita
pode possuir inúmeras inconsistências. Pode-se paralisar o MySQL, porém, na maioria dos
casos, o SGBD não pode ser paralisado em hipótese alguma.

Uma opção pode ser o uso do utilitário mysqldump que já acompanha o MySQL. Ele acessa o
banco de dados como faria qualquer outra aplicação, e fazendo cópias consistentes das tabelas
criando um arquivo SQL que compõe o banco e os dados das tabelas. A sintaxe básica é:
mysqldump [OPÇÕES] banco_de_dados [tabelas] > arquivo SQL

Possuímos muitas opções para inserir no comando mysqldump, de forma a otimizar nossa
exportação de dados e estrutura, mas as principais são:

 -u: usuário.
 –password[=sua_senha]: senha de um usuário.
 –add-drop-table: adiciona DROP TABLE antes de toda instrução CREATE TABLE.
 -A: descarrega todos os bancos de dados.
 -X: salva em formato XML.
 -x: dá um lock nas tabelas do banco de dados.
 -p: senha

Exemplo de comando:
# mysqldump -u root -p -x -A > arquivo.sql

Você pode compactar o arquivo gerado, acrescentando .gz:

# mysqldump -u root -p -x -A > arquivo.sql.gz

O arquivo pode ser aberto posteriormente com o comando gunzip:

gunzip arquivo.sql.gz

Para restaurar um backup posteriormente, usamos o comando mysql:

# mysql -u root -p –database=NOME DO BANCO DE DADOS < arquivo.sql

Segurança em MySQL
Para garantir o funcionamento correto de bancos de dados, diversos procedimentos devem ser
tomados:

 Não conceda a nenhum usuário (que não seja o DBA do sistema) permissões de acesso
às tabelas de usuário do MySQL;
 Sempre ofereça a menor opção de acesso possível a um determinado usuário. Evite
criar usuários e senhas fáceis de serem quebrados ou com permissão de acesso total
ao sistema.
 Se o servidor possui conexão com a Internet, invista em procedimentos de segurança,
como firewall, nunca utilize usuários com senhas vazias e nunca armazene as senhas e
usuários de forma aberta em algum computador da rede.
 Configurar os sistemas que manipularão o banco de dados para evitar SQL Injection.

Flat File
Alguns sistemas não necessitam de bancos de dados poderosos para trabalhar as informações
necessárias para seu processamento. Em alguns casos, o uso de um arquivo básico (.txt ou .ini)
pode ser eficiente para gravar e ler dados. Um flat file é um arquivo de texto, geralmente
contendo um registro por linha, utilizado quando não possuímos uma quantidade grande de
informações a ser trabalhada ou não há necessidade de uma manipulação mais exigente dos
dados de uma determinada aplicação. Em algumas aplicações, os registros de um flat file
possuem valores simples e são utilizados para armazenar variáveis locais que manipulem o
sistema (p.ex. uma determinada cor de programa escolhida pelo usuário ou os arquivos de
configuração dos sistemas operacionais) enquanto em outros sistemas estes registros podem
ser parecidos com tabelas de bancos de dados relacionais, sendo que cada linha é separada
por campos (limitados por caracteres especiais como ; ou |) com informações específicas em
cada campo. Este último caso, em geral, é utilizado para importação e exportação de dados
entre as organizações, já que, em geral, arquivos flat file são suportados por bancos de dados e
por sistemas como Microsoft Excel e OpenOffice Calc.

A maior parte das linguagens de programação possuem funções que permitem criar, escrever,
ler e apagar arquivos. Estas funções podem ser utilizadas normalmente para compor arquivos
de sistema que permitam tornar mais flexível sua aplicação, reduzindo a carga de um
determinado banco de dados. Estas funções também permitem compor arquivos de texto que
possam ser utilizados para envio de dados para outros locais.

Conceitos de XML

XML (Extensible Markup Language) é um modelo de linguagem de marcação desenvolvido


pela W3C, cujo objetivo é produzir documentos com dados organizados de forma hierárquica
facilitando a legibilidade por seres humanos e máquinas e que seja independente de qualquer
tecnologia que o utilize. Devido ao seu poder de organização e caráter flexível, é, em geral,
utilizado em sistemas que precisam comunicarem-se entre si, mas possuem tecnologias
diferentes. Boa parte dos SGBDs suportam a importação e exportação de arquivos no formato
XML e é possível, sem maiores complicações, que qualquer desenvolvedor crie geradores e
leitores de arquivos XML. As vantagens em relação ao arquivo flat file comum é justamente
pela praticidade de leitura e manipulação deste tipo de arquivo. A principal desvantagem
técnica do uso do XML está na velocidade de transmissão e leitura de um arquivo construído
no seu modelo.

Criando um arquivo XML


Um arquivo XML é criado em um arquivo de texto simples salvo com a extensão .XML. Um
documento XML começa com o seguinte cabeçalho:
1<?xml version="1.0" encoding="ISO-8859-1"?>

Em seguida, criamos uma estrutura (chamada de estrutura principal) sobre o qual o arquivo
XML versa e que serve como raiz de todo o documento. A estrutura é criada por duas tags com
o mesmo nome, onde a última deve ter uma barra (que significa que a estrutura está sendo
fechada). Por exemplo, se estamos criando arquivos XML onde cada arquivo conterá o
currículo de uma pessoa específica, podemos criar:

1<?xml version="1.0" encoding="ISO-8859-1"?>

2<curriculos>

3</curriculos>

Dentro desta estrutura, criaremos o corpo do nosso arquivo XML. Cada elemento que
queremos inserir terá seu nome inserido entre tags que abrem e fecham (isto é sempre
obrigatório, exceto para o cabeçalho do arquivo), e o valor de cada elemento será colocado
entre as tags. É importante definir que XML é case sensitive, diferindo o uso de maiúsculas e
minúsculas.

1<?xml version="1.0" encoding="ISO-8859-1"?>

2<curriculos>

3 <nome> Maria da Silva </nome>

4 <datanascimento> 06/01/1976 </datanascimento>

5</curriculos>

Caso haja necessidade de criar seções dentro do arquivo XML podemos fazer sem problemas,
apenas acrescentando as tags de abrir e fechar:

1 <?xml version="1.0" encoding="ISO-8859-1"?>


<curriculo>
2
<dadospessoais>
3
<nome> Maria da Silva </nome>
4
<datanascimento> 06/01/1976 </datanascimento>
5
<dadospessoais>
6

7
<dadosprofissionais>
8 <cargo> Analista de Sistemas</cargo>

9 <tempoexperiencia> 3 anos </tempoexperiencia>


10 </dadosprofissionais>

11</curriculo>

12

XML também permite que possamos ter atributos para cada elemento dentro das tags de
acordo com a nossa conveniência.

1
<?xml version="1.0" encoding="ISO-8859-1"?>
2

3
<curriculo tipo="TI">
4
<dadospessoais>
5 <nome> Maria da Silva </nome>

6 <datanascimento> 06/01/1976 </datanascimento>

7 <dadospessoais>

9 <dadosprofissionais>

<cargo> Analista de Sistemas</cargo>


10
<tempoexperiencia> 3 anos </tempoexperiencia>
11
</dadosprofissionais>
12
</curriculo>
13

Se for necessário, podemos anexar diversos conjuntos de código XML em um mesmo


documento:

1
<?xml version="1.0" encoding="ISO-8859-1"?>
2 <curriculos>

3 <curriculo tipo="TI">

4 <dadospessoais>

5 <nome> Maria da Silva </nome>

<datanascimento> 06/01/1976 </datanascimento>


6
<dadospessoais>
7
8 <dadosprofissionais>

9 <cargo> Analista de Sistemas</cargo>

<tempoexperiencia> 3 anos </tempoexperiencia>


10
</dadosprofissionais>
11
</curriculo>
12
<curriculo tipo="Financeiro">
13
<dadospessoais>
14
<nome> Luana da Silva </nome>
15 <datanascimento> 16/11/1979 </datanascimento>

16 <dadospessoais>

17 <dadosprofissionais>

18 <cargo> Assistente</cargo>

<tempoexperiencia> 2 anos </tempoexperiencia>


19
</dadosprofissionais>
20
</curriculo>
21
</curriculos>
22

23

Comentários em XML possuem a mesma estrutura dos comentários em HTML, sendo


colocados entre <!– e –>:

1 <?xml version="1.0" encoding="ISO-8859-1"?>

2 <curriculos>

3 <curriculo tipo="TI"> <!-- Este é o currículo de um profissional


de TI-->
4
<dadospessoais>
5
<nome> Maria da Silva </nome>
6 <datanascimento> 06/01/1976 </datanascimento>

7 <dadospessoais>

8 <dadosprofissionais>

9 <cargo> Analista de Sistemas</cargo>


10 <tempoexperiencia> 3 anos </tempoexperiencia>

11 </dadosprofissionais>

</curriculo>
12
<curriculo tipo="Financeiro"> <!--Este é o currículo de um
13profissional financeiro-->

14 <dadospessoais>

15 <nome> Luana da Silva </nome>

16 <datanascimento> 30/11/1979 </datanascimento>

<dadospessoais>
17
<dadosprofissionais>
18
<cargo> Assistente</cargo>
19
<tempoexperiencia> 2 anos </tempoexperiencia>
20
</dadosprofissionais>
21
</curriculo>
22</curriculos>

23

Processo de Busca na Web

O surgimento da World Wide Web e o conceito de arquivos hipermídia conectados entre si


trouxe uma sobrecarga de informações disponíveis mas não facilmente acessadas por um ser
humano comum. Uma edição de um jornal de grande circulação contém mais informações do
que um ser humano do século 17 receberia em toda a sua vida, por exemplo. Esta grande
“base de dados” tem sido utilizada por diversas empresas e organizações para obter
informações que não conseguiriam obter de outra forma. No entanto, diferente dos sistemas
de bancos de dados comuns, estas informações não estão organizadas e disponibilizadas de
forma eficiente para o público comum. Os métodos de busca na Web tem servido de base para
a área de Recuperação de Informações que serve tanto para uso na rede como para
recuperação de informações em uma rede específica.

Buscadores Web

Um buscador Web são sistemas especializados em buscar dados de sites e arquivos


disponibilizados na Web. Os dados recuperados nestas buscas são armazenados em
bancos de dados, que posteriormente servirão para consulta por parte do usuário final
através das técnicas comuns de bancos de dados. Inicialmente, os primeiros sites de
“busca” não faziam esta busca de forma automática: a inserção de sites era feita de
forma manual através de profissionais humanos. Em geral, para um site ser detectado
era necessário a visita deste profissional de forma espontânea ou através de um cadastro
feito pelo profissional do site. Logicamente, este tipo de busca trazia sérias limitações o
que levou às tentativas de automatização do processo de indexação dos conteúdos de
arquivos na Web.

Neste sentido foram desenvolvidos os search engines (mecanismos de busca) que são
programas cuja função é:

 Identificar uma página de internet;


 Extrair os dados dos documentos (isto é, fazem uma cópia dos dados dos
documentos);
 Armazenar os dados obtidos em um banco de dados;
 Oferecer uma interface ao usuário para consulta dos dados.

A identificação de uma página de internet é feita através do reconhecimento de


hiperligações. Um search engine varre um site, copiando seu conteúdo e abrindo as
hiperligações, que levam para outras páginas onde é efetuado o mesmo processo. Este
processo, mesmo sendo mais eficiente do que o processo manual anterior, ainda assim
não consegue acessar todo o conteúdo disponível na Web. Estima-se que a Web oculta
seja até 500 vezes maior do que a Web visível.

Quando um site é indexado, ele pode ser categorizado ou associado por palavras-chaves.
Existem diversos buscadores que disponibilizam Diretórios de Sites, que são páginas com
categorias onde a navegação é feita de acordo com o assunto que interessa ao usuário. Outros
buscadores contabilizam as palavras internas de um site e retornam os sites com maior
número de palavras-chaves iguais à uma palavra digitada por um usuário na sua busca.

Outro tipo de buscador é conhecido como metabuscador, tipo de sistema que faz busca
em outros buscadores, trazendo os resultados mais convenientes de acordo com a
proposta do buscador. Este modelo de buscador, em geral, não possui bancos de dados
próprios.

Organização de Resultados

Quando uma determinada consulta retorna dois ou mais resultados, há uma necessidade
de organização destes dados. Existem diversos modelos em como organizar estes dados,
de acordo com a proposta do buscador em questão. O buscador Google, por exemplo,
contabiliza a quantidade de links externos que apontam para uma determinada página.
Quanto mais páginas externas fazem referência a uma determinada página, melhor é seu
posicionamento nos resultados da busca.

Com a dependência das pessoas para com os buscadores, possuir um bom posicionamento em
um buscador pode ser uma questão de sobrevivência de uma empresa. A grande maioria das
pessoas não passa da segunda página de resultados: isto levou ao surgimento de uma nova
área chamada Search Engine Optimization (SEO), cuja função é estudar e criar ferramentas que
possibilitem que um site melhore seu posicionamento em um mecanismo de busca.

Formas de Recuperação de Dados


Cada buscador oferece opções de busca diferenciadas. Em geral, utiliza-se a busca por palavras
coincidentes com a palavra buscada desejada, ou, para usuários mais avançados, técnicas de
busca booleanas (usando AND ou OR). Como as informações retornadas por um buscador
genérico podem ser amplas demais, existem buscadores específicos agregados em buscadores
genéricos ou de forma independente, para tornar os resultados mais apropriados para a
conveniência do usuário final.

Leia Mais

 Wayback Machine: banco de dados com snapshots de versões passadas de


determinados sites

Knowledge Discovery in Databases e


Datawarehousing

Descoberta em Bases de Conhecimento (ou Knowledge Discovery in Databases – KDD) é um


nome de um conjunto de processos dentro da Inteligência Artificial, cujo objetivo é a
descoberta de conhecimento em uma grande massa de dados. Em geral, na maior parte das
organizações não acadêmicas, o processo de KDD está incluída em um ciclo de processos
maior conhecido como Inteligência do Negócio (Business Intelligence – BI) cujo objetivo é
permitir extrair informações para tomada de decisão nas empresas. Ainda que um processo de
KDD não esteja diretamente associada a um Data Warehouse, na maioria dos casos as duas
técnicas são utilizadas por fornecer um cenário consistente para análise, por isto devemos
entender ambos os conceitos.

DataWarehousing

Data Warehouse ou Repositório de Dados, é definido como uma coleção de dados que
contém todos os dados da organização, orientada a assunto, centralizada, não volátil e
organizada de forma a extrair relatórios e informações gerenciais para apoio à decisão através
de sistemas apropriados. Há uma diferença sutil com o termo Data Warehousing que é
definido como um conjunto de tecnologias e componentes visando a efetiva integração das
bases de dados operacionais em um ambiente que possibilite a produção e uso de informação
estratégica para a tomada de decisão.Nesta estrutura, a primeira parte corresponde ao
conjunto de dados originais provenientes de diversas fontes heterogêneas (bancos de dados
comuns, arquivos e outras fontes de dados). Este componente é chamado de “Dados
Operacionais”, pois estes dados são oriundos de sistemas existentes em níveis operacionais.
São considerados sistemas de níveis operacionais ou Online Transaction Processing (OLTP), os
sistemas que registram os detalhes das transações ocorridas dentro da organização .
O segundo componente da arquitetura, denominado “Processo de Carga”, compreende
um conjunto de procedimentos complexos para extração, limpeza, transformação e
integração dos dados de suas fontes originais para sua posterior inclusão em um formato
apropriado no repositório de dados denominado “Data Warehouse”. Sendo o processo
de maior custo de processamento e tecnologia no processo de Data Warehousing,
muitos procedimentos podem ser simplificados com o uso de ferramentas disponíveis
no mercado destinadas a esta finalidade, as quais são denominadas
ferramentas Extracting, Transforming and Loading (ETL).

O terceiro componente da arquitetura, o “Data Warehouse”, corresponde ao repositório


de dados. Os dados contidos neste repositório são armazenados num modelo
conveniente para produção de informação gerencial. Existem diversos paradigmas de
modelagem de um DW, entre os quais o mais conhecido é o modelo Dimensional. Este
modelo é composto por uma tabela central, denominada “fato”, e um conjunto de
tabelas periféricas (denominadas “dimensões”), as quais são ligadas à tabela fato. Esta
conexão é, em geral, feita através do uso de Junções (joins). Este modelo cria de forma
abstrata um cubo de dados que consiste numa maneira intuitiva de organizar os dados
de forma a permitir desempenho em consultas mais eficientes do que no modelo de
dados relacional .

Um componente relacionado à arquitetura Data Warehousing são as “Ferramentas


OLAP”, que correspondem às técnicas e ferramentas para análise dos dados online e
extração de informação útil ao processo de tomada de decisão. Trata-se da interface que
possibilita o usuário interagir com o DW, visualizando relatórios e análises sofisticadas.
As ferramentas OLAP contêm um conjunto de exibições – entre elas: drill- down, slice-
dice, gráficos e resumos – que viabilizam a realização de análises detalhadas das
informações.

O último componente da arquitetura, denominado “Metadados”, consiste em um amplo


dicionário de dados para auxiliar e documentar o processo de carga, bem como, auxiliar
no processo de extração de informações analíticas. Uma vez que as descrições estão
contidas nos Metadados, estas facilitam e padronizam a elaboração de consultas e
relatórios pelo usuário final .

Processo de KDD

Os processos de KDD variam de acordo com a metodologia utilizada pela organização, mas em
geral é constituída de 7 passos:

 Limpeza dos Dados – remoção de ruídos e inconsistências que alterem de alguma


forma a integridade dos dados;
 Integração dos Dados – os dados de múltiplas fontes heterogêneas são unificados e
padronizados, removendo-se duplicidades, de forma a desenvolver uma base de dados
única (em geral, um DW).
 Seleção dos Dados – são determinados os campos convenientes para a análise
necessária e os dados associados recuperados da base de dados;
 Transformação dos Dados – os dados selecionados são estruturados de forma a
facilitar as operações de mineração;
 Mineração dos Dados – aplicação de algoritmos computacionais sobre os dados
selecionados com o intuito de detectar e extrair padrões e comportamentos entre
estes dados.
 Avaliação de Padrões – análise e verificação dos padrões e comportamentos obtidos
de modo a determinar se estes padrões e comportamentos são consistentes e se
adequam às necessidades organizacionais.
 Representação de Conhecimento – uso de técnicas e interfaces de visualização e de
representação de conhecimento para converter os padrões e comportamentos obtidos
da mineração de dados para o usuário final.

As etapas de 1 a 4 constituem diferentes formas de pré-processamento dos dados, nas


quais os dados são preparados para a etapa de mineração (etapa 5) e posterior análise e
retorno ao usuário (etapas 6 e 7, respectivamente). As etapas 1 a 4 são intimamente
ligadas às etapas de construção de um DW, ainda que a base de mineração não necessite
estar depositada em um DW, é recomendado o seu uso em um processo de KDD. É
importante definir que não existe (ainda) uma ferramenta única que trate todo o
processo de KDD. Em geral, os desenvolvedores utilizam um conjunto de ferramentas
do mercado ou de desenvolvimento próprio para trabalhar cada etapa.

Mineração de Dados

Mineração de Dados (ou em inglês, Data Mining) é o nome dado à exploração e à análise, de
modo automático ou semi-automático, de grandes bases de dados, com o objetivo de
descobrir padrões e regras significativos para tomada de decisão. No modelo anterior, ele
ocupa a etapa 5 de análise.Seu desenvolvimento e uso decorrem do aumento da capacidade e
armazenamento de dados com a popularização dos sistemas informatizados, o que torna
dificultosa, e por vezes inviável, a análise humana consistente de uma grande quantidade de
informações. O processo de MD utiliza diversas técnicas estatísticas e da Inteligência Artificial
(como árvores neurais, tabelas de decisão e outros recursos – o que confere à MD o status de
inteligente), selecionadas e escolhidas de acordo com a conveniência do usuário, organização
e área da aplicação. Em geral, estas técnicas são agrupadas nas seguintes atividades:

 Previsão: estabelecido um determinado item e um modelo específico, pode-se prever


com alguma exatidão o comportamento futuro do item ou de itens semelhantes;
 Regressão: estabelecido um conjunto de itens, verifica-se a dependência entre os
valores de atributos, e determina-se os elementos originais que compõem o conjunto;
 Classificação: estabelecido um conjunto de itens, verifica-se como estes podem ser
particionados em diferentes classes ou categorias pré-estabelecidas;
 Agrupamento: estabelecido um conjunto de itens, determina-se um conjunto de
classes, nos quais os itens são agrupados de acordo com suas características;
 Associação: estabelecido um conjunto de itens, identifica-se os relacionamentos
existentes entre os atributos destes itens.
Dispositivos de Armazenamento

Os dados que constituem um Banco de Dados devem estar armazenados em um meio de


armazenamento que permita a manipulação por um SGBD, de tal forma que este possa
inserir, manipular e consultar os dados conforme a conveniência das diversas aplicações
de software. Projetistas de bancos de dados e DBAs devem conhecer as vantagens e
desvantagens de cada meio de armazenamento: em sistemas que trabalham com bancos
de dados pequenos ou médios ou de pouco acesso, não há necessidade específica de se
entender as especificações técnicas físicas da montagem de um sistema de bancos de
dados, porém com o aumento da complexidade de desempenho e da quantidade de
dados, o processo de projeto físico de bancos de dados envolve muitas escolhas de
técnicas e ferramentas a serem utilizadas.

Meios de Armazenamento e Hierarquia de Memória

Os meios de armazenamento de um dispositivo computacional podem ser organizados


em uma hierarquia formada de duas categorias básicas:

 Armazenamento Primário: em que estão as as mídias que podem ser acessadas


diretamente pela CPU (Unidade Central de Processamento), o que inclui a memória
principal e a memória cachê. As mídias de armazenamento primário são mais rápidas,
mais caras e com menor capacidade de armazenamento do que as mídias de outros
níveis de armazenamento.
 Armazenamento Secundário e Terciário: nestes tipos de armazenamento estão as
mídias que não podem ser acessadas diretamente pela CPU, o que inclui unidades de
disco rígido (secundário) , unidades de mídia removível, discos ópticos e fitas. Estes
níveis de armazenamento são mais baratos, com menor rapidez no acesso aos dados,
mas com maior capacidade de armazenamento.

Em um sistema computacional, os dados são trabalhados ao longo de uma hierarquia de


memória, sendo chamados pela CPU conforme a necessidade. Os dados trabalhados e
processados em uma aplicação devem estar armazenadas nas mídias primárias,
enquanto os dados que não são necessários ao processamento no momento serão
armazenadas nos níveis secundários e terciários.

Os principais meios de armazenamento de dados são:

 Cache: possui mais rápida, mas mais cara. Trata-se de uma RAM estática,
normalmente utilizada pela CPU para agilizar a execução de instruções. Esta memória
é pequena e geralmente o tema de gerenciamento do armazenamento em cache não
é um tema de importância nos estudos de bancos de dados e sim em Arquitetura e
Organização de Computadores.
 Memória Principal: este tipo de memória fornece o espaço para que a CPU possa
manter programas e dados constantes para trabalhar em seu processamento. É
chamada de DRAM (Dynamic RAM), e embora possa conter um grande número de
dados, de uma forma geral é pequena para armazenar um banco de dados inteiro.
Porém, como os programas e dados a serem executados são trabalhados na DRAM, ao
se trabalhar com um sistema de Bancos de Dados, este é carregado, em partes, do
disco rígido para a DRAM para ser trabalhado pela CPU. No entanto, o conteúdo da
memória principal pode ser perdido se ocorrer uma falta de energia ou falha grave de
sistema (volatidade).
 Memória Flash: difere da memória principal pois os dados sobrevivem em caso de
falta de energia (isto é, não é volátil). Possuem alto desempenho, alta densidade e
utilizam a tecnologia EEPROM (Electrally Erasable Programmable Read-Only Memory).
Este tipo de memória possui uma velocidade de acesso rápida, e, nos últimos tempos,
tem se tornado o principal meio de armazenamento de dispositivos domésticos (MP3,
televisores, telefones celulares, etc), além de meio de transporte de dados (Flash USB,
conhecido popularmente como pendrive).
 Disco Magnético: o principal meio para armazenamento de dados por longos
períodos. Normalmente os bancos de dados são armazenados desta forma, sendo
movidos para a memória principal e vice-versa quando há necessidade de sua
utilização. O armazenamento em disco é chamado de memória de acesso direto, já
que é possível ler os dados no disco em qualquer ordem. Os discos podem falhar, mas
estas falhas ocorrem com menos frequencia do que as falhas de sistema.
 Disco ótico: os dados são armazenados oticamente em disco e lidos por laser
(exemplo: CD-ROM, DVD-ROM, etc). Em geral, este tipo de mídia é gravada uma única
vez e nunca mais pode ser apagada. O acesso a este tipo de armazenamento é lento e
impossibilita múltiplas ações de leitura e escrita de um banco de dados, porém
possuem uma duração maior do que discos magnéticos.
 Fitas magnéticas: utiliza fitas com material magnético que é alterado por uma carga
elétrica, permitindo gravar e ler dados. Este tipo de armazenamento é utilizado
principalmente para backups em bancos de dados . O acesso aos dados é mais lento
devido ao fato de que o acesso aos dados deve ser feito de forma sequencial (acesso
sequencial).

Principais Meios de Armazenamento utilizados em Bancos de Dados

Quando trabalhamos com bancos de dados, é importante reconhecer o tipo de


armazenamento em que os dados serão trabalhados. As características de uma mídia de
armazenamento específica define a velocidade de acesso, a capacidade de
armazenamento e a quantidade de dados que podem ser recuperados ou gravados em um
dado momento.
Inicialmente, devemos reconhecer as características de dois tipos principais de
armazenamento trabalhados em bancos de dados: discos magnéticos e fitas magnéticas.

Discos Magnéticos

Os Discos Magnéticos são, atualmente, o principal meio de armazenamento de grande


quantidade de dados. Este tipo de mídia é construída em um formato de disco, com
material magnético e protegido por uma camada de plástico ou acrílico. Os discos
magnéticos podem armazenar informações de um lado (face simples) ou dos dois lados
(face dupla). Diversos discos podem ser conectados em um mesmo eixo, formando um
disk pack, de forma a aumentar a capacidade do armazenamento. A face de um disco é
dividido em um conjunto de círculos (trilhas), e, caso haja mais de um disco, as trilhas
nas mesmas posições nos discos são chamadas de cilindros. Como as trilhas possuem
uma grande quantidade de informações, elas são divididas em blocos ou setores. A
divisão em setores é fixada no disco e não pode ser alterada. A divisão de uma trilha em
blocos de disco (páginas) é definida pelo sistema operacional durante a formatação do
disco.

Para ler e gravar informações em um disco são utilizadas cabeças magnéticas de


Leitura/Gravação, que magnetizam uma área do disco para representar o valor de um bit
(0 ou 1). Estes bits são agrupados em grupos de 4 a 8, constituindo um byte ou um
caracter que são armazenados nos blocos do disco. Um disco magnético é um
dispositivo de acesso direto, de modo que a transferência de dados é feita em unidades
de bloco para a memória principal. Para acessar um determinado bloco, utiliza-se seu
endereço de hardware, que inclui o número do cilindro, número da trilha e número do
bloco.

As medidas de desempenho de qualidade em um disco são a capacidade, o tempo de


acesso, a taxa de transferência de dados e a confiabilidade. O tempo de acesso é o tempo
que o gasto desde que é solicitado um pedido de leitura/escrita até o início de
transferência dos dados. Desta forma, o braço com a cabeça de leitura/gravação
posiciona-se sobre a trilha onde estão os dados e espera que o setor apareça sob a cabeça
de leitura e escrita enquanto o disco gira. O tempo de reposicionamento do braço é o
que conhecemos como tempo de procura (seek time), aumentando de acordo com a
distância que o braço deve se mover. O tempo gasto aguardando que o setor a ser
acessado fique sob a cabeça de leitura e escrita é chamada de tempo de latência
rotacional. O tempo de acesso aos dados é a soma do tempo de procura e do tempo de
latência.

Uma vez que o primeiro setor de dados a ser acessado chegou sob a cabeça de leitura e
escrita a transferência de dados tem início. A taxa na qual os dados são recuperados ou
gravados em disco é chamada de taxa de transferência de dados. A última medida
utilizada com frequência é o tempo médio para ocorrência de falha, que trata da medida
de confiabilidade de disco, onde o tempo médio para a ocorrência de falha de um disco
é, na média, a quantidade de tempo que se pode esperar que o sistema trabalhe sem
falhas.

Fita Magnética

Fitas Magnéticas são dispositivos de acesso sequencial onde os dados são armazenados
em bobinas de fita magnética (semelhantes às antigas fitas K-7 e VHS). Uma cabeça
magnética de leitura/gravação é utilizada para gravar e ler os dados da fita: ao se gravar
na fita, os dados são gravados em blocos de bytes sequencialmente. Porém, quando
queremos buscar uma determinada informação na fita, esta deve ser varrida até que o
bloco solicitado passe pela cabeça de gravação/escrita. Como o processo pode ser muito
lento, em geral, este tipo de armazenamento é utilizado para backup. Isto porque fitas
magnéticas podem armazenar uma grande quantidade de informação (p.ex. a DAT 320
suporta 160GB – e 320 GB no modo comprimido- além disto, há pesquisas que
permitiram criar fitas de até 8 TB), além de possuir alta duração e capacidade de
regravação.
Registros, Arquivos e Organizações de
Arquivos Primárias

Após estudarmos os elementos físicos em que um banco de dados pode ser armazenado,
devemos compreender como os dados são organizados de forma lógica em um dispositivo
computacional. Neste conteúdo é estudado como os bancos de dados são estruturados de
forma lógica e mapeados para os elementos físicos estudados anteriormente.

Registros

A maioria dos SGBDs organizam os dados de um banco de dados na forma de registros


ou estruturas . Por isto que muitos DBAs utilizarão o termo “recuperar registros” ao
efetuar uma busca, por exemplo. Conforme visto em Lógica de Programação, um
registro é uma estrutura lógica com um conjunto de itens (variáveis) com valores
específicos armazenados de forma contínua na memória, de forma a facilitar a busca e
recuperação de dados.
Quando escrevemos um código para criar a estrutura de uma tabela em um SGBD
relacional, os comandos (p.ex. CREATE TABLE, no SQL) são mapeados para um
código na linguagem em que foi criado o SGBD (p.ex. C, Java, etc) que cria o modelo
do registro. Todas as vezes que uma inserção for feita, o modelo do registro é chamado,
os dados inseridos e o registro é gravado em disco.

Como exemplo, se criamos um comando:

1CREATE TABLE cliente (

2codigo INT;

3nome CHAR(60);

4cpf CHAR(11);

);
5

podemos mapear em C um registro com o formato:

1struct cliente {

2int codigo;

3char nome [60];

4char cpf [11];

5};
Arquivos

Uma sequencia de registros forma um arquivo (que também pode ser chamado de tabela
no modelo relacional). As operações em arquivos costumam ser segmentadas em dois
tipos: operações de recuperação e operações de atualização. O primeiro grupo não altera
nenhum dado do arquivo, apenas localiza valores específicos. O segundo grupo muda o
arquivo pela inserção, atualização ou remoção de registros.

Os arquivos são gravados em blocos de disco, que são a unidade de transferência entre o
disco e a memória. Quando o tamanho de um arquivo é maior do que o tamanho de um
bloco, o bloco pode ter diversos registros, mas se um registro for maior do que um
bloco ele poderá ser segmentado em diversos blocos, utilizando ponteiros para ligação
entre os blocos. Na alocação contígua, os arquivos são armazenados a blocos de disco
de forma consecutiva. Na alocação ligada, os arquivos são armazenados nos blocos
disponíveis em disco e interligados através do uso de ponteiros de memória.
Quando são feitas solicitações de gravação e leitura em um banco de dados, o SGBD faz
um pedido que especifica o endereço (número do bloco) no disco a ser encontrado. Ao
ser encontrado, o bloco é então transferido para a memória principal.

Organizações de Arquivos Primárias

Chamamos de organização de arquivo ao modo como os dados são armazenados e


interligados em registros, blocos e estruturas de acesso. Existem diversos métodos para
organização de arquivos primárias, que herdam características dos sistemas de arquivos
dos Sistemas Operacionais . Abaixo uma lista das principais organizações de arquivos
primárias :

 Arquivos de Registros Desordenados (Heap): é o método mais simples, onde os


registros são armazenados nos arquivos na ordem em que são inseridos (pilha). Como
analisado em Estruturas de Dados, a inserção de um novo registro é muito eficiente
neste tipo de estrutura. O último bloco do banco de dados no disco é copiado para um
buffer, o novo registro é acrescentado e depois ele é regravado de volta no disco. No
entanto, a busca e exclusão neste tipo de arquivo é mais trabalhoso, pois demanda
uma pesquisa linear. Para excluir um registro, o programa deve primeiro encontrar o
seu bloco, copiá-lo para o buffer, excluir o registro no buffer, reorganizar o bloco e
regravar o bloco no disco. Isto pode deixar espaços livres no blocos, que após um
grande número de exclusões pode resultar em muito espaço desperdiçado.
 Arquivos de Registros Ordenados: os registros de um arquivo podem ser ordenados
fisicamente, tomando como base os valores de alguns de seus campos. Este tipo de
organização torna a busca mais eficiente, pois ao invés de utilizar a pesquisa linear,
pode utilizar outras técnicas como pesquisa binária. Porém, a inserção e a remoção
podem ser trabalhosos, pois ao inserir um elemento, deve-se organizar todo o arquivo.
Duas opções de solução são geralmente utilizadas : a primeira é manter um espaço em
um bloco para novos registros (mas caso este espaço seja totalmente ocupado, o
problema reaparece); a segunda opção é manter um arquivo temporário desordenado
(chamado de arquivo de overflow ou de transação) . Neste último caso, novos registros
são inseridos no arquivo temporário que é periodicamente ordenado e mesclado com
o arquivo ordenado principal. Porém, este tipo de solução pode ser mais demorado,
pois se um registro no arquivo principal não for encontrado, deve-se pesquisar
também o arquivo não-ordenado.
 Hashing (espalhamento): conforme aprendido em Estruturas de Dados, este tipo de
estrutura utiliza uma tabela de hash criada a partir de uma função chamada de função
de hash. Quando um determinado dado é inserido no banco de dados, é selecionado
um campo, que submetido a esta função irá gerar um valor numérico específico que
irá estabelecer a posição em que o elemento deve ser inserido no vetor de registros.
Isto permite melhorar a busca, pois quando buscamos um dado, este terá o campo
submetido à função de hash e devolverá a provável posição em que está o elemento,
sem a necessidade de fazer pesquisa pelos outros elementos. O problema deste tipo
de técnica é quando a função gera valores iguais para dois ou mais registros (colisão).
Nestes casos, tenta-se resolver através de métodos de resolução, dos quais os
principais são: (1) Endereçamento Aberto: se uma determinada posição está ocupada,
procura-se a próxima vazia em ordem (2) Encadeamento: se uma determinada posição
está ocupada, mantém-se uma lista para aquela posição, ocupando o próximo
elemento da lista (3) Hashing Múltiplo: o programa aplica novas funções de hash se a
principal causar colisão.
 Arquivos de Registros Mistos: até agora consideramos que os registros de arquivos
são do mesmo tipo. No entanto, nas aplicações em geral, um registro pode se
relacionar com outro registro (ex. um registro Funcionário possui um campo que
referencia um registro Departamento). Este campo é chamado de campo de conexão
(que no modelo Relacional é chamado de chave estrangeira). Nestes casos, os SGBDs
geralmente agrupam estes registros de forma contínua ou através de ponteiros. Para
distinguir os diferentes tipos de registros, no caso, cada registro possui um campo
adicional com o seu tipo.

Redundant Array of Independent Drives


(RAID)

Com o crescimento da capacidade dos dispositivos de memória primária, o armazenamento


secundário também teve de aumentar sua capacidade e confiabilidade. Um avanço neste
sentido é a utilização da tecnologia RAID, cujo objetivo é nivelar o desempenho entre os discos
e o desempenho de memórias e processadores, já que estas últimos se desenvolvem de forma
muito mais rápida do que os sistemas de discos.

O conceito de RAID (do inglês Redundant Array of Independent Drives ou Conjunto


Redundante de Discos Independentes) surgiu em 1987, tendo como proposta utilizar um
grande número de discos pequenos e baratos para armazenar dados ao invés de utilizar um
número de discos grandes e mais caros.

Duas técnicas garantem um efetivo desempenho do conceito: em primeiro lugar, a divisão de


dados (data stripping- RAID 0) que permite ler/escrever em dois ou mais discos de forma
paralela, apresentando-se ao Sistema Operacional como se fosse um único disco. Como um
arquivo é dividido entre os discos disponíveis, isto possibilita o aumento da velocidade de
acesso. Por exemplo, em um sistema RAID de dois discos, ao gravarmos um arquivo de 1MB,
ele será gravado, de forma concorrente, 500Kb em cada disco, diminuindo na metade o tempo
de gravação. A segunda técnica que garante a eficiência do RAID é o espelhamento (mirroring-
RAID 1) que permite que um disco copie automaticamente os dados de outro disco.

Arquiteturas de RAID

Implementação Via software


Na implementação via software, o RAID é configurado e gerenciado pelo sistema operacional,
e os discos a serem utilizados são ligados às interfaces da placa-mãe. Não há a necessidade de
utilização de uma controladora RAID, o que torna esta implementação mais barata e flexível,
mas necessitando de configurações adicionais, além de demandar mais recursos de
processamento. A maioria dos sistemas operacionais modernos oferece opções de utilização
de RAID via software (como Linux, Windows 2000 ou superior, entre outros).

 Leia como fazer a configuração de RAID no Windows XP

Implementação Via hardware


Neste tipo de implementação utiliza-se uma controladora de RAID, que é um dispositivo (em
geral, na forma de uma placa adaptadora ou caixa) que permite conectar os discos. Se o RAID é
pequeno, pode ser armazenado no próprio computador que será utilizado. No entanto, em um
sistema maior os discos podem ter um espaço de armazenamento próprio. RAID por hardware
normalmente não é compatível entre os diferentes tipos de fabricantes e modelos.

Fake RAID
A implementação via software geralmente não possui uma facil configuração e a
implementação via hardware as controladoras tem um preço muito elevado. Um Fake RAID
utiliza uma “controladora barata” que ao invés de usar um chip controlador RAID, utiliza uma
combinação de funções especiais na BIOS da placa e drivers instalados no sistema operacional
.

Níveis de RAID
Níveis de RAID são as várias maneiras em que os discos são combinados para um fim. Não
existe um sequenciamento: os números citados correspondem à técnica utilizada no
sistema. Abaixo estão os principais níveis e combinações de RAID.
RAID 0

A técnica RAID O (data stripping) os dados são subdivididos em segmentos consecutivos


(stripes ou faixas), escritos de forma sequencial em cada um dos discos do sistema. Desta
forma o acesso às informações é mais rápido, porém como não possui redundância, a falha em
um disco pode comprometer todo o sistema. RAID-) é recomendado para sistemas que
demandam alta performance, mas não necessitam de uma eficiente segurança dos dados.

RAID 1

RAID 1 implementa o espelhamento de disco (mirroring). O funcionamento deste nível é


simples: todos os dados são gravados em dois discos diferentes; se um disco falhar ou for
removido, os dados preservados no outro disco permitem a continuidade da operação do
sistema.

Com o RAID 1 consegue-se duplicar o desempenho na leitura de informação, pois as operações


de leitura podem ser repartidas pelos dois discos. RAID 1 possui um maior custo em relação ao
RAID-0, porém oferece maior segurança na reparação dos dados e na manutenção do sistema
caso um dos discos venha a falhar.
RAID 10 (ou 1+0)

O RAID 10 exige ao menos 4 discos rígidos. Dois discos serão utilizados como RAID 0,
aumentando o desempenho, enquanto outros dois discos farão a cópia dos dois primeiros. Até
metade dos discos pode falhar simultaneamente, sem colocar o conjunto a perder, desde que
não falhem os dois lados iguais do espelhamento. É o nível utilizado para bancos de dados de
dados, por ser um dos mais tolerantes às falhas e veloz.

RAID 0+1

O RAID 0+1 exige, de forma semelhante ao RAID 10, ao menos 4 discos rígidos. Dois discos
serão utilizados como RAID 0, aumentando o desempenho, enquanto outros dois discos farão
a cópia dos dois primeiros. No entanto, se um dos discos falhar, o sistema se torna RAID 0.
RAID 2 (ECC)

RAID 2 armazena informação ECC (Error Correcting Code), informação para controle de erros
para uso em discos que não possuem detecção de erro de fábrica. O RAID 2 hoje é obsoleto, já
que os discos modernos já possuem de fábrica a detecção de erro no próprio disco.

RAID 3

RAID 3 divide os dados no menor tamanho possível para o stripe (em nível de byte) e utiliza
todos os discos para gravação/leitura. A paridade é gravada em um disco separado. Este nível
de RAID possui difícil montagem via software.
RAID 4

Funciona com, no mínimo, três discos. Um dos discos guarda a paridade (uma forma de soma
de segurança) da informação contida nos discos. Se algum dos discos for danificado, a
paridade pode ser imediatamente utilizada para reconstituir o seu conteúdo. Os discos
restantes, usados para armazenar dados, são configurados para usarem segmentos
suficientemente grandes (tamanho medido em blocos) para acomodar um registro inteiro. Isto
permite leituras independentes da informação armazenada, fazendo do RAID 4 um conjunto
ajustado para ambientes transacionais que requerem muitas leituras pequenas e simultâneas.

RAID 5

O RAID 5 é similar ao RAID 4 e exige também três discos. No entanto, ao invés de gravar a
paridade em um arquivo separado, esta é distribuídas a longo de todos os discos, oferecendo
maior desempenho do que RAID 4, e maior tolerância a falhas.
RAID 6

É um padrão relativamente novo, suportado por apenas algumas controladoras. É semelhante


ao RAID 5, porém usa o dobro de bits de paridade, garantindo a integridade dos dados caso
até 2 dos HDs falhem ao mesmo tempo.

RAID 50

É um arranjo híbrido que usa as técnicas de RAID com paridade em conjunção com a
segmentação de dados.

RAID 100
O RAID 100 basicamente é composto do RAID 10+0. Normalmente ele é implementado
utilizando uma combinação e software e hardware, ou seja, implementa-se o RAID 0 via
software sobre o RAID 10 via Hardware.

Leia Mais

 Guia do Servidor Conectiva Linux – RAID Via Hardware e Via Software

Estruturas para Indexação de Arquivos

Índices são arquivos adicionais em um banco de dados que oferecem caminhos de


acesso alternativos aos dados de forma a facilitar a busca de dados baseado em um
campo escolhido (campo de indexação) sem afetar seu posicionamento físico no disco.
Quando criamos um índice através de um código (como SQL), um determinado campo
escolhido é ajustado em uma estrutura de dados (como árvores), de modo que quando se
efetua uma busca utilizando o índice, a busca é efetuada primeiro no arquivo, e sendo
encontrado o valor, direcionado para os dados relacionados no banco de dados.

A função de um índice ordenado é igual ao índice de um livro, cuja finalidade é facilitar


a busca (binária) de uma determinada informação sem a necessidade da busca
sequencial (linear). Qualquer campo do arquivo pode ser utilizado para criar um índice e
múltiplos índices utilizando diferentes campos podem ser construídos no mesmo
arquivo. Pode existir variedade de índices, em que cada um possui uma estrutura de
dados específica para acelerar a pesquisa. Desta forma, quando criamos índices em um
banco de dados, é criado um arquivo com os campos indexados estruturados. Como a
quantidade de dados de um arquivo de índice é muito menor do que um banco de dados
normal, a busca se torna mais rápida.

Índices Ordenados de Nível Único

Índice Primários

Um índice primário é um arquivo ordenado, de tamanho fixo, onde os registros


armazenados possuem dois campos: o primeiro campo é do mesmo tipo de dado
do campo-chave do arquivo dos dados (já que será o campo que receberá o mesmo valor
do campo-chave) e o segundo é um ponteiro para o endereço de bloco de disco. Existe
uma entrada de índice no arquivo de índice para cada bloco do arquivo de dados. Cada
entrada no índice tem o valor da chave primária para o primeiro registro do bloco
(registro de âncora ou âncora de bloco).

Chamamos de índice denso, o índice que possui uma entrada de índice para cada registro no
arquivo de dados. Um índice esparso, no entanto, tem entradas de índice para somente alguns
valores de pesquisa.
O problema com este tipo de índice é a inclusão e exclusão de registros, que podem modificar
os registros de âncora.

Índices de agrupamento (clustering)

Quando os registros são ordenados fisicamente por um campo que não é a chave (isto é,
que não tem um valor distinto para cada registro) chamamos este campo pelo nome de
campo de agrupamento. Um índice de agrupamento também possui dois campos, sendo
o primeiro campo do mesmo tipo do campo de agrupamento e o segundo campo é um
ponteiro para um bloco de disco. O primeiro campo possuirá um determinado valor e o
segundo campo apontará para todos os dados que possuam o mesmo valor para aquele
campo. Este tipo de índice é esparso, pois possui uma entrada para cada valor distinto
do campo de indexação e não para cada registro no arquivo.

Este tipo de índice possui problemas de inclusão e a exclusão de registros, também causarão
problemas neste método, porque os registros de dados estão fisicamente ordenados,
repetindo-se os mesmos problemas observados para a indexação com índices principais.

Índices secundários
Um índice secundário é outro meio para acessar um arquivo de dados, quando um índice
primário já existe. Um índice secundário pode ser criado em um campo que é chave candidata
ou em um campo não chave com valores duplicados. Um mesmo arquivo pode ter diversos
arquivos secundários. Os registros do arquivo podem ser ordenados, desordenados ou
utilizar hashing.

Índices Multinível
Um Índice Multinível pode ser definido como um índice de índices. No primeiro nível, o
arquivo é ordenado, por exemplo, utilizando um índice qualquer conforme já visto
anteriormente. Nos demais níveis, é criado um índice primário sobre os níveis anteriores e
assim sucessivamente, até que o último índice ocupe apenas um bloco.

Índices Dinâmicos Multinível


Um índice multinível permite que o número de blocos acessados em uma pesquisa possa ser
bem reduzido. Porém este tipo de manipulação possui problemas, pois sendo os arquivos
ordenados, podem haver problemas de inserção e exclusão de dados. Uma solução pode ser
deixar espaços em cada bloco para a inserção de novas entradas tornando o índice dinâmico,
utilizando como estrutura de dados a árvore B e suas variações. A árvore-B é utilizada pode
manter os níveis balanceados para a quantidade de dados que está sendo indexada e gerencia
o espaço usado por seus blocos para que ele sempre esteja ocupado com pelo menos a
metade de sua capacidade.

Índices em múltiplas chaves

Em algumas solicitações de recuperação e atualização de dados, caso uma certa


combinação de atributos seja utilizada de forma muito frequente, é possível utilizar uma
estrutura de acesso que utilize um valor-chave que combine diversos atributos.
Algoritmos para processamento e
otimização de consultas

Uma consulta escrita em uma linguagem de consulta, como SQL, é lida pelo SGBD,
analisada e validada. As técnicas utilizadas são as mesmas que são aprendidas em
Teoria dos Compiladores. Inicialmente são verificados os tokens (símbolos) de
consulta, enquanto o analisador sintático verifica se a consulta está escrita de acordo
com as regras da linguagem. Uma consulta SQL quando escrita e executada, é traduzida
para uma expressão em álgebra relacional estendida, representada por uma árvore de
consulta, que então é otimizada pelo otimizador de consultas. UM SGBD implementa
diversos métodos de acesso para realizar uma consulta, e ao se escrever um código e
executá-lo, o otimizador de consultas estimará o custo de cada método de acesso e
aplicará aquele com o menor custo previsto.

Algoritmos para Seleção

Existem diversos algoritmos para executar um comando SELECT, que é uma operação
de pesquisa para localizar arquivos em disco que atendam a uma determinada condição
proposta.

Os métodos de pesquisa mais simples são aqueles que não possuem uma condição
estabelecida ou possuam apenas uma condição simples. São conhecidos como
varreduras de arquivos porque varrem registros em busca dos registros que cumpram
uma determinada condição.

 Pesquisa Linear: recupera cada registro do arquivo e testado se os valores dos


atributos correspondem a condição dada.
 Pesquisa binária: se o arquivo é ordenado e a condição envolvem a comparação com
um atributo chave, a pesquisa binária pode ser utilizada para agilizar a busca.
 Índice primário ou chave hash para um único registro: se a condição de seleção
envolver a comparação de igualdade com um atributo chave, pode ser utilizado o
índice primário ou uma chave hsh para recuperar os dados. Estes métodos, no
entanto, retornam um único registro.
 Índice primário para diversos registros: se a condição de seleção envolver
comparações de >, <, <= e >= com um campo chave de um índice primário, o índice
pode ser utilizado para encontrar o registro que satisfaz a igualdade e recuperar os
registros seguintes de acordo com a operação.
 Índice de agrupamento: se a condição de seleção envolver comparações de igualdade
com um atributo não chave, um índice de agrupamento pode ser utilizado para
recuperar os registros que atendem a condição.

Os métodos de pesquisa mais complexas, isto é, compostas por várias condições


simples, ligadas por conectivos, podem utilizar outras técnicas de busca. Quando as
ligações entre duas condições simples são feitas através de AND, chamamos de
condição conjuntiva. As seguintes técnicas podem ser utilizadas:

 Seleção conjuntiva utilizando índice individual: se uma condição isolada permitir um


índice que permita utilizar as técnicas anteriores, use a condição para recuperar os
registros e depois verifique se cada registro atende as condições restantes.
 Seleção conjuntiva utilizando índice composto: se dois ou mais atributos formam uma
chave composta, pode-se utilizar um índice diretamente.

Quando as ligações entre as condições são feitas através do conectivo OR, chamamos a
condição de disjuntiva. Este tipo de condição é mais dificil de ser otimizada pois
demanda que cada condição disjuntiva possua atributos indexados (para tentar-se
utilizar as técnicas anteriores), senão a técnica da pesquisa linear será geralmente
utilizada.

Algoritmos de Junção

A junção é uma das operações mais demoradas em uma consulta, pois envolve a junção
de dois ou mais arquivos, o que é mais custoso em termos de busca e memória. Os
principais algoritmos para implementar junção são:

 Junção de loop (ou bloco aninhado): recupera cada registro na tabela A e verifica se
para cada elemento da tabela B a condição da junção é satisfeita.
 Junção de loop único: se existe um índice ou chave hash para um dos atributos da
junção na tabela A, recupere todos os registros da tabela B, e posteriormente utilize o
índice ou chave hash para recuperar os registros que atendem a junção.
 Junção ordenação-intercalação: se as tabelas A e B estão fisicamente ordenados,
pode-se correr os registros simultaneamente e recuperar os dados que atendem a
junção. Se não estiverem ordenados, eles podem ser através de uma ordenação
externa.
 Junção hash: os registros de A e B são separados em arquivos menores utilizando a
mesma função hash (fase de particionamento). Na segunda fase (fase de investigação)
casa-se os registros correspondentes.

Técnicas heurísticas de otimização de consulta

Existem técnicas que permitem modificar a representação interna de uma consulta, de


modo a melhorar o seu desempenho. Um SGBD pode gerar diversas estruturas
diferentes de árvores para uma mesma consulta e as técnicas heurísticas buscam criar
uma reordenação da árvore de modo a obter uma estrutura otimizada. A idéia principal é
que devem ser executadas primeiro as operações que reduzem os resultados
intermediários de uma consulta.

 Inicialmente é importante definir que as operações de seleção e projeção devem ser


aplicadas antes de operação de junção e outras operações binárias.
 Executar as operações de seleção e projeção o mais cedo possível.
 Operações de seleção e junção mais restritivas devem ser realizadas o mais cedo
possível.
Custo de execução de uma consulta

Um otimizador de consultas ao processar uma consulta, também estima os custos


envolvidos para realizar uma determinada busca e escolhe a estratégia com custo mais
baixo. Em geral, esta estimativa é feita baseada na melhor opção média, pois um SGBD
gastaria muito tempo considerando as estratégias se buscasse a melhor opção possível.

Ao considerar os custos, são envolvidos os componentes abaixo. No entanto, é difícil


analisar todos os custos envolvidos em um sistema de SGBD, pelo que, em geral,
valoriza-se o custo de acesso ao armazenamento secundário.

 Custo de acesso ao armazenamento secundário: isto é, o custo de leitura e gravação


entre os discos e a memória principal.
 Custo de armazenamento em disco: isto é, o custo de armazenamento de arquivos
intermediários gerados para uma consulta.
 Custo de computação: isto é, o custo de processamento na CPU.
 Custo de uso de memória: isto é, a quantidade de memória a ser utilizada na execução
de uma consulta.
 Custo de comunicação: isto é, o custo de envio de uma consulta e dos seus resultados
do local onde está armazenado o banco de dados até onde a consulta foi originada.

Bibliografia

ELMASRI, R.; NAVATHE S.B. Sistemas de Bancos de Dados. 6.ed. São Paulo:
Pearson Addison Wesley, 2011.

Teoria do Processamento de Transações

Uma transação é uma unidade lógica de processamento em um banco de dados,


incluindo duas ou mais operações em um banco de dados que devem obrigatoriamente
ocorrer para que toda a unidade tenha suas modificações estabelecidas de forma
permanente. Se uma transação apenas recupera dados é chamada de transação de
somente leitura. Senão, a transação é chamada de transação de leitura-gravação.

É importante estabelecer um controle da execução das transações, pois quando


transações simultâneas ocorrem, diversos problemas podem ocorrer. Assim, diversos
mecanismos e ferramentas são mantidos por um SGBD para garantir que as transações
ocorram de forma eficiente.
ACID

Os métodos de concorrência e controle de um SGBD deve garantir que as transações


sejam adequadas às propriedades ACID:

 Atomicidade: a transação deve ocorrer de forma integral.


 Consistência: se a transação for completada, deve levar o banco de dados de um
estado consistente para outro estado consistente.
 Isolamento: uma transação não deve sofrer interferência de outras transações.
 Durabilidade: as mudanças provocadas por uma transação concluída devem persistir
no banco de dados.

Modelo de estudo para transações

Utilizaremos um conceito simples para estudar o processamento de transações.


Consideraremos um item de dados qualquer elemento de um BD que utilizaremos como
unidade. Este item pode variar de um bloco de disco, passando por um registro, até um
atributo de um registro. Cada item terá um nome específico, e chamamos de BD a um
conjunto de itens nomeados.

As operações básicas de acesso ao BD, neste modelo, são:

 read_item(nome): lê um item do banco de dados com um determinado nome para


uma variável de programa.
 write_item (nome): grava o valor de uma variável de programa no item do banco de
dados com um nome determinado.

Log de Sistema

Para poder recuperar-se de falhas que afetam transações, SGBDs mantém um log para
registrar todas as operações de transações que manipulam os dados e outras informações
que permitem recuperar informações da transação caso ocorra alguma falha. O log é um
arquivo sequencial, apenas de inserção, mantido no disco, independente das falhas de
bancos de dados. Quando transações são executadas, o log armazena:

 [start_transaction, nome] : indica que uma transação "nome" iniciou a execução.


 [write_item, nome, valor_antigo, valor_novo]: indica que a transação "nome"
modificou o valor antigo pelo valor novo.
 [read_item, nome, item]: indica que a transação "nome" leu o valor de "item" no
banco de dados.
 [commit, nome]: indica que a transação "nome" foi concluída com sucesso e seus
efeitos podem ser tornados permanentes no banco.
 [abort, nome]: indica que a transação "nome" foi abortada.

Schedule

Quando duas ou mais transações estão ocorrendo de forma concorrente, deve ser
definida uma ordem de execução. Esta ordenação de operações é conhecida como
schedule.
Dizemos que duas operações estão em conflito se elas pertencem a diferentes
transações, acessam um mesmo item e, pelo menos, uma das operações é write_item.

P.ex.

Transação 1 Transação 2

read_item(X); read_item(X);
read_item(X); write_item(X);
write_item(Y); read_item(X);

Neste caso, a segunda operação da Transação 1 entra em conflito com a operação 2.


Outro tipo de conflito que pode existir é o conflito leitura-gravação:

Transação 1 Transação 2

read_item(X); read_item(X);
write_item(X); read_item(Y);
write_item(Y); read_item(X);

Neste caso, a terceira operação de Transação 2 está lendo um valor de X modificado por
Transação 1, o que pode trazer inúmeros problemas. Um terceiro tipo de conflito é
chamado de conflito gravação-gravação:

Transação 1 Transação 2

read_item(X); read_item(X);
write_item(X); write_item(Y);
write_item(Y); write_item(X);

Neste caso, o último valor de X é gravado pela Transação 1 e posteriormente pela


Transação 2.

Um schedule é considerado completo se as seguintes condições forem estabelecidas:

 As operações são exatamente as mesmas das transações;


 Para operações dentro de uma mesma transação, sua ordem de aparecimento no
schedule deve ser a mesma;
 Para duas operações em conflito, uma das duas precisa ocorrer antes da outra.

No entanto, em um sistema de transações é praticamente impossível encontrar um


schedule completo, pois contínuas transações são executadas no sistema.
Concorrência de Transações

Concorrência de Transações é o nome dado a quando duas ou mais transações ocorrem


de forma paralela. Como transações podem entrar em conflito por manipular um
determinado item de um banco de dados, utilizam-se técnicas que visam evitar este tipo
de conflito.

Técnicas de Bloqueio

Um bloqueio é uma variável associada a um item de dados e que descreve o status do


item para as operações que possam ser realizadas sobre ele. Em geral, existe um
bloqueio para cada item do banco de dados, e o conjunto de bloqueios são sincronizados
para permitir o acesso das transações.

Chamamos de bloqueio binário, uma variável que pode assumir dois valores (bloqueado
ou desbloqueado). Um item bloqueado é chamado de lock(nome). As operações de
bloquear e desbloquear são lock_item(nome) e unlock_item(nome). Uma transação ao
requisitar um acesso a um item, ela solicita lock_item(nome). Se, no entanto,
lock(item)=1, a transação deve esperar e é armazenada em uma fila de espera. Mas se
lock(item)=0, a transação bloqueia o item (lock(item)=1) e a transação pode manipular
o item. Ao terminar sua execução, a transação emite unlock_item(item) e permite que
lock(item) se torne 0 novamente.

Deadlock (impasse)

Deadlock (impasse) em transações ocorre quando uma transação espera pelos recursos
utilizados por outra transação, que por sua vez espera pelo recurso de outra transação.
Um SGBD pode possuir diversas formas de trabalhar com um deadlock.

Se o sistema estiver em deadlock, o sistema (ou o próprio usuário) podem detectar as


transações que causam deadlock e abortá-las, se isto não impactar outras transações
vitais ao sistema. Este método é conhecido como seleção da vítima, e em geral, busca
matar as transações mais novas (que não fizeram muitas mudanças) ao invés das
transações mais antigas (que fizeram muitas mudanças).

Outro mecanismo é o timeout (tempo excedido ou tempo-limite). Se uma transação


esperar por um período maior do que estabelecido em um tempo-limite, o sistema
aborta a transação, quer esteja em deadlock quer não. Isto é feito por pressupor que ao
esperar demais, uma transação provavelmente entrará em deadlock.

Starvation (Inanição)

Starvation ocorre quando uma transação não pode prosseguir enquanto outras são
executadas normalmente. Isto pode ocorrer se o esquema de espera for mal regulado ou
se o método de seleção de vítima matar continuamente a mesma transação, de modo que
esta não seja cumprida de forma completa.

Recuperação de Bancos de Dados

Como um sistema de contínua utilização e que armazena os dados essenciais, um banco


de dados é, em geral, o sistema de maior importância de uma organização. Assim, um
SGBD deve possuir diversos recursos para prevenir de falhas catastróficas e não-
catastróficas. Recuperar de falhas significa que o banco de dados deve retornar ao
estado consistente mais recente antes da falha.Uma falha catastrófica é aquela que causa
corrupção no sistema em que não é possível sua correção por meios normais. Em geral,
para evitar este tipo de falha, o DBA estrutura o banco de dados de forma a não ser
facilmente atingido por qualquer tipo de ação catastrófica, mantém contínuos backups
para restauração do sistema e busca manter servidores em RAID e sistemas paralelos.
Falhas não-catastróficas são, em geral, falhas na execução de transações e operações
que podem interferir na integridade de um banco de dados. Nestes casos, o SGBD
mantém recursos para permitir a recuperação de falhas.

Recuperação de transações não-catastróficas

Existem, primariamente, dois tipos de recuperação de falhas não-catastróficas. Em


primeiro lugar, existem as técnicas de atualização adiada, que não atualizam um banco
até que todas as alterações sejam confirmadas (commit). De forma, que ao ocorrer uma
falha, como os resultados das transações estão armazenados na memória, o banco não
foi ainda alterado, não sendo necessitando de uma reversão das operações da transação
(rollback), e a recuperação consiste em refazer as operações das transações confirmadas
após o último checkpoint do log. A desvantagem desta técnica é que muito espaço de
buffer pode ser necessário para manter os dados antes de gravar em disco. No segundo
tipo de recuperação, existem as técnicas de atualização imediata, em que algumas
operações da transação podem atualizar o banco de dados mesmo sem a transação ter
sido concluída. Estas alterações são gravadas em log e depois armazenadas em disco.
Neste sentido, é necessário reverter as operações confirmadas, utilizando como
acessório, o log de sistema.

Recuperação de falhas catastróficas

As técnicas analisadas anteriormente lidam com falhas não-catastróficas. Considera-se


que o log de sistema não é corrompido e pode ser utilizado para recuperação do banco
de dados. No entanto, um DBA deve também se precaver contra as falhas catastróficas,
como falhas em disco ou corrupção do arquivo de log.

A primeira das técnicas é a execução de backup do banco de dados em que o banco de


dados e seu arquivo de log devem ser periodicamente copiado. Neste sentido, é possível
recuperar o estado mais recente do banco (armazenado em fita) de modo a não perder
toda a estrutura do banco de dados. Para bancos de dados alterados com muita
frequência, outra opção pode ser o backup de log, que ao invés de armazenar o banco de
dados inteiro, armazena apenas o log de alterações. Assim, para recuperar um banco,
utiliza-se o último backup do banco de dados disponível e depois são aplicadas as
alterações do último backup de log.

Como, em geral, as falhas catastróficas não podem ser previstas diretamente, os DBAs
devem estruturar os bancos de dados de forma a minimizar os efeitos de uma possível
falha deste tipo. Em geral, evita-se manter um conjunto de dados específicos em um
único servidor: uma boa política de construção de bancos de dados demanda a utilização
de sistemas como RAID e o uso de servidores em paralelo. As mídias de backups não
devem permanecer no mesmo ambiente dos servidores, devendo, se possível,
permanecer em um local seguro. Algumas organizações mantém servidores com a
mesma configuração para substituição de um servidor que demonstre algum problema:
de preferência, um destes servidores deve estar fora do ambiente da organização e deve
poder ser rapidamente acessado em caso de falha. Os servidores de BD devem
permanecer em locais seguros, de dificil acesso e que forneça proteção contra danos
ambientais e humanos.

Segurança de Bancos de Dados

Como um sistema da informação, um Banco de Dados deve oferecer diversos mecanismos de


segurança. Um Banco de Dados, em geral, armazena as informações essenciais de uma
organização, tanto sobre seu negócio como de sua estrutura. Isto significa que o sistema deve
ser adequadamente manipulado para garantir que não sofra nenhuma espécie de falha ou uso
indevido.

Objetivos de segurança

Os objetivos de segurança são caracterizados em três príncipios:

 Integridade: propriedade que garante que a informação seja protegida contra


modificação indevida.
 Disponibilidade: propriedade que garante que a informação esteja sempre disponível
para o uso legítimo, ou seja, por aqueles usuários autorizados pelo proprietário da
informação.
 Confidencialidade: propriedade que limita o acesso a informação às entidades
autorizadas pelo proprietário da informação.

Desta forma, a segurança de bancos de dados está incluída em uma segurança mais
geral que trata dos recursos computacionais de uma organização. Um programa que
trata da segurança dos dados, assim, deve envolver tanto a tecnologia em si como as
pessoas e processos que a utilizam.
Política de segurança

A criação de uma política de segurança é essencial para garantir a proteção dos recursos
de uma organização, além de permitir uma integração eficiente do uso de diversos
sistemas, de modo a não haver conflitos de uso do sistema. Deve-se existir uma
documentação central que defina o modo como os sistemas computacionais são
implementados e as regras de utilização. Isto impacta diretamente a segurança de um
banco de dados.

Principais tipos de riscos em Bancos de Dados

Os principais tipos de risco são de dois tipos:

 Intencionais: são aqueles em que existe um elemento humano que age de má-fé. Isto
inclui ações de fraude, vandalismo, sabotagem, roubo, etc.
 Não- Intencionais: são aqueles em que não há uma intenção de má-fé:
o Operacionais: são aqueles causados por manipulação inadequada do sistema.
Isto inclui falha de comunicação, erro de transporte, uso inadequado do
sistema, etc.
o Naturais: são aqueles causados por eventos da natureza. Inclui chuva,
terremoto, calor demasiado, etc.
o Ambientais: são aqueles causados por eventos do ambiente. Inclui poluição,
problemas de iluminação, etc.

Sensibilidade dos Dados

Os dados de um banco de dados possuem uma medida de importância atribuída pelo seu
proprietário e que determinam sua necessidade de proteção. Os príncipais níveis são:

 Pública: informação que, se divulgadas, não trazem impacto à organização.


 Interna: informação cujo acesso externo deve ser evitado, onde determinados
funcionários podem ter acesso.
 Confidencial: os valores dos dados não podem ser acessados externamente e o acesso
deve ser autorizado. Caso ocorra acesso não autorizado pode haver perdas financeiras
ou de competividade.
 Secreta: os valores não podem ser acessados externamente ou internamente, exceto
por pessoas que realmente necessitam trabalhar com os valores. O acesso não
autorizado pode ser crítico para a organização.

Controle de acesso em um banco de dados

O DBA é o único profissional que deve possuir a conta de maior acesso em um banco
de dados, devendo, quanto possível, evitar que mesmo diretores de uma organização
possuam este tipo de permissão. Sendo o DBA responsável pela segurança do sistema,
deve ser o responsável por receber as solicitações de permissão de acesso, e baseado em
sua análise, criar e revogar contas, estabelecer privilégios e atribuir o nível de segurança
necessário. A maioria dos usuários comuns não necessitam de uso direto do banco de
dados, pois manipulam este através de uma aplicação comum. No entanto, para os
outros tipos de usuário, é conveniente que o DBA estabeleça logins e senhas que não
possam ser modificados e que as políticas de segurança da organização garantam que
não possa haver compartilhamento de logins e senhas.

Se o DBA pertence à organização, seu usuário e senha devem ser escritos e


armazenados em um local seguro e separado para acesso dos superiores em caso de
ausência do DBA (demissão, morte e etc) para manipulação do sistema, devendo ser
alterado posteriormente. A política de segurança deve ser eficaz para evitar que um
DBA altere este login e senha de forma proposital para prejuízo da organização. Caso o
DBA não pertença à organização, é recomendado que um membro da organização
possua a permissão total, enquanto o DBA externo possua uma permissão menor,
mesmo que possua a maior parte dos direitos necessários para prestar seu serviço.

Um DBA também pode monitorar as ações de um determinado usuário no banco de


dados. Como é necessário que um usuário faça a conexão com o banco de dados, seu
usuário é armazenado no sistema. Podemos expandir o log de sistema para armazenar
não só a modificação executada no banco de dados , mas o número identificador do
usuário e o computador utilizado para fazer a alteração. Havendo suspeita de alteração
indevida no banco de dados, é possível realizar uma auditoria analisando, então, o log
de sistema.

Projeto Físico e ajuste de Bancos de


Dados

Construir o projeto físico de um banco de dados envolve não apenas a criação da


estrutura de funcionamento do sistema, mas também que o sistema garanta bom
desempenho. Um profissional de Bancos de Dados, neste sentido, só pode propor uma
estrutura eficiente (ou modificar uma) se conhece a carga de dados, consultas,
transações e sistemas que manipularão a base de dados. Mesmo quando o banco de
dados é de uso futuro, o profissional deve saber detectar estas informações de modo a
garantir uma estrutura integra e que demande, posteriormente, menor necessidade de
alteração da infraestrutura relacionada.

Análise das consultas e transações no banco de dados

Na fase conceitual e lógica da criação de um banco de dados, o projetista de um BD


deve projetar as principais consultas e transações que utilizarão o banco de dados. Desta
forma, o projetista deve ter em mente:

 As principais tabelas que serão utilizadas nas consultas: o projetista, ao modelar as


tabelas, deve ter em mente quais serão as mais utilizadas, o tamanho estimado delas e
estruturar o banco de dados para atender a demanda neste sentido.
 Os principais atributos que deverão ser utilizados para consultas: o projetista deve
analisar quais os principais atributos a serem utilizados nas condições de consulta, e de
preferência, indexar estes atributos para agilizar o processo de busca.
 Determinar as condições de seleção: isto é, para cada tipo de consulta estimar qual
operação (=, <, >, <=, >=) é a menos custosa e mais eficiente. Em geral, são evitadas
condições que façam pesquisa linear.
 Os atributos a serem trazidos por uma consulta: devem ser analisados os valores
desejados em cada consulta e como otimizar sua recuperação ao usuário.
 As tabelas que podem ser atualizadas: o projetista deve estimar os tipos de usuários,
quais tabelas podem acessar e os tipos de operações que devem realizar e qual o
impacto destas alterações no sistema em geral.

Baseado nisto, o projetista deve estimar:

 A frequência em que as consultas e transações são realizadas;


O tempo em que cada consulta ou transação é efetuada (e se este tempo está de
acordo com possíveis restrições estabelecidas pela organização);
Analisar o tempo em que é executada cada operação de atualização;
Os horários e dias de maior carga de processamento no sistema.

Tarefas (Jobs)

Determinadas ações que podem ser automatizadas, podem ser transformadas em tarefas
(jobs) em um SGBD. Boa parte dos SGBDs permitem a configuração de jobs para
determinados dias e horários, o que permite reduzir a carga de processamento dos
horários de maior fluxo. Outras organizações preferem a criação de sistemas de
software que visam facilitar esta automatização. Sempre que possível, o DBA deve
estruturar as ações automatizadas para serem realizadas nos dias e horários de menor
atividade.

Indexação

Ainda que a indexação seja eficiente para facilitar a busca (especialmente quando se
trabalha com uma condição de igualdade), sua utilização de forma leviana pode trazer
problemas de demora de atualização (já que para cada atualização em um campo, haverá
atualização do arquivo de índice daquele campo). Assim, uma análise criteriosa deve ser
estabelecida para uso de indexação:

 Um atributo que possua valor único e que seja utilizado com frequencia em consultas,
deve ser indexado;
 Múltiplos índices podem ser utilizados em operações que podem ser processadas
apenas utilizando índices, sem acessar a base de dados (p.ex. um comando de
agregação em um campo indexado).

Desnormalização

Ao aprender a fazer um projeto conceitual e lógico, aprendemos a realizar a


normalização (isto é, separar os assuntos em suas respectivas tabelas e não possuir
redundâncias). Em alguns casos, a normalização é evitada para facilitar uma busca mais
eficiente. Assim, se uma tabela possui um atributo que é sempre acessado (enquanto os
outros não) e uma outra tabela que faz a relação possui diversos campos acessados,
pode ser eficiente incluir aquele atributo nesta tabela, evitando a junção.

Ajuste de um Bancos de Dados

Um ajuste em um banco de dados são alterações feitas em sua estrutura de modo a


corrigir ou otimizar uma estrutura anterior já implementada. Em geral, um DBA analisa
as estatísticas de sistema de forma periódica para detectar possíveis falhas e propor
soluções eficientes para sua correção.

Consultas podem ser ajustadas para fazer menor acesso ao disco e permitir maior
agilidade na recuperação dos resultados. Algumas estratégias são:

 Deve-se evitar consultas com múltiplas junções;


 Utilizar tabelas temporárias em consultas que utilizam consultas aninhadas e que
varrem toda uma tabela na subconsulta. A tabela temporária pode armazenar, no
caso, as informações solicitadas, e posteriormente ser excluída após seu uso;
 Alguns SGBDs podem apresentar diferença de processamento na ordem em que as
tabelas são colocadas após o FROM em uma junção. Nestes casos, se possível, coloque
a tabela com menor quantidade de registros em primeiro lugar;
 Evite, sempre que possível, o uso de comparações com strings. Como strings fazem
comparação caracter-a-caracter, o processamento pode ser demorado;
 Em alguns casos uma condição OR não faz uso dos índices. Assim, pode ser mais
eficiente criar dois selects, utilizando índices, unindo-os com UNION.

Os índices devem ser analisados e revisados conforme a conveniência. Algumas


consultas podem estar demorando muito tempo de processamento por falta de
indexação, alguns índices podem não estar sendo utilizados e certos índices podem estar
em um campo com muitas alterações, o que pode trazer demora no processo de
atualização de um registro. Assim, uma contínua análise do uso de índices do sistema
pode trazer correções que beneficiem o sistema de forma geral.

Em alguns casos pode ser necessário o ajuste do projeto de bancos de dados. Isto pode
se processar de diversas formas, dentre as principais: se determinado conjunto de dados
é acessado com frequencia, pode ser útil a criação de uma tabela separada para estes
dados. Se uma tabela possui um atributo que é sempre acessado (enquanto os outros
não) e uma outra tabela que faz a relação possui diversos campos acessados, pode ser
eficiente incluir aquele atributo nesta tabela, evitando a junção (desnormalização). É
importante, no entanto, evitar o máximo possível este tipo de ajuste, por impactar
diretamente nos sistemas que utilizam o banco de dados, podendo trazer perdas se não
for bem projetado.

Bancos de Dados Distribuídos

Banco de dados distribuído (BDD) é uma coleção de dois ou mais sistemas de bancos
de dados, não necessariamente homogêneos, logicamente inter-relacionados e
integrados por uma rede de computadores, caracterizando um sistema distribuído.
Enquanto empresas e organizações com sistemas de pequeno ou médio porte utilizam
apenas um sistema de banco de dados, grandes empresas podem necessitar de sistemas
de BDD para tratar todas as suas complexidades transacionais, reduzindo uma grande
complexidade para partes menores, descentralizadas, mais fáceis de serem gerenciadas.

Não existem soluções claramente nativas para BDDs, sendo que o mais comum é que os
fabricantes de SGBDs comuns direcionem seus produtos para atender as características
de sistemas distribuídos.

Características de um sistema de BDD

Os nós de um BDD devem estar conectados por uma rede de computadores que permite
a transmissão de dados. Esta integração pode ser feita por uma rede local ou uma rede
de longa distância. Neste sentido, a topologia de rede implementada em um sistema de
BDD pode impactar diretamente a performance deste tipo de banco. Os estudos
necessários para isto, no entanto, são reservados para os conteúdos de Redes de
Computadores e Sistemas Distribuídos.

A conexão entre os nós deve permitir que o BDD seja manipulado de forma
padronizada. Isto significa que os nós devem possuir dados relacionados de forma
lógica, mas que não há necessidade dos dados, hardware e software serem homogêneos
(isto é, iguais). Além disto, este tipo de sistema deve ser capaz de prover transparência,
i.e., ocultar os detalhes de implementação ao usuário final, de modo que permita que
este ache que se trate de um único grande sistema.

Replicação e fragmentação dos dados

Em um banco de dados distribuídos, os arquivos podem estar replicados ou


fragmentados, sendo que os dois modelos podem constar de um mesmo sistema de
BDD. Nos arquivos replicados existe uma cópia de cada um dos dados em cada nó,
tornando as bases iguais.A replicação dos dados pode se dar de maneira síncrona ou
assíncrona. No caso de replicação síncrona, cada transação é dada como concluída
quando todos os nós confirmam que a transação local foi bem sucedida. Na replicação
assíncrona, o nó principal executa a transação enviando confirmação ao solicitante e
então encaminha a transação aos demais nós. Na fragmentação, os dados se encontram
divididos ao longo do sistema, ou seja a cada nó existe uma base de dados diferente
localmente, mas os dados são vistos de uma forma única globalmente.

Banco de Dados Orientado a Objetos e


Objeto-Relacional

Um Sistema de Gerenciamento de Bancos de Dados Orientado a Objetos (SGBDOO) é


um sistema de banco de dados em que os dados, ao invés de serem mapeados em tabelas
e relacionamentos (modelo relacional), são modelados em classes e objetos, obedecendo
ao paradigma da Programação Orientada a Objetos (POO). As primeira propostas de
SGBDOO surgiram no início dos anos de 1980, sendo que o primeiro uso do termo
"sistema de bancos de dados orientado a objeto" surgiu em 1985. A idéia essencial
através do desenvolvimento de SGBDOO, é que a orientação a objetos, além de facilitar
a abstração dos elementos do mundo real, permite uma melhor manipulação de sistemas
que utilizam linguagens OO, como Java, C++, C#, Python e afins. Em geral, a
necessidade de criar consultas para o modelo relacional utilizando estas linguagens,
demanda alguma adaptação que além de ser tediosa, pode trazer problemas de
segurança e desempenho.

Classe e Objeto

Classe é o nome que damos à descrição de atributos e comportamentos de um grupo de


objetos com mesmas características (atributos) e ações (métodos). Objeto é o nome
dado à instanciação de uma classe, isto é, valores individuais para uma determinada
classe. Podemos comparar uma classe a um molde de um grupo de objetos, enquanto os
objetos são os modelos específicos gerado à partir do mesmo molde.

Uma classe possui dois tipos de componentes básicos: atributos, que definem
características a serem armazenadas em um objeto, com seus respectivos valores e
métodos, que são as ações que um determinado objeto pode realizar. Estes métodos são
construídos usando procedimentos ou funções conforme as necessidades do
desenvolvedor.

Assim como na POO, um SGBDOO busca implementar os principais conceitos da OO


como o encapsulamento, a herança, a sobrecarga de operações e outros conceitos.

Recursos objeto-relacional

O modelo de dados relacional que possui os recursos de um banco de dados OO, é


conhecido como modelo objeto-relacional.

Bancos de Dados Espaciais


Bancos de Dados Espaciais (também chamados de Bancos de Dados Geográficos) são
sistemas de bancos de dados otimizados para permitir o armazenamento e consulta a
dados associados a objetos espaciais (como pontos, linhas, polígonos e outras figuras
geométricas). Neste tipo de bancos de dados é necessário estabelecer um quadro de
referência (SRE- Sistema de Referência Espacial) para definir a localização e relação
entre os objetos. Os sistemas de referência podem ser de dois tipos: georreferenciados e
não-georreferenciados. A construção de um banco de dados espacial implica em um
profundo processo de abstração para passar a complexidade do mundo real para uma
representação que possa ser trabalhado em um dispositivo computacional.

Veja mais

 Recursos espaciais no SQL Server


Bancos de Dados de Tempo-Real

Sistemas de Bancos de Dados de Tempo- Real (SGBDTR) é o nome dado aos


SGBDs que estão integrados a Sistemas de Tempo-Real (STR). Assim, em um
SGBDTR, as transações devem ser processadas de forma consistente em limites
determinados de tempo (não necessariamente significa que o tempo deve ser rápido).
Enquanto em um SGBD comum, as transações são executadas, independente do tempo
que levam para isto, em SGBDTR o processamento deve ser realizado de forma
consistente (ainda que, em alguns casos, gera dados imprecisos), porém também é
importante que seja realizado em um tempo-limite.

Os principais sistemas utilizam SGBDTR incluem: mercado de ações, contabilidade,


bancos , registros médicos, análise de dados científicos, entre outros. SGBDTR devem
ser utilizados apenas quando é necessário o acompanhamento contínuo de um conjunto
de dados (por exemplo, obtidos de um equipamento que obtém dados de sensores).
Porém, como este tipo de banco de dados é mais flexível sobre a qualidade dos dados e
das transações, pode ser ineficiente para tratar sistemas que necessitam de dados
persistentes.

Aspectos Temporais

Os dados gravados em um SGBDTR deveriam ter valor idêntico ao seucorrespondente


no ambiente. No entanto, SGBDTR podem possuir um atraso na atualização no
SGBDTR, o que pode levar a inconsistências entre os valores. Assim é necessária a
implementação de um mecanismo para verificar a consistência temporal de um
determinado dado em relação ao atraso de sua atualização. Este mecanismo, em geral,
utiliza um rótulo de tempo (timestamp- que indica quando o valor do dado foi gravado)
e de um intervalo de validade absoluta (avi – por quanto tempo o valor do dado é
válido) para cada conjunto de dados a ser gravado no banco de dados. A consistência é
medida assim através da idade de um determinado valor de dado (diferença entre o dado
no ambiente real e o dado gravado no banco) ou através da gravação em um tempo
relativo especificado.

Transações em SGBDTR

As transações em um SGBDTR são classificadas em:

 Transações de escrita: em geral periódicas, obtém os valores do ambiente e


armazenam no banco de dados.
 Transações de atualização: fazem leitura e escrita no banco de dados de forma
periódica ou não.
 Transações de leitura: fazem leitura do banco de dados de forma periódica ou não.

As transações também podem ser classificadas sobre o nível de cumprimento das


restrições temporais que devem cumprir:
 Hard: os limites de tempo devem ser cumpridos de forma exigente. Qualquer
transação que não pode cumprir o limite de tempo deve ser abortada, independente
de sua consequência.
 Firm: a transação não produz nenhum efeito caso caso descumpra os limites de
tempo.
 Soft: a transação pode ser aproveitada mesmo que descumpra os limites de tempo
especificados.

Leia Mais

 Misconceptions About Real-Time Databases (.pdf)


 Modelagem de Banco de Dados em Tempo-Real (.pdf)

Bancos de Dados Embarcados

Um sistema de gerenciamento de banco de dados embarcado é um tipo de SGBD


integrado em um software ou dispositivo computacional. Diferente dos SGBDs comuns,
este tipo de banco de dados é utilizado para armazenar pequena quantidade de
informações necessária para o funcionamento do sistema ao qual está integrado e, em
geral, está oculto do usuário final, requerendo pouca ou nenhuma manutenção. Por este
motivo, SGBDs embarcados não podem ser utilizados por sistemas externos ao
dispositivo ao qual está acoplado e podem não implementar muitas funções e comandos
comuns de SGBDs clássicos. Os bancos de dados embarcados, comumente, também são
sistemas de bancos de dados de Tempo-Real, pois são SGBDs orientados ao
armazenamento de dados específicos do equipamento ao qual estão integrados.

Implementações de SGBD- embarcado

 HSQLDB: SGBD embarcado escrito em Java.


 SQLite: biblioteca em C, aberta que implementa um banco de dados SQL e que é
integrada como parte da aplicação que a manipula. O programa acessa a biblioteca
através da chamada de funções.

Você também pode gostar