Modelagem Conceitual e Arquitetura do Banco de Dados
Pilar: 04 — Banco de Dados e Eventos
Status: 🟢 Implementado
Última Revisão Técnica: 2026-08-03
SGBD: PostgreSQL 15+ (Engine SQLAlchemy Async/Sync + Alembic)
Módulos Conectados:gatein-server(app/core/database.py,app/core/active.py,app/models.py)
1. Visão Geral da Modelagem ER
O banco de dados do Gatein foi projetado para alta escalabilidade multi-tenant, suporte a layouts dinâmicos via campos JSONB, herança polimórfica de empresas e desacoplamento entre identificadores físicos de banco (BigInteger) e identificadores externos expostos em APIs (Sqids).
erDiagram
COMPANIES ||--o{ TERMINALS : "polimorfismo (type=terminal)"
COMPANIES ||--o{ TRUCKING_COMPANIES : "polimorfismo (type=trucking_company)"
COMPANIES ||--o{ COMPANIES_USERS : "possui operadores"
COMPANIES ||--o{ COMPANY_SERVICES : "disponibiliza serviços"
COMPANIES ||--o{ ANNOUNCEMENTS : "publica comunicados"
TERMINALS ||--o{ APPOINTMENTS : "gerencia agendamentos"
TERMINALS ||--o{ APPOINTMENTS_LAYOUTS : "possui layouts card"
TERMINALS ||--o{ TICKETS_LAYOUTS : "possui layouts ticket"
TRUCKING_COMPANIES ||--o{ TRIPS : "gerencia viagens"
TRUCKING_COMPANIES ||--o{ TRIPS_LAYOUTS : "possui layouts viagens"
DRIVERS ||--o{ USERS : "vinculado a conta de acesso"
DRIVERS ||--o{ APPOINTMENTS : "atendido em"
DRIVERS ||--o{ TRIPS : "executa frete"
USERS ||--o{ USER_FCM_TOKENS : "possui dispositivos push (1:N)"
APPOINTMENTS ||--o{ TICKETS : "gera comprovante"
APPOINTMENTS ||--o{ APPOINTMENTS_LOGS : "registra auditoria"
TRIPS ||--o{ TRIPS_LOGS : "registra auditoria"
2. Padrões de Herança e Mixins Globais
2.1 Mixin de Exclusão Lógica e Ativação (ActiveModelMixin)
Todas as tabelas do sistema herdam da classe ActiveModelMixin (app/core/active.py), que injeta obrigatoriamente a coluna is_active (Boolean, default True, index=True).
- Nenhuma rota de cliente executa a instrução SQL
DELETE FROM table. - A exclusão é realizada definindo
is_active = Falseoudeleted_at = now(). - Todas as consultas ORM padrão incluem a instrução implícita:
.filter(Model.is_active == True).
2.2 Herança Polimórfica de Empresas (Company)
A tabela base companies armazena dados cadastrais comuns de clientes. O SQLAlchemy gerencia a herança polimórfica baseada na coluna type:
type = 'terminal': Mapeia para a classe e tabelaTerminal, que adiciona suporte ageofence,appointment_layoutseticket_layouts.type = 'trucking_company': Mapeia para a classe e tabelaTruckingCompany, que adiciona suporte atrip_layouts.
3. Identificadores Primários vs. Identificadores Públicos (Sqids)
Para prevenir ataques de varredura sequencial de URLs (enumeration attacks), o banco de dados adota uma camada dupla de identificação:
| Camada | Tipo de ID | Exemplo | Uso Interno / Externo |
|---|---|---|---|
| Física de Banco | BigInteger (64-bit autoincrement) | 109482 | Usado exclusivamente em PRIMARY KEY, FOREIGN KEY e consultas SQL internas |
| Camada de API / Mobile | Sqid (String alfanumérica ofuscada) | "w8x9k2m1" | Retornado em todos os payloads JSON e aceito nas URLs REST públicas |
# app/core/sqids.py
def encode_id(internal_id: int) -> str:
return sqids.encode([internal_id])
def decode_id(sqid_str: str) -> int:
decoded = sqids.decode(sqid_str)
if not decoded:
raise HTTPException(status_code=400, detail={"code": "INVALID_SQID"})
return decoded[0]
4. Otimização de Busca Textual (Índices GIN Trigram)
Para suportar busca de alto desempenho em autocompletar e filtros de nome de empresa/filial sem causar table scan, a tabela companies inclui um índice GIN Trigram com suporte a remoção de acentos (f_unaccent):
CREATE INDEX idx_company_trgm_search ON companies
USING gin (f_unaccent(name || ' ' || COALESCE(branch_name, '')) gin_trgm_ops);
5. Estratégia de Migrações (Alembic)
- Versionamento Estrito: Todo script de migração em
alembic/versions/possui um hash hexadecimal sequencial e deve implementar obrigatoriamente as funçõesupgrade()edowngrade(). - Execução de Migrações em Deploy: Em ambientes de homologação e produção, o container executa
alembic upgrade headantes de iniciar os workers do Uvicorn.