challenge
por la misma razón que campaign_budget vive separada de rule_campaign: se escribe en cada evento
calificante y el desafío casi nunca. Juntarlas pondría contención sobre una fila que además lee la
consola.
current nunca excede target, garantizado por la base: un progreso de 12 de 10 es un bug que
el member ve antes que nosotros.
Clave primaria
Atributos específicos
Claves foráneas
Atributos base
Restricciones e índices
RLS y particionamiento
RLS activa portenant_id. No particionada.
La actualización corre dentro de la transacción del evento que la mueve, con bloqueo de fila.