Segundo Navathe: Podemos descrever um banco de dados como uma coleção de dados relacionados.
Sendo "dados" certos fatos conhecidos que podem ser registrados e que possuem um significado implícito.
Exemplo: Mostrar imagem com tabela com filmes
Temos uma coleção de dados de filmes, com seus nomes, ano, etc.
Esses dados tem um significado implícito, por exemplo, o filme tal é do ano tal.
Gerenciar um banco de dados manualmente é uma tarefa trabalhosa, é preciso lidar com:
- Inserções de dados (inclusive de dados inválidos);
- Atualizações;
- Remoções;
- Leituras;
- Lidar com acessos e atualizações simultâneas;
- etc;
Para facilitar a tarefa complexa de manter um banco de dados existem os Sistemas de Gerenciamento de Banco de Dados (ou SGBDs);
São exemplos de SGBDs: MySQL, PostgreSQL, MongoDB, Redis, Neo4j;
Existem tipos diferentes de SGBDs, variando em linguagem para consulta, modo de armazenar e representar os dados, etc.
Estudaremos um SGBD relacional, o MySQL.
SGBDs relacionais são os mais difundidos e consolidados no momento, se baseiam no modelo relacional e tem como linguagem de consulta o SQL.
Usam "tabelas" para representar seus dados.
O banco é composto de tabelas e uma tabela define uma estrutura para os dados a serem inseridos.
Mostrar tabela
As tabelas de um banco relacional são compostas de:
- Linhas - cada uma é uma instância do que a tabela representa;
- Colunas - as colunas definem os atributos que as linhas terão;
-
Uma Chave Primária (Primary Key, PK) - que é uma coluna (ou combinação) escolhida para diferenciar uma linha das demais, os valores desta coluna devem ser únicos para cada linha;
-
Chave Estrangeiras (Foreign Key, FK) são colunas utilizadas para implementar relacionamentos entre linhas diferentes, com a FK de uma linha fazendo referência à PK de outra linha.
- Os valores nas colunas são atômicos e monovalorados;
Durante a construção de um banco de dados, podemos usar uma forma mais abstrata para representar a estrutura do mesmo;
Assim, é possível focar em como o banco estará organizado sem se preocupar com detalhes da implementação no SGBD;
Utilizaremos da abordagem entidade-relacionamento que é uma técnica para construir um modelo entidade-relacionamento;
São conceitos importantes para a abordagem entidade-relacionamento:
- Entidade
- Atributo
- Relacionamento
- Cardinalidade
Conjunto de objetos sobre os quais deseja-se manter informações.
Exemplo: entidade filme
-
Notar que uma entidade se refere a um conjunto. Para se referir a um objeto do tipo dessa entidade falamos instância ou ocorrência.
-
Podemos adicionar propriedades às entidades.
É um dado ou informação associado à cada instância de uma entidade.
Exemplo: entidade filme com atributos id, titulo e ano
- Atributos devem ser obrigatórios e monovalorados.
Cada entidade deve possuir ainda um identificador - um conjunto de um ou mais atributos e relacionamentos para distinguir as ocorrências de uma mesma entidade.
Além de atributos, podemos também expressar relacionamentos entre entidades quando estes forem importantes para o banco de dados.
Exemplo: relacionamento atuação (filme e artista)
- Um relacionamento é um conjunto de associações entre instâncias de entidades.
Existem dois tipos de cardinalidade:
Representa o número máximo que uma instância de uma entidade pode ter de um tipo de relacionamento.
-
A cardinalidade máxima 1 indica que uma instância só pode participar daquele relacionamento uma vez.
-
A cardinalidade máxima n indica que uma instância pode participar daquele relacionamento várias vezes.
Exemplo cardinalidade máxima avaliacao n-1 filme
Representa a obrigatoriedade (ou não) de uma instância de uma entidade participar de um relacionamento.
-
A cardinalidade mínima 0 (opcional) indica que é uma instância pode ou não participar daquele relacionamento.
-
A cardinalidade mínima 1 (obrigatória) indica que toda instância da entidade deve participar do relacionamento.
Quando específicamos a mínima e a máxima colocamos a mínima à esquerda. Exemplo com cardinalidade mínima filme(0,n)-(1,n)categoria
- Notar que um mesmo modelo ER pode gerar diferentes modelos relacionais.
Modelos diferentes irão trazer diferentes performances e facilidades (ou dificuldades) na manutenção.
Cada entidade será representada por uma tabela no relacional;
- Atributos irão virar colunas;
- Atributos identificadores serão as chaves.
Há três formas de converter os relacionamentos para o modelo relacional:
- Fusão de tabelas;
- Adição de colunas;
- Tabela própria.
No geral se busca diminuir a necessidade de junções entre tabelas e o número de chaves.
Portanto, quando possível geralmente é preferível fusão de tabelas, seguido de adição de colunas e por último tabela própria.
A escolha de como converter os relacionamentos é dependente das cardinalidades.
Indicada para relacionamentos 1:1, com exceção de quando ambas as cardinalidades mínimas forem 0.
Implementa em uma única tabela ambas as entidades relacionadas com os atributos de ambas além dos pertencentes ao relacionamento.
Vantagens:
- Evita a necessidade de junções;
- Diminui o número de chaves.
Indicada para 1:n ou 1:1 com ambas entidades opcionais.
Consiste em adicionar uma chave estrangeira em uma tabela de cardinalidade 1. Esta FK irá referenciar a outra tabela.
Vantagens:
- Menor número de junções se comparada à alternativa de tabela própria.
Única alternativa possível para relacionamentos n:n.
Pode ser usada independente das cardinalidades.
Vimos anteriormente que a linguagem SQL (Structured Query Language) é a linguagem padrão para o uso em bancos relacionais.
Podemos usá-la tanto para definir a estrutura do nosso banco, como para inserir, atualizar, remover e consultar dados no mesmo.
Chamamos a parte da linguagem para definição do banco de Linguagem de definição de Dados (LDD), enquanto para manipulação em sí temos a Línguagem de Manipulação de Dados.
É importante destacar que apesar de existir um padrão, há variações entre diferentes SGBDs, com isso é necessário fazer algumas alterações no caso de mudança entre SGBDs relacionais.
Como já vimos, para utilizar um banco relacional devemos primeiramente especificar o formato deste (tabelas, tipos de dados e relacionamentos).
Para manipular a estrutura do banco temos os seguinte comandos:
- CREATE;
- ALTER;
- DROP;
O CREATE é usado para criar:
- Um banco de dados:
CREATE DATABASE filmes;
- Uma tabela:
CREATE TABLE `filme` (
`id` bigint NOT NULL AUTO_INCREMENT,
`titulo` varchar(255) NOT NULL,
`sinopse` longtext NOT NULL,
`lancamento` YEAR NOT NULL,
PRIMARY KEY (`id`)
);
Com o ALTER TABLE é possível adicionar, modificar e remover colunas, adicionar chaves e renomear colunas.
ALTER TABLE `filme` MODIFY `lancamento` year NOT NULL;
Podemos remover tanto databases quanto tabelas com o comando DROP:
DROP DATABASE filmes;
DROP TABLE filme;
Com as tabelas criadas e tipos definidos podemos agora manipular os dados em sí.
Para isso temos os comandos:
- INSERT;
- UPDATE;
- DELETE;
- SELECT.
O comando INSERT é usado para inserir um ou mais registros (linhas) na tabela.
INSERT INTO `filme` VALUES
(default,
'Matrix',
'Em um futuro próximo, Thomas Anderson (Keanu Reeves),
um jovem programador de computador que mora em um cubículo escuro,
é atormentado por estranhos pesadelos nos quais encontra-se
conectado por cabos e contra sua vontade, em um imenso sistema
de computadores do futuro.',
1998);
O comando UPDATE é usado para atualizar registros já existentes.
UPDATE `filme` SET `lancamento` = 1999 WHERE `titulo` = 'Matrix';
O comando DELETE serve para remover um ou mais registros numa tabela.
Exemplo DELETE
DELETE FROM `filme` WHERE `id` = 1;
Usamos o comando SELECT para retornar informações do banco.
É possível especificar tanto os registros retornados, como as colunas.
Exemplo SELECT
SELECT * FROM `filme`;
Para retornar as informações da forma desejada podemos:
- Usar "*" para todas as colunas ou escrever os nomes das colunas desejadas separadas por vírgula;
- Renomear colunas com AS;
- Retornar valores distintos com DISTINCT;
- Usar LIMIT para retornar um número máximo de registros;
- Ordenar por quaisquer combinação de colunas com o ORDER BY.
É possível usar vários operadores na clausura WHERE para filtrar registros, por exemplo:
- Operadores lógicos (AND, OR, NOT);
- Operadores Relacionais (=, >, <, >=, <=, !=);
- Operadores IN e BETWEEN, LIKE, IS NULL;
Temos ainda no SELECT as funções de agregação, usadas para sumarizar resultados:
- COUNT, usada para retornar a quantidades, o número de linhas por exemplo;
- MAX e MIN para retornar o valor máximo ou mínimo de uma coluna;
- AVG e SUM retornam a média (average) ou a soma dos valores de uma coluna.
O Operador GROUP BY serve para agrupar linhas com os mesmos valores.
Podemos combina-lo com funções de agregação para por exemplo:
SELECT `lancamento`, COUNT(*) FROM `filme` GROUP BY `lancamento`;
É possível ainda, no comando SELECT combinar as informações de tabelas diferentes:
SELECT f.nome, a.nota, a.descricao FROM filme f join avaliacao a on f.id = a.filme;