Skip to main content

Banco de Dados

O FitLocus utiliza PostgreSQL como sistema de gerenciamento de banco de dados relacional para armazenar e gerenciar todos os dados da aplicação. Este documento descreve a estrutura do banco de dados, incluindo tabelas, relacionamentos e considerações de design.

Visão Geral

O banco de dados do FitLocus é projetado para suportar as principais funcionalidades da plataforma:
  • Gerenciamento de usuários (alunos e personal trainers)
  • Relacionamento entre personal trainers e alunos
  • Exercícios e categorias
  • Treinos e planos de treino
  • Execução de treinos e exercícios
  • Assinaturas e pagamentos
  • Métricas e recordes pessoais

Modelo de Dados

Principais Tabelas

Users

A tabela users armazena informações sobre todos os usuários do sistema, incluindo alunos e personal trainers.
ColunaTipoDescrição
idBIGINTIdentificador único do usuário
nameVARCHAR(255)Nome completo do usuário
emailVARCHAR(255)Email do usuário (único)
password_hashVARCHAR(255)Hash da senha do usuário
user_typeVARCHAR(20)Tipo de usuário (ALUNO ou PERSONAL)
subscription_typeVARCHAR(50)Tipo de assinatura do usuário
subscription_start_dateDATEData de início da assinatura
subscription_end_dateDATEData de término da assinatura (null para assinaturas sem prazo)
trial_start_dateDATEData de início do período de teste
trial_usedBOOLEANIndica se o usuário já utilizou o período de teste
profile_photo_urlVARCHAR(255)URL da foto de perfil do usuário
created_atTIMESTAMPData de criação do registro
updated_atTIMESTAMPData da última atualização do registro

Personal_Student

A tabela personal_student estabelece o relacionamento entre personal trainers e seus alunos.
ColunaTipoDescrição
idBIGINTIdentificador único do relacionamento
personal_idBIGINTID do personal trainer (referência à tabela users)
student_idBIGINTID do aluno (referência à tabela users)
created_atTIMESTAMPData de criação do relacionamento

Exercise

A tabela exercise armazena informações sobre exercícios físicos.
ColunaTipoDescrição
idBIGINTIdentificador único do exercício
nameVARCHAR(255)Nome do exercício
descriptionTEXTDescrição detalhada do exercício
image_urlVARCHAR(255)URL da imagem do exercício
is_defaultBOOLEANIndica se é um exercício padrão do sistema
categoryVARCHAR(50)Categoria do exercício (PEITO, COSTAS, etc.)
created_byBIGINTID do usuário que criou o exercício
created_atTIMESTAMPData de criação do registro
updated_atTIMESTAMPData da última atualização do registro

Training

A tabela training armazena informações sobre treinos.
ColunaTipoDescrição
idBIGINTIdentificador único do treino
nameVARCHAR(255)Nome do treino
descriptionTEXTDescrição do treino
created_byBIGINTID do usuário que criou o treino
created_atTIMESTAMPData de criação do registro
updated_atTIMESTAMPData da última atualização do registro

Workout_Plan

A tabela workout_plan estabelece a relação entre treinos e exercícios, incluindo detalhes como séries, repetições e peso.
ColunaTipoDescrição
idBIGINTIdentificador único do plano de workout
training_idBIGINTID do treino (referência à tabela training)
exercise_idBIGINTID do exercício (referência à tabela exercise)
order_indexINTOrdem do exercício no treino
setsINTNúmero de séries
repsINTNúmero de repetições
weightVARCHAR(50)Peso recomendado (pode incluir variações)
tempoVARCHAR(50)Tempo de execução (formato: concêntrica/isométrica/excêntrica)
restVARCHAR(50)Tempo de descanso entre séries

Training_Plan

A tabela training_plan armazena informações sobre planos de treino semanais.
ColunaTipoDescrição
idBIGINTIdentificador único do plano de treino
nameVARCHAR(255)Nome do plano de treino
goalTEXTObjetivo do plano de treino
duration_weeksINTDuração do plano em semanas
created_byBIGINTID do usuário que criou o plano
created_atTIMESTAMPData de criação do registro
updated_atTIMESTAMPData da última atualização do registro

Índices

O banco de dados utiliza índices para otimizar consultas frequentes:
TabelaColuna(s)TipoDescrição
usersemailUNIQUEGarante emails únicos e acelera consultas por email
usersuser_typeBTREEOtimiza consultas filtradas por tipo de usuário
personal_studentpersonal_idBTREEOtimiza consultas para listar alunos de um personal
personal_studentstudent_idBTREEOtimiza consultas para encontrar o personal de um aluno
exercisecategoryBTREEOtimiza consultas filtradas por categoria
exercisecreated_byBTREEOtimiza consultas para listar exercícios de um usuário
trainingcreated_byBTREEOtimiza consultas para listar treinos de um usuário
training_executionuser_idBTREEOtimiza consultas para histórico de treinos de um usuário
training_executionstart_timeBTREEOtimiza consultas por período

Restrições e Integridade Referencial

O banco de dados implementa as seguintes restrições para garantir a integridade dos dados:
  • Chaves Estrangeiras: Todas as referências entre tabelas são implementadas como chaves estrangeiras com ações de cascata apropriadas
  • Restrições de Unicidade: Emails de usuários são únicos
  • Restrições de Não-Nulidade: Campos obrigatórios são marcados como NOT NULL
  • Restrições de Verificação: Validação de valores para campos como subscription_type e user_type

Migrações e Versionamento

O banco de dados é gerenciado através de migrações usando Liquibase:
src/main/resources/db/
├── changelog.xml           # Arquivo mestre de migração
└── scripts/
    ├── 001-initial-schema.sql  # Esquema inicial
    ├── 002-add-subscription.sql # Adição de tabelas de assinatura
    └── ...                 # Outras migrações
Cada alteração no esquema do banco de dados é versionada e aplicada sequencialmente, garantindo consistência entre ambientes.

Considerações de Performance

Para garantir a performance do banco de dados, as seguintes estratégias são implementadas:
  • Índices: Índices estratégicos para consultas frequentes
  • Paginação: Todas as consultas que retornam grandes conjuntos de dados implementam paginação
  • Consultas Otimizadas: Uso de JOINs eficientes e subconsultas apenas quando necessário
  • Transações: Uso apropriado de transações para garantir consistência

Segurança de Dados

A segurança dos dados é garantida através de:
  • Criptografia: Senhas armazenadas com hash usando BCrypt
  • Acesso Restrito: Acesso ao banco de dados limitado a serviços autorizados
  • Backup: Backups automáticos diários com retenção de 30 dias
  • Auditoria: Registro de alterações em tabelas sensíveis

Ambiente de Desenvolvimento

Para desenvolvimento local, um contêiner Docker com PostgreSQL é configurado:
# docker-compose.yml
version: '3.8'
services:
  postgres:
    image: postgres:14
    environment:
      POSTGRES_DB: fitlocus
      POSTGRES_USER: fitlocus
      POSTGRES_PASSWORD: fitlocus
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Ambiente de Produção

Em produção, o banco de dados é hospedado no Google Cloud SQL:
  • Tipo: PostgreSQL 14
  • Configuração: 2 vCPUs, 8GB RAM
  • Armazenamento: 100GB SSD com expansão automática
  • Backup: Automático diário com retenção de 30 dias
  • Alta Disponibilidade: Configuração com réplica de leitura
  • Monitoramento: Alertas para uso de CPU, memória e espaço em disco