Beruflich Dokumente
Kultur Dokumente
Conceitos Iniciais
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.
Oracle
SQL Server
MySQL
PostgreSQL
Usuários de SGBDs
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.
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
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.
Modelagem Lógica
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.
O tipo de um campo limita os tipos de dados que podem ser inseridos neste campo. Os
principais tipos são:
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:
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.
utilizando o MySQL
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
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:
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:
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
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 :
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).
Caso um campo deva ser inserido antes ou depois de um determinado campo de nossa
tabela, utilizamos a seguinte sintaxe:
Se, por exemplo, queremos colocar um campo chamado Idade na primeira posição,
podemos usar o comando:
Também poderíamos fazer um comando que “coloque o campo Idade depois do campo
CPF que seria escrito na forma:
Exclusão de Tabela
Podemos excluir uma tabela qualquer dentro de um banco de dados. A sintaxe para esta
operação é:
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.
Inserção de Dados
Este comando permite inserir dados em um banco de dados, e sua sintaxe é :
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:
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.
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:
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.
Alterando Dados
Este comando permite alterar os dados já existentes em um banco de dados. Sua sintaxe é:
1UPDATE Nome_Tabela
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
Mas se queremos mudar para “Mário” apenas os Clientes com o nome de Pedro, o comando é:
1UPDATE Clientes
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:
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
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:
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
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:
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.
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.
11111111111 João
22222222222 Maria
33333333333 Pedro
44444444444 Mateus
1SELECT *
2FROM Clientes;#
1SELECT Nome
2FROM Clientes ;#
Se queremos trazer apenas o Nome do Cliente que possui o CPF 44444444444, utilizamos o
comando
1SELECT Nome
2FROM Clientes
Ordenação
2FROM Nome_Tabela
3[WHERE condição]
Imagine que queremos trazer todos os dados dos nossos Clientes, mas ordenados por ordem
alfabética de Nome. Neste caso, utilizamos:
1SELECT *
2FROM Clientes
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 é:
2FROM Nome_Tabela
3[WHERE condição]
1 Caneta 0.50
2 Lápis 0.25
3 Borracha 1.00
4 Caderno 5.00
Sum
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
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
1SELECT AVG(Nome_Campo)
2FROM Nome_tabela;#
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
1SELECT COUNT(Nome_Campo)
2FROM Nome_tabela;#
1SELECT COUNT(Valor_do_Produto)
2FROM Produtos ;#
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;#
1SELECT MAX(Valor_do_Produto)
2FROM Produtos ;#
Min
A função Min retorna o menor valor encontrado entre os dados de um campo dado. Sua
sintaxe é:
2FROM Nome_tabela;#
1SELECT MAX(Valor_do_Produto)
2FROM Produtos ;#
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 ;#
2FROM Nome_tabela
3[WHERE Condições ]
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.
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.
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
3WHERE Pacientes.Cod_Doenca=Doencas.Cod_Doenca;#
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
3WHERE PAC.Cod_Doenca=DOE.Cod_Doenca;#
Podemos acrescentar, no WHERE, condições que nos sejam convenientes. Por exemplo,
1SELECT PAC.Nome,DOE.Nome
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.
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:
Nome Nome
Bruno Pneumonia
José Gripe
Maria Gripe
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,
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.
3[WHERE condições];#
4 ;#
Nome Nome
Bruno Gripe
José Gripe
Maria Pneumonia
NULL Anemia
NULL Bulimia
3[WHERE condições];#
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:
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');
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
Agora queremos trazer os Clientes cujo primeiro nome seja Luana, mas independente do
sobrenome.
1SELECT Nome
2FROM Clientes
Agora queremos trazer os Clientes em que o primeiro nome pode ser qualquer um, mas o
último nome seja Luana.
1SELECT Nome
2FROM Clientes
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
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
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
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
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:
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
Tratamento de Strings
MySQL possui diversos comandos para tratar strings. As principais são:
1SELECT UCASE(Nome_Paciente)
2FROM Consultas
1SELECT LCASE(Nome_Paciente)
2FROM Consultas
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.
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.
Ao clicar em ENTER, a VIEW será guardada no SGBD. Para chamar a visão quando
necessitarmos, iremos fazer:
Procedimentos e Funções
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.
2BEGIN
3 --Corpo da Rotina
4END;
2BEGIN
3 --Corpo da Rotina
5END;
Parâmetro é o nome dado aos valores que passamos para o procedimento ou função
executar e realizar uma ação.
Como exemplo do uso do procedimento básico, vamos fazer um código que exiba Olá Mundo
ao usuário:
2BEGIN
3 SELECT 'Olá Mundo';
4END;
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
6 ELSE
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
5 SET media=(n1+n2)/2;
6 RETURN media;
END
7
; //
8
Um exemplo básico para uso da função é o comando:
2 --Código Modificado
Por exemplo:
Uma boa recomendação é sempre utilizar este comando antes de criar uma função ou
procedimento para que não haja conflito. Um exemplo:
3BEGIN
5END;
Comandos de Programação
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
11 END IF;
DELIMITER //
1
CREATE PROCEDURE TesteEnquanto()
2
BEGIN
3
DECLARE valor INT;
4
SET valor=0;
5
WHILE valor < 10 DO
6 SELECT 'Olá Mundo' AS Msg;
7 SET valor = valor + 1;
8 END WHILE;
END //DELIMITER;
9
10
1
DELIMITER //
2
CREATE PROCEDURE ExemploCase(opcao INT)
3
BEGIN
4 CASE opcao
8 ELSE
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 é :
END;
1
DELIMITER //
2
CREATE TRIGGER teste BEFORE INSERT
3 ON Cliente FOR EACH ROW
4 BEGIN
5 SET @nome=NEW.NomeCliente;
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.
3BEGIN
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
7END IF;
END;
8
// DELIMITER;
9
Transações
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.
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:
set autocommit=0;
1START TRANSACTION;
2--Comandos
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:
Í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.
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:
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:
UNIQUE (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,
UNIQUE (cpf),
7
INDEX mae (nome_mae(10)));
8
É 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
2ON item
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
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:
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
gunzip arquivo.sql.gz
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
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:
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.
2<curriculos>
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:
7
<dadosprofissionais>
8 <cargo> Analista de Sistemas</cargo>
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>
7 <dadospessoais>
9 <dadosprofissionais>
1
<?xml version="1.0" encoding="ISO-8859-1"?>
2 <curriculos>
3 <curriculo tipo="TI">
4 <dadospessoais>
16 <dadospessoais>
17 <dadosprofissionais>
18 <cargo> Assistente</cargo>
23
2 <curriculos>
7 <dadospessoais>
8 <dadosprofissionais>
11 </dadosprofissionais>
</curriculo>
12
<curriculo tipo="Financeiro"> <!--Este é o currículo de um
13profissional financeiro-->
14 <dadospessoais>
<dadospessoais>
17
<dadosprofissionais>
18
<cargo> Assistente</cargo>
19
<tempoexperiencia> 2 anos </tempoexperiencia>
20
</dadosprofissionais>
21
</curriculo>
22</curriculos>
23
Buscadores Web
Neste sentido foram desenvolvidos os search engines (mecanismos de busca) que são
programas cuja função é:
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.
Leia Mais
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).
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:
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:
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).
Discos Magnéticos
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
2codigo INT;
3nome CHAR(60);
4cpf CHAR(11);
);
5
1struct cliente {
2int codigo;
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.
Arquiteturas de RAID
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
RAID 1
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
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
Índice Primários
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.
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.
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.
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.
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.
Bibliografia
ELMASRI, R.; NAVATHE S.B. Sistemas de Bancos de Dados. 6.ed. São Paulo:
Pearson Addison Wesley, 2011.
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:
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);
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);
Técnicas de Bloqueio
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.
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.
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.
Objetivos de segurança
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.
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.
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:
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.
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
Consultas podem ser ajustadas para fazer menor acesso ao disco e permitir maior
agilidade na recuperação dos resultados. Algumas estratégias são:
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.
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.
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.
Classe e Objeto
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.
Recursos objeto-relacional
Veja mais
Aspectos Temporais
Transações em SGBDTR
Leia Mais