Pular para o conteúdo

apps/data-patterns/temporal-tables

088 · Dados & Persistência · ≈ 5 min de estudo

Temporal Tables

Guarda a história de cada linha em vez de sobrescrevê-la: toda versão substituída vai para uma tabela de histórico com o período em que esteve em vigor. A aplicação faz UPDATE comum; um trigger versiona, no estilo system-versioned do SQL:2011. Qualquer pergunta do tipo “qual era o valor naquele instante” vira uma consulta AS OF.

passos
6
arquivos
5
teste
1
tecnologias
4
Infraestrutura realTypeScriptBunPostgreSQLDocker
Baixar cartão

Cenário

O comitê de crédito ajusta a taxa mensal do Crédito Pessoal ao longo do tempo. Um contrato assinado quando a taxa era 2,99% continua sendo calculado com 2,99%, mesmo depois que a taxa atual caiu para 1,99%. A auditoria precisa responder, para qualquer data, qual taxa vigorava e quem a definiu.

Planta

Sequência
5/5
UPDATE taxa para 2,49%1BEFORE UPDATE2versão 2,99% com período fechado em now()3nova versão abre em now()4AS OF instante X5interest_rates_timeline une as duas; período contém XEXCLUDE impede dois períodos sobrepostos do mesmo produtoPrecificaçãointerest_ratesTrigger de versionamentointerest_rates_historyAuditoria
5

5 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Tempo válido e tempo de registro.

Esconde cada passo: lembre antes de tocar para revelar.

  1. 01

    interest_rates guarda a versão atual com sys_period = [início, ∞); a taxa é inteira em pontos-base

  2. 02

    O trigger BEFORE UPDATE OR DELETE fecha a versão antiga em now(), arquiva em interest_rates_history e abre a nova

  3. 03

    O EXCLUDE USING gist no histórico impede duas versões do mesmo produto no mesmo instante

  4. 04

    interest_rates_timeline une atual e histórico; *AS OF* é sys_period @> instante, período fechado-aberto

  5. 05

    Excluir o produto fecha a última versão, que continua respondendo pelo passado

  6. 06

    O juro de um contrato usa a taxa *AS OF* a data de assinatura, não a de hoje

Trade-offs

O que se ganha, o que se paga

3 vantagenscada ganho tem um preço3 custos

Vantagens

  • Histórico sem código de versionamento na aplicação

  • Auditoria e cálculo retroativo por *AS OF*

  • Banco garante períodos sem sobreposição

Custos

  • Toda escrita grava também no histórico

  • Tabela de histórico cresce sem fim

  • Um eixo só: horário de registro, não vigência futura agendada

apps/data-patterns/temporal-tables

5 arquivos

sql/

  • 01_schema.sqlschemaTabela atual, histórico com EXCLUDE, trigger de versionamento e view da linha do tempo

src/

  • rate_history.tsUpsert da taxa, consulta *AS OF*, linha do tempo e juro do contrato
  • demo.tsdemoDuas mudanças de taxa e o contrato calculado pela taxa da assinatura
  • rate_history.test.tstesteHistórico contíguo, fronteira da mudança, sobreposição e exclusão contra PostgreSQL real

src/config_rate.ts / src/

  • pool_rate.tsAmbiente validado e pool

Executar · com Docker

  1. ./docker.sh up# sobe PostgreSQL
  2. bun install# dependências
  3. bun run demo# roda o cenário
  4. bun run test# integração contra o serviço real
Requisitos
BunDocker
Sobe junto
PostgreSQL

Por que se relacionam

Teste rápido

Qual destes combina com Temporal Tables / Bi-temporal Modeling?

Próximo projeto · Dados & PersistênciaPartition Table
Esc

↑ ↓ navegarEnter abrir191 resultados