Pular para conteúdo

ORM, migrações e transações

TLDR: um ORM traduz objetos de código para linhas de tabela. Migrações versionam a estrutura do banco como o Git versiona código. Soft delete marca um registro como excluído sem apagá-lo fisicamente. ACID são as quatro garantias de uma transação.

Termo Vá pra
Objeto vira linha de tabela ORM
Estrutura do banco versionada Migrações
Excluir sem apagar Soft delete
As quatro garantias de uma transação ACID e transações

ORM (Object-Relational Mapping)

Um ORM é uma ferramenta que faz a ponte entre objetos de código e tabelas de um banco de dados relacional. Em vez de escrever SQL manualmente, o código manipula objetos e o ORM traduz para INSERT/SELECT/UPDATE.

flowchart LR
    OBJ["Objeto\n(código)"] -- "salvar" --> ORM["ORM"]
    ORM -- "INSERT" --> TBL["Tabela\n(banco)"]
    TBL -- "SELECT" --> ORM
    ORM -- "instancia" --> OBJ

Um ORM pode operar em dois modos de sincronização de schema: automático, onde ele altera a estrutura do banco pra bater com as entidades do código sempre que detecta diferença, e manual, onde toda alteração de schema passa por uma migração explícita, revisável antes de aplicar. O modo automático é conveniente em protótipo, mas arriscado em produção, uma sincronização automática pode apagar coluna ou alterar tipo de forma inesperada. O modo manual troca conveniência por previsibilidade.

Migrações

Migrações são scripts que alteram a estrutura de um banco de dados de forma versionada e reproduzível, o equivalente de "Git para o schema do banco". Cada alteração fica registrada num arquivo com timestamp, pode ser aplicada (up) ou revertida (down), e o banco mantém registro de quais migrações já rodaram.

flowchart LR
    A["Alterar entidade no código"] --> B["Gerar migração\n(diff entre código e banco)"]
    B --> C["Revisar o arquivo gerado"]
    C --> D["Aplicar no banco"]

Soft delete

Soft delete (exclusão lógica) significa que "excluir" um registro não o remove fisicamente, apenas marca uma data ou flag de exclusão. O registro fica invisível pra consultas normais, mas continua recuperável.

flowchart LR
    CREATE["Criado"] --> ATIVO["Ativo"]
    ATIVO -- "soft delete" --> EXCLUIDO["Excluído\n(ainda existe no banco)"]
    EXCLUIDO -- "restaurar" --> ATIVO

O trade-off do soft delete é espaço e complexidade de query (toda consulta de listagem precisa filtrar os excluídos) em troca de auditoria e reversibilidade. É a escolha padrão em sistemas onde perder um registro por engano tem custo alto.

ACID e transações

Uma transação agrupa várias operações de banco numa unidade atômica, ou todas acontecem, ou nenhuma. ACID são as quatro garantias que uma transação bem implementada oferece:

  • Atomicidade: tudo ou nada.
  • Consistência: o banco nunca fica em estado inválido entre o início e o fim.
  • Isolamento: transações concorrentes não interferem uma na outra.
  • Durabilidade: depois do commit, o dado sobrevive a uma queda do sistema.
flowchart TD
    OP1["Operação 1"] --> OP2["Operação 2"] --> OP3["Operação 3"]
    OP3 -->|tudo ok| COMMIT["COMMIT"]
    OP2 -.->|erro no meio| ROLLBACK["ROLLBACK\n(nada é persistido)"]

Pra ir além

Cada um desses quatro conceitos tem literatura própria bem mais funda que o resumo acima: o paper original de Jim Gray sobre transações (1981) fundamenta ACID, e a documentação de qualquer ORM maduro (TypeORM, Prisma, Sequelize) detalha as opções reais de estratégia de migração e os trade-offs de cada uma.