Todas as plataformas de produto que construímos acabam por servir várias organizações a partir de uma única instalação. O modelo de isolamento escolhido na segunda semana determina o que é possível no segundo ano, pelo que merece mais reflexão do que costuma receber.
Esquema partilhado com segurança ao nível da linha
Para a maioria das plataformas empresariais, um esquema partilhado com segurança ao nível da linha do Postgres é a escolha por omissão certa. Um único caminho de migrações, um único pool de ligações, e isolamento imposto pela base de dados em vez de por cada consulta que um programador escreve.
alter table facturas enable row level security;
create policy isolamento_inquilino on facturas
using (inquilino_id = current_setting('app.inquilino_id')::uuid);O detalhe crítico é que a definição tem de ser aplicada por transacção por uma camada de confiança, e o perfil da aplicação não pode conseguir contornar a segurança ao nível da linha. Uma única ligação que se esqueça de definir o inquilino, a correr como superutilizador ou dono da tabela, derrota todo o modelo.
Particionar as tabelas que crescem sem limite
Leituras de contadores, registos de auditoria e históricos de transacções crescem monotonicamente. O particionamento por intervalo mensal mantém os índices pequenos, transforma a retenção numa remoção de partição em vez de uma eliminação em massa, e permite ao planeador ignorar a maior parte da tabela em consultas limitadas no tempo.
Gerir as ligações de forma deliberada
As ligações Postgres são caras e os ambientes serverless multiplicam-nas. Coloque um pooler em modo transacção à frente da base de dados, mantenha as transacções curtas, e tenha presente que o modo transacção exclui funcionalidades ao nível da sessão, como declarações preparadas mantidas entre instruções ou bloqueios consultivos de sessão.
- Indexe todas as chaves estrangeiras por que filtra ou junta — o Postgres não as cria por si
- Prefira índices compostos começados por inquilino_id em tabelas multi-inquilino
- Use índices de cobertura para manter os caminhos de leitura frequentes só em índice
- Meça com EXPLAIN (ANALYZE, BUFFERS) sobre dados à escala de produção, não sobre um conjunto de teste
