🏗️ Arquitetura de Banco de Dados

Indo além do "Select" e entendendo o motor do SGBD

🧱 Os 3 Níveis de Abstração (ANSI/SPARC)

A arquitetura moderna separa os dados em três camadas para garantir que mudanças em uma não quebrem a outra.

  1. Nível Externo (Visão): O que o usuário/aplicação vê (tabelas filtradas, views).
  2. Nível Conceitual (Lógico): A estrutura completa (todas as tabelas e relações).
  3. Nível Interno (Físico): Como os bits são gravados no SSD/HD.

💡 Analogia: O Restaurante

Para facilitar o entendimento dos níveis:

  • Externo (Menu): O cliente vê apenas os pratos disponíveis (Views).
  • Conceitual (Receita): O Chef conhece todos os ingredientes e como se misturam (Tabelas/Relacionamentos).
  • Interno (Despensa): Como os ingredientes estão organizados nas prateleiras e geladeiras (Arquivos/Índices).

🔄 Independência de Dados

Por que separar em níveis?

🔹 Independência Física

Você pode trocar o HD por um SSD ou mudar o formato de compressão dos arquivos sem precisar alterar o código SQL da sua aplicação.

🔹 Independência Lógica

Você pode adicionar uma nova coluna "Telefone" na tabela Cliente sem quebrar as telas que listam apenas o "Nome".

📑 Esquema vs. Instância

Muitos alunos confundem esses conceitos fundamentais:

Conceito Definição Exemplo
Esquema A "Planta Baixa". É o projeto, a definição das tabelas e tipos. CREATE TABLE...
Instância A "Foto" do momento. São os dados reais gravados agora. INSERT INTO...

Dica do Prof: O Esquema raramente muda. A Instância muda a cada segundo.

🧠 Gerenciamento de Memória (Buffer Pool)

O SGBD não lê o disco o tempo todo (disco é lento!).

  • Ele reserva uma área da RAM chamada Buffer Pool.
  • Páginas de Dados: O banco traz blocos do disco para a RAM.
  • Se o dado já está na RAM (Buffer Hit), a resposta é instantânea!

🚦 Controle de Concorrência (MVCC)

O que acontece quando 1000 pessoas tentam comprar o último ingresso ao mesmo tempo?

  • MVCC (Multi-Version Concurrency Control):
    • O banco cria "versões" do dado.
    • Escritas não bloqueiam leituras.
    • Garante que o banco não trave em sistemas de alto tráfego (como o PostgreSQL e o InnoDB do MySQL fazem).

🛡️ Propriedades ACID (O Guardião dos Dados)

Todo SGBD robusto garante:

  1. Atomicidade: Ou faz tudo, ou não faz nada.
  2. Consistência: O banco vai de um estado válido a outro.
  3. Isolamento: Uma transação não atrapalha a outra.
  4. Durabilidade: Uma vez gravado, o dado não se perde (mesmo se cair a luz).

🐬 MySQL vs 🐘 PostgreSQL

MySQL (Foco em Velocidade/Web)

  • Arquitetura de Plugging Storage Engines (você escolhe o motor, ex: InnoDB).
  • Simples e extremamente popular em aplicações PHP/Node.

PostgreSQL (Foco em Robustez/Extensibilidade)

  • Arquitetura baseada em Processos.
  • Suporta tipos de dados complexos (JSONB, Geográfico) nativamente.

📖 Glossário de Bolso

  • SGBD: O software mestre (MySQL, Postgres, Oracle).
  • Metadata: Dados que descrevem outros dados (ex: o nome da coluna).
  • WAL (Write-Ahead Log): O "diário de bordo" onde o banco anota tudo antes de salvar definitivamente.
  • Query Optimizer: O "GPS" do banco que escolhe o caminho mais rápido para buscar seu dado.

🧪 Atividade Prática

  1. Criação: Criar uma tabela Produtos.
  2. Abstração: Criar uma VIEW que mostre apenas produtos em estoque.
  3. Simulação: Tentar deletar um produto que está vinculado a uma venda (teste de Consistência).
  4. Discussão: Se mudarmos o nome da tabela física, a View continua funcionando? Por quê?

🚀 Conclusão

Entender a arquitetura transforma você de um "digitador de SQL" em um Arquiteto de Soluções.

  • Dados organizados = Performance.
  • Independência de dados = Manutenção fácil.
  • ACID = Segurança para o negócio.

Próxima aula: Modelagem Entidade-Relacionamento (MER)!

🛠️ Prática: O Esquema da Escola

Passo 1: Nível Conceitual (Estrutura)

Vamos criar as tabelas que definem nossa regra de negócio.

CREATE TABLE aluno (
    id_aluno INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(100) NOT NULL,
    nascimento DATE
);

CREATE TABLE materia (
    id_materia INT PRIMARY KEY AUTO_INCREMENT,
    nome_materia VARCHAR(50) NOT NULL
);

CREATE TABLE matricula (
    id_matricula INT PRIMARY KEY AUTO_INCREMENT,
    id_aluno INT,
    id_materia INT,
    FOREIGN KEY (id_aluno) REFERENCES aluno(id_aluno),
    FOREIGN KEY (id_materia) REFERENCES materia(id_materia)
);

📥 Prática: A Instância (Dados)

Passo 2: Alimentando o Banco

Diferente do esquema (fixo), a instância muda conforme inserimos dados.

-- Inserindo os "Moradores" da nossa estrutura
INSERT INTO aluno (nome, nascimento) VALUES ('Ana Silva', '2005-05-15');
INSERT INTO materia (nome_materia) VALUES ('Banco de Dados');

-- O Processo: Vinculando Aluno à Matéria
INSERT INTO matricula (id_aluno, id_materia) VALUES (1, 1);

👁️ Prática: Nível Externo (View)

Passo 3: Criando a Visão do Usuário

A VIEW simplifica a complexidade dos JOINs para o usuário final.

CREATE VIEW vw_lista_presenca AS
SELECT 
    a.nome AS nome_aluno,
    m.nome_materia
FROM matricula mt
JOIN aluno a ON mt.id_aluno = a.id_aluno
JOIN materia m ON mt.id_materia = m.id_materia;

-- Para o usuário, basta um comando simples:
SELECT * FROM vw_lista_presenca;

🧪 Desafio de Arquitetura: Independência

Teste 1: Independência Lógica

Se alterarmos o nome da coluna nascimento para dt_nasc, a VIEW acima para de funcionar? Como corrigir sem afetar o usuário final?

Teste 2: Consistência (ACID)

Tente deletar um aluno que já possui matrícula:
DELETE FROM aluno WHERE id_aluno = 1;
O que o SGBD impede e por quê?

Material de apoio