Skip to content

Diagrama Relacional do Banco de Dados - Plataforma de Cursos

← Back to Main Page

Legenda

  • (PK) = Primary Key
  • (FK) = Foreign Key
  • (UK) = Unique Key
  • deleted_at = Soft delete (data de exclusão lógica)
  • version = Número da versão do registro (auditoria/histórico)
  • created_at / updated_at = Datas de criação e modificação
  • _history = Sufixo para tabelas de histórico de alteração

Entidades Principais

users

Campo Tipo Restrições Descrição
id UUID PK Identificador do usuário
name VARCHAR(255) NOT NULL Nome
email VARCHAR(255) NOT NULL, UK E-mail
password_hash VARCHAR(255) NOT NULL Senha (hash)
role VARCHAR(32) NOT NULL Enum: 'admin', 'creator', 'student'
status VARCHAR(32) NOT NULL Enum: 'active', 'pending', 'rejected', 'inactive'
avatar_url VARCHAR(255) URL da imagem de perfil
deleted_at TIMESTAMP Soft delete
created_at TIMESTAMP DEFAULT now()
updated_at TIMESTAMP DEFAULT now()
version INT DEFAULT 1 Controle de versão

Histórico: users_history (espelha a estrutura, incluindo quem alterou)


roles

Campo Tipo Restrições Descrição
id UUID PK Identificador do papel
name VARCHAR(32) UK Nome do papel
description TEXT Descrição
deleted_at TIMESTAMP Soft delete
created_at TIMESTAMP DEFAULT now()
updated_at TIMESTAMP DEFAULT now()
version INT DEFAULT 1 Controle de versão

Histórico: roles_history


permissions

Campo Tipo Restrições Descrição
id UUID PK Identificador da permissão
name VARCHAR(64) UK Nome da permissão
description TEXT Descrição
deleted_at TIMESTAMP Soft delete
created_at TIMESTAMP DEFAULT now()
updated_at TIMESTAMP DEFAULT now()
version INT DEFAULT 1 Controle de versão

Histórico: permissions_history


roles_permissions

Campo Tipo Restrições Descrição
role_id UUID PK, FK -> roles(id) Papel
permission_id UUID PK, FK -> permissions(id) Permissão
deleted_at TIMESTAMP Soft delete
created_at TIMESTAMP DEFAULT now()
version INT DEFAULT 1 Controle de versão

Histórico: roles_permissions_history


courses

Campo Tipo Restrições Descrição
id UUID PK Identificador do curso
title VARCHAR(255) NOT NULL Título
description TEXT Descrição
creator_id UUID FK -> users(id) Criador do curso
status VARCHAR(32) NOT NULL Enum: 'active', 'inactive', 'deleted'
deleted_at TIMESTAMP Soft delete
created_at TIMESTAMP DEFAULT now()
updated_at TIMESTAMP DEFAULT now()
version INT DEFAULT 1 Controle de versão

Histórico: courses_history


modules

Campo Tipo Restrições Descrição
id UUID PK Identificador do módulo
course_id UUID FK -> courses(id) Curso
title VARCHAR(255) NOT NULL Título
description TEXT Descrição
order INT Ordem do módulo
deleted_at TIMESTAMP Soft delete
created_at TIMESTAMP DEFAULT now()
updated_at TIMESTAMP DEFAULT now()
version INT DEFAULT 1 Controle de versão

Histórico: modules_history


lessons

Campo Tipo Restrições Descrição
id UUID PK Identificador da aula
module_id UUID FK -> modules(id) Módulo
title VARCHAR(255) NOT NULL Título
content TEXT Conteúdo
order INT Ordem da aula
deleted_at TIMESTAMP Soft delete
created_at TIMESTAMP DEFAULT now()
updated_at TIMESTAMP DEFAULT now()
version INT DEFAULT 1 Controle de versão

Histórico: lessons_history


exercises

Campo Tipo Restrições Descrição
id UUID PK Identificador do exercício
lesson_id UUID FK -> lessons(id) Aula
title VARCHAR(255) NOT NULL Título
description TEXT Descrição
order INT Ordem
deleted_at TIMESTAMP Soft delete
created_at TIMESTAMP DEFAULT now()
updated_at TIMESTAMP DEFAULT now()
version INT DEFAULT 1 Controle de versão

Histórico: exercises_history


enrollments

Campo Tipo Restrições Descrição
id UUID PK Identificador da matrícula
user_id UUID FK -> users(id) Aluno matriculado
course_id UUID FK -> courses(id) Curso
status VARCHAR(32) NOT NULL Enum: 'active', 'cancelled'
enrolled_at TIMESTAMP DEFAULT now() Data da matrícula
deleted_at TIMESTAMP Soft delete
version INT DEFAULT 1 Controle de versão

Histórico: enrollments_history


progress

Campo Tipo Restrições Descrição
id UUID PK Identificador do progresso
user_id UUID FK -> users(id) Usuário
course_id UUID FK -> courses(id) Curso
module_id UUID FK -> modules(id) Módulo
lesson_id UUID FK -> lessons(id) Aula
progress_pct NUMERIC(5,2) Percentual de conclusão
updated_at TIMESTAMP DEFAULT now() Última atualização
deleted_at TIMESTAMP Soft delete
version INT DEFAULT 1 Controle de versão

Histórico: progress_history


media

Campo Tipo Restrições Descrição
id UUID PK Identificador da mídia
owner_id UUID FK -> users(id) Dono da mídia
url VARCHAR(255) NOT NULL Caminho/URL do arquivo
type VARCHAR(32) Tipo (imagem, vídeo, áudio)
description TEXT Descrição
deleted_at TIMESTAMP Soft delete
created_at TIMESTAMP DEFAULT now()
updated_at TIMESTAMP DEFAULT now()
version INT DEFAULT 1 Controle de versão

Histórico: media_history


course_media

Campo Tipo Restrições Descrição
id UUID PK Identificador
course_id UUID FK -> courses(id) Curso
media_id UUID FK -> media(id) Mídia
deleted_at TIMESTAMP Soft delete
created_at TIMESTAMP DEFAULT now()
version INT DEFAULT 1 Controle de versão

Histórico: course_media_history


notifications

Campo Tipo Restrições Descrição
id UUID PK Identificador da notificação
sender_id UUID FK -> users(id) Remetente
recipient_id UUID FK -> users(id) Destinatário
title VARCHAR(255) NOT NULL Título
message TEXT NOT NULL Mensagem
status VARCHAR(32) NOT NULL Enum: 'sent', 'read'
sent_at TIMESTAMP Data envio
read_at TIMESTAMP Data leitura
deleted_at TIMESTAMP Soft delete
created_at TIMESTAMP DEFAULT now()
updated_at TIMESTAMP DEFAULT now()
version INT DEFAULT 1 Controle de versão

Histórico: notifications_history


Observações Gerais

  • Cada tabela possui sua tabela de histórico, espelhando campos e incluindo usuário/responsável pela alteração.
  • Soft delete: Todos os SELECTs relevantes devem filtrar por deleted_at IS NULL.
  • Controle de permissão: Use a estrutura de roles/permissions para RBAC, mesmo com uso restrito (admin/creator/student).
  • Relacionamentos: Todos os FKs estão explícitos.
  • Versão: O campo version deve ser incrementado a cada alteração, auxiliando o versionamento e a auditoria.
  • Auditoria: As tabelas de histórico devem registrar o usuário responsável pela mudança (ex: campo changed_by).

Diagrama Entidade-Relacionamento (ERD) - [Sugestão visual]

Para a versão visual, recomenda-se utilizar ferramentas como dbdiagram.io ou draw.io com as tabelas acima.


Se precisar do DDL em SQL, modelo visual ou ajustes finos de relacionamento, me avise antes de seguir. Se algum campo, relação ou comportamento ficou de fora, só apontar.


← Back to Main Page