Modelando um blog: usuários, publicações e comentários
Desenhe um diagrama ER, identifique entidades e relacionamentos e traduza-os para um esquema SQL normalizado.
Modelando um blog: usuários, publicações e comentários é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
O domínio
Um blog simples: usuários escrevem publicações e outros usuários comentam essas publicações. Vamos transformar isso em um esquema.
Entidades
Três substantivos centrais:
- Usuário — identificador, e-mail, nome
- Publicação — identificador, autor, título, corpo, data e hora de publicação
- Comentário — identificador, autor, publicação à qual pertence, corpo
Relacionamentos
Cardinalidades:
- Usuário 1 ── ∞ Publicação (um usuário escreve muitas publicações)
- Usuário 1 ── ∞ Comentário
- Publicação 1 ── ∞ Comentário
Tabela de usuários
Comece pelos usuários — as outras tabelas farão referência a ela:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
full_name VARCHAR(100) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);Tabela de publicações
FK para usuários:
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
author_id BIGINT NOT NULL REFERENCES users(id) ON DELETE RESTRICT,
title VARCHAR(200) NOT NULL,
body TEXT NOT NULL,
published_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);Tabela de comentários
Duas chaves estrangeiras:
CREATE TABLE comments (
id BIGSERIAL PRIMARY KEY,
post_id BIGINT NOT NULL REFERENCES posts(id) ON DELETE CASCADE,
author_id BIGINT NOT NULL REFERENCES users(id) ON DELETE RESTRICT,
body TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);Por que usar ON DELETE CASCADE nos comentários?
Se uma publicação for excluída, seus comentários deixam de fazer sentido — deixe o banco de dados limpá-los automaticamente.
Por que usar ON DELETE RESTRICT no autor?
Não exclua conteúdo silenciosamente quando um usuário desaparecer. Force a aplicação a excluir logicamente o usuário ou reatribuir o conteúdo antes.
Expandindo para etiquetas (muitos para muitos)
Adicione etiquetas por meio de uma tabela de junção:
CREATE TABLE tags (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);
CREATE TABLE post_tags (
post_id BIGINT REFERENCES posts(id) ON DELETE CASCADE,
tag_id BIGINT REFERENCES tags(id) ON DELETE CASCADE,
PRIMARY KEY (post_id, tag_id)
);Comentários encadeados
Comentários com autorreferência para respostas:
ALTER TABLE comments
ADD COLUMN parent_id BIGINT REFERENCES comments(id) ON DELETE CASCADE;Exclusão lógica versus exclusão física
Para um blog, excluir publicações logicamente costuma ser mais adequado — links quebrados não deixam de funcionar no histórico do usuário. Adicione deleted_at TIMESTAMPTZ e filtre por WHERE deleted_at IS NULL em todas as consultas.
Diagrama ER em palavras
users (1) -< (∞) posts (1) -< (∞) comments
Além disso: users (1) -< (∞) comments, posts (∞) >-< (∞) tags.
Resumo
Projetar um esquema começa pelas entidades, pelos relacionamentos e pelas cardinalidades.
- PK substituta em todas as tabelas
- Chaves estrangeiras declaram os relacionamentos
- CASCADE versus RESTRICT corresponde à intenção do negócio
- Muitos para muitos = tabela de junção
Verificação rápida
Onde fica a chave estrangeira em um relacionamento de um para muitos entre publicações e comentários?
Perguntas Frequentes
A aula “Modelando um blog: usuários, publicações e comentários” é grátis?
Sim — o texto completo de “Modelando um blog: usuários, publicações e comentários” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Modelando um blog: usuários, publicações e comentários”?
Desenhe um diagrama ER, identifique entidades e relacionamentos e traduza-os para um esquema SQL normalizado. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Modelando um blog: usuários, publicações e comentários”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Modelando um blog: usuários, publicações e comentários
- Escolhendo chaves e tipos
- Índices para consultas comuns
- Populando o banco de dados com dados de teste