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:
- Usuários (Users): Representam os proprietários e administradores do sistema
- Marcas (Brands): Representam as marcas dos veículos (ex: Ford, Chevrolet, Volkswagen)
- 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
- Unicidade de Placa: Cada carro deve ter uma placa única no sistema
- Unicidade de Nome de Usuário: Cada usuário deve ter um nome de usuário único
- Unicidade de E-mail: Cada usuário deve ter um e-mail único
- Unicidade de Nome de Marca: Cada marca deve ter um nome único
- Integridade Referencial:
- Um carro deve estar associado a um usuário existente
- Um carro deve estar associado a uma marca existente
Regras de Negócio
- Validação de Ano: Anos de fabricação e modelo devem estar entre 1900 e 2030
- Validação de Placa: Placas devem ter entre 7 e 10 caracteres
- Validação de Preço: Preços devem ser maiores que zero
- Validação de Modelos: Modelos e cores devem ter pelo menos 2 caracteres
- Permissões de Acesso: Somente o proprietário pode modificar ou excluir seus próprios carros
- Status de Marca: Marcas inativas não podem ser usadas para novos carros (validação futura)
Enums
FuelType
GASOLINE: GasolinaETHANOL: EtanolFLEX: Flex (gasolina/etanol)DIESEL: DieselELECTRIC: ElétricoHYBRID: Híbrido
TransmissionType
MANUAL: ManualAUTOMATIC: AutomáticoSEMI_AUTOMATIC: SemiautomáticoCVT: CVT (Continuously Variable Transmission)
Validação de Dados
O sistema implementa validação rigorosa de dados nos seguintes níveis:
- Validação no Banco de Dados: Constraints definidas nos modelos SQLAlchemy
- Validação na Camada de Esquema: Validadores Pydantic nos schemas
- Validação na Camada de Aplicação: Verificações adicionais nos endpoints
Segurança e Privacidade
- Senhas: Armazenadas com hash usando Argon2
- Autenticação: Baseada em tokens JWT com tempo de expiração
- Autorização: Controle de acesso baseado em propriedade (somente o proprietário pode acessar seus carros)
- Dados Sensíveis: Informações pessoais protegidas e acessíveis apenas aos proprietários
Considerações de Desempenho
- Indexação: Campo de placa indexado para buscas rápidas
- Eager Loading: Relacionamentos carregados eficientemente para evitar N+1 queries
- Paginação: Todos os endpoints de listagem suportam paginação
- Filtragem: Múltiplos critérios de filtragem disponíveis para otimizar consultas