Skip to content

Modelagem do Sistema

Este documento descreve a modelagem conceitual e lógica do sistema de Gerenciamento de Carros, incluindo os modelos de dados e suas relações.

Visão Geral do Modelo

O sistema é composto por três entidades principais:

  1. Usuários (Users): Representam os proprietários e administradores do sistema
  2. Marcas (Brands): Representam as marcas dos veículos (ex: Ford, Chevrolet, Volkswagen)
  3. Carros (Cars): Representam os veículos cadastrados no sistema

Entidades e Atributos

Usuário (User)

A entidade Usuário representa os participantes do sistema, que podem ser proprietários de carros ou administradores.

Atributos: - id: Identificador único do usuário (inteiro, chave primária, autoincrementado) - username: Nome de usuário (string, único) - email: Endereço de e-mail (string, único) - password: Senha criptografada (string) - created_at: Data e hora de criação (datetime, padrão: agora) - updated_at: Data e hora da última atualização (datetime, padrão: agora, atualizado automaticamente)

Relacionamentos: - Um usuário pode possuir muitos carros (relação 1:N com Carro) - Um usuário pode realizar operações de CRUD em seus próprios carros

Marca (Brand)

A entidade Marca representa as marcas dos veículos cadastrados no sistema.

Atributos: - id: Identificador único da marca (inteiro, chave primária, autoincrementado) - name: Nome da marca (string, único, máximo 50 caracteres) - is_active: Status da marca (booleano, padrão: verdadeiro) - description: Descrição opcional da marca (string, texto longo, opcional) - created_at: Data e hora de criação (datetime, padrão: agora) - updated_at: Data e hora da última atualização (datetime, padrão: agora, atualizado automaticamente)

Relacionamentos: - Uma marca pode estar associada a muitos carros (relação 1:N com Carro)

Carro (Car)

A entidade Carro representa os veículos cadastrados no sistema, com informações detalhadas sobre modelo, características e proprietário.

Atributos: - id: Identificador único do carro (inteiro, chave primária, autoincrementado) - model: Modelo do veículo (string, máximo 100 caracteres) - factory_year: Ano de fabricação (inteiro) - model_year: Ano do modelo (inteiro) - color: Cor do veículo (string, máximo 30 caracteres) - plate: Placa do veículo (string, máximo 10 caracteres, único, indexado) - fuel_type: Tipo de combustível (enum: gasoline, ethanol, flex, diesel, electric, hybrid) - transmission: Tipo de transmissão (enum: manual, automatic, semi_automatic, cvt) - price: Preço do veículo (decimal, 10 dígitos, 2 casas decimais) - description: Descrição opcional do veículo (string, texto longo, opcional) - is_available: Disponibilidade para venda/aluguel (booleano, padrão: verdadeiro) - brand_id: Referência à marca (inteiro, chave estrangeira para Brand.id) - owner_id: Referência ao proprietário (inteiro, chave estrangeira para User.id) - created_at: Data e hora de criação (datetime, padrão: agora) - updated_at: Data e hora da última atualização (datetime, padrão: agora, atualizado automaticamente)

Relacionamentos: - Um carro pertence a um usuário (proprietário) - Um carro pertence a uma marca

Diagrama de Classes

┌─────────────────────────┐
│         User            │
├─────────────────────────┤
│ - id: int (PK)          │
│ - username: str (UQ)    │
│ - email: str (UQ)       │
│ - password: str         │
│ - created_at: datetime  │
│ - updated_at: datetime  │
└─────────────────────────┘
            ▲
            │ (1:N)
            │
┌─────────────────────────┐
│         Car             │
├─────────────────────────┤
│ - id: int (PK)          │
│ - model: str            │
│ - factory_year: int     │
│ - model_year: int       │
│ - color: str            │
│ - plate: str (UQ)       │
│ - fuel_type: enum       │
│ - transmission: enum    │
│ - price: Decimal        │
│ - description: str      │
│ - is_available: bool    │
│ - brand_id: int (FK)    │
│ - owner_id: int (FK)    │
│ - created_at: datetime  │
│ - updated_at: datetime  │
└─────────────────────────┘
            ▲
            │ (N:1)
            │
┌─────────────────────────┐
│        Brand            │
├─────────────────────────┤
│ - id: int (PK)          │
│ - name: str (UQ)        │
│ - is_active: bool       │
│ - description: str      │
│ - created_at: datetime  │
│ - updated_at: datetime  │
└─────────────────────────┘

Restrições e Regras de Negócio

Restrições de Integridade

  1. Unicidade de Placa: Cada carro deve ter uma placa única no sistema
  2. Unicidade de Nome de Usuário: Cada usuário deve ter um nome de usuário único
  3. Unicidade de E-mail: Cada usuário deve ter um e-mail único
  4. Unicidade de Nome de Marca: Cada marca deve ter um nome único
  5. Integridade Referencial:
  6. Um carro deve estar associado a um usuário existente
  7. Um carro deve estar associado a uma marca existente

Regras de Negócio

  1. Validação de Ano: Anos de fabricação e modelo devem estar entre 1900 e 2030
  2. Validação de Placa: Placas devem ter entre 7 e 10 caracteres
  3. Validação de Preço: Preços devem ser maiores que zero
  4. Validação de Modelos: Modelos e cores devem ter pelo menos 2 caracteres
  5. Permissões de Acesso: Somente o proprietário pode modificar ou excluir seus próprios carros
  6. Status de Marca: Marcas inativas não podem ser usadas para novos carros (validação futura)

Enums

FuelType

  • GASOLINE: Gasolina
  • ETHANOL: Etanol
  • FLEX: Flex (gasolina/etanol)
  • DIESEL: Diesel
  • ELECTRIC: Elétrico
  • HYBRID: Híbrido

TransmissionType

  • MANUAL: Manual
  • AUTOMATIC: Automático
  • SEMI_AUTOMATIC: Semiautomático
  • CVT: CVT (Continuously Variable Transmission)

Validação de Dados

O sistema implementa validação rigorosa de dados nos seguintes níveis:

  1. Validação no Banco de Dados: Constraints definidas nos modelos SQLAlchemy
  2. Validação na Camada de Esquema: Validadores Pydantic nos schemas
  3. Validação na Camada de Aplicação: Verificações adicionais nos endpoints

Segurança e Privacidade

  1. Senhas: Armazenadas com hash usando Argon2
  2. Autenticação: Baseada em tokens JWT com tempo de expiração
  3. Autorização: Controle de acesso baseado em propriedade (somente o proprietário pode acessar seus carros)
  4. Dados Sensíveis: Informações pessoais protegidas e acessíveis apenas aos proprietários

Considerações de Desempenho

  1. Indexação: Campo de placa indexado para buscas rápidas
  2. Eager Loading: Relacionamentos carregados eficientemente para evitar N+1 queries
  3. Paginação: Todos os endpoints de listagem suportam paginação
  4. Filtragem: Múltiplos critérios de filtragem disponíveis para otimizar consultas