Boa! Dois trade-offs que resolvi diferente:
Tabela larga vs JOIN: fiquei nos JOINs em query — a ficha completa (7 LEFT JOINs) sai em ~8ms num Postgres de 1 vCPU, porque é tudo lookup por PK/índice. Denormalizar ganha em consulta analítica (scan), mas pra lookup pontual o join é ruído — e você paga o dobro de storage + rebuild na recarga mensal.
Redis pras auxiliares: testa antes — são ~7k linhas, o Postgres já mantém tudo em shared_buffers (memória local). Redis adiciona um hop de rede pra ganhar quase nada. Se quiser otimizar mesmo, carrega num map em memória do próprio processo no boot: zero rede, zero join.
Quanto tá teu p50 na tabela larga? Se os números baterem, um comparativo das duas arquiteturas dava um post.