Modelo físico de banco de dados: do projeto ao SQL
Entenda como o modelo físico define tabelas, tipos, restrições e índices em um SGBD, com exemplo SQL e critérios para revisar a implementação.

Em poucas palavras
- O modelo físico materializa o projeto em decisões compatíveis com um sistema gerenciador específico.
- Tipos, nulabilidade, chaves e restrições expressam parte das regras que os dados precisam respeitar.
- Índices e escolhas de armazenamento exigem avaliação de consultas reais, sem substituir o significado do modelo.
Neste artigo
O modelo físico de banco de dados especifica como o projeto será implementado em um sistema gerenciador de banco de dados, ou SGBD. Em um banco relacional, isso inclui tabelas, nomes de colunas, tipos, nulabilidade, chaves, restrições e estruturas de acesso. Dependendo do projeto, também abrange particionamento e decisões de armazenamento.
Um desenho com entidades e relacionamentos ajuda a entender o negócio, mas ainda não determina todas essas escolhas. Para implementar, você precisa decidir como cada conceito será representado no gerenciador selecionado. Os exemplos deste guia usam recursos do PostgreSQL e representam um cenário didático, sem pressupor uma aplicação em produção.
Do conceitual ao físico: onde entram as decisões
| Perspectiva | Pergunta central | Exemplo |
|---|---|---|
| Conceitual | Quais objetos e relações importam? | Uma disciplina recebe inscrições de estudantes. |
| Lógica | Como organizar relações, atributos e chaves? | Inscrição contém estudante_id e disciplina_id. |
| Física | Como declarar e executar isso no SGBD? | Tipos específicos, restrições, índices e comandos DDL. |
- Perspectiva
- Conceitual
- Pergunta central
- Quais objetos e relações importam?
- Exemplo
- Uma disciplina recebe inscrições de estudantes.
- Perspectiva
- Lógica
- Pergunta central
- Como organizar relações, atributos e chaves?
- Exemplo
- Inscrição contém estudante_id e disciplina_id.
- Perspectiva
- Física
- Pergunta central
- Como declarar e executar isso no SGBD?
- Exemplo
- Tipos específicos, restrições, índices e comandos DDL.
Essa divisão é uma ferramenta de raciocínio, não uma proibição de revisar etapas anteriores. Ao escolher um tipo ou uma restrição, você pode descobrir que uma regra estava ambígua. Volte ao significado antes de criar uma solução técnica que apenas esconda o problema. O guia de banco de dados relacionais desenvolve essa base.
Escolha tipos pelo significado e pelas operações
A documentação de criação de tabelas do PostgreSQL mostra que a declaração reúne colunas e tipos. Um identificador inteiro, uma data e um texto exigem representações diferentes. Usar texto em todos os campos transfere validações para consultas e aplicações, além de tornar comparações e ordenações mais difíceis de interpretar.
A escolha numérica também importa. A documentação de tipos numéricos diferencia representações exatas e aproximadas. Um valor monetário pode exigir decimal exato, enquanto uma medida física pode admitir ponto flutuante. A precisão adequada decorre do domínio, do intervalo esperado e das operações necessárias.
Pense ainda no que a ausência significa. Uma data de cancelamento pode ficar nula porque a inscrição continua ativa; uma identificação obrigatória não deveria faltar. Documentar essa semântica evita que NULL, zero e texto vazio sejam usados como se expressassem a mesma condição.

Exemplo de implementação física em SQL
No cenário hipotético, cada disciplina possui um código e uma carga horária positiva. Cada estudante possui um identificador, e cada inscrição relaciona um estudante a uma disciplina. A regra escolhida para o exercício permite apenas uma inscrição por par de identificadores. Essa regra seria diferente em um sistema que registra ofertas semestrais.
O identificador distingue a linha. O código também precisa ser único, mas possui outro significado no domínio. A carga horária combina tipo inteiro, obrigatoriedade e verificação positiva. Declarar apenas CHECK não substitui NOT NULL: uma expressão de verificação pode admitir resultado desconhecido quando recebe valor nulo.
As restrições do PostgreSQL permitem expressar essas condições de integridade. As chaves estrangeiras exigem correspondência com registros referenciados; a chave composta impede repetir o mesmo par. Uma alteração na regra do negócio pode exigir revisar essa estrutura, não apenas aumentar o tamanho de um campo.
Gerar um identificador não equivale a garantir unicidade
Em vez de fornecer todos os números manualmente, você pode escolher uma coluna de identidade, como id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY. A documentação de identity columns distingue a geração automática da restrição de unicidade. A chave primária continua sendo uma decisão explícita de integridade.
No modelo físico, registre também o comportamento de exclusões e atualizações de referências. Apagar uma disciplina deve impedir a operação quando há inscrições, apagar inscrições associadas ou preservar um histórico por outra estratégia? Nenhuma dessas respostas é universal. A política precisa corresponder ao ciclo de vida dos dados.
Índices devem responder às consultas esperadas
A introdução a índices do PostgreSQL explica seu papel no acesso aos dados. Um índice pode reduzir o trabalho de localizar linhas, mas ocupa espaço e precisa ser mantido quando os dados mudam. Criar índices indiscriminadamente não é uma estratégia de desempenho.
No exemplo, a chave composta começa por estudante_id. Se uma consulta frequente busca inscrições por disciplina_id, vale avaliar um índice nessa coluna: CREATE INDEX inscricao_disciplina_idx ON inscricao (disciplina_id);. A pertinência depende do volume, da distribuição dos valores e das consultas reais. A chave estrangeira não cria automaticamente esse índice na tabela que referencia.
O comando EXPLAIN permite examinar o plano escolhido pelo PostgreSQL. Compare cenários com dados representativos e estatísticas adequadas. Uma tabela minúscula pode ser lida sequencialmente mesmo quando existe índice; isso não demonstra, por si só, um defeito no projeto.
Como revisar o modelo antes de implementar
Crie dados pequenos que deveriam ser aceitos e outros que deveriam ser rejeitados: código repetido, carga horária negativa, inscrição sem estudante e par duplicado. Confira se as falhas correspondem às regras documentadas. Depois experimente as consultas que a aplicação precisa responder, definindo o significado de cada linha do resultado.
Mantenha alterações de esquema em migrações versionadas e registre suas razões. Para continuar o estudo, relacione a modelagem às estruturas de dados: organização e acesso influenciam custos, mas a implementação precisa primeiro preservar o significado. Um bom modelo físico torna as decisões verificáveis e suas limitações explícitas.
Referências
- PostgreSQL — Creating a New Table https://www.postgresql.org/docs/current/tutorial-table.html
- PostgreSQL — Numeric Types https://www.postgresql.org/docs/current/datatype-numeric.html
- PostgreSQL — Constraints https://www.postgresql.org/docs/current/ddl-constraints.html
- PostgreSQL — Identity Columns https://www.postgresql.org/docs/current/ddl-identity-columns.html
- PostgreSQL — Introduction to Indexes https://www.postgresql.org/docs/current/indexes-intro.html
- PostgreSQL — Using EXPLAIN https://www.postgresql.org/docs/current/using-explain.html
Autoria
Study Mais
Continue estudando

Banco de dados em SQL: consultas com exemplos resolvidos
Aprenda SQL com um pequeno banco acadêmico: crie tabelas, insira dados e confira filtros, junções, contagens e médias com resultados explicados.

Algoritmo de Euclides: MDC e divisões passo a passo
Calcule o MDC com o algoritmo de Euclides, acompanhe divisões sucessivas e entenda a prova, os casos com zero e a aplicação em frações e Bézout.

Pensamento computacional: pilares e exemplo aplicado
Entenda pensamento computacional com uma escala de monitoria: decomposição, padrões, abstração, algoritmos, testes e limites das decisões automatizadas.
