
PostgreSQL per SaaS: Dati, Utenti e Crediti in LetsAI
Scegliere il database per una piattaforma SaaS multi-utente non è banale. PostgreSQL per LetsAI: dopo due anni zero rimpianti. Utenti, crediti, storico generazioni e analytics — tutto in un database che non ci ha mai lasciato a piedi.

Perché PostgreSQL e non MongoDB o MySQL
MongoDB l'abbiamo usato in progetti passati. Comodo per prototipi, ma quando i dati hanno relazioni (utenti → piani → crediti → generazioni → fatture) un database relazionale è più naturale. Le JOIN sono quello che servono. PostgreSQL ha due cose che fanno la differenza: JSONB per dati semi-strutturati (i metadata delle generazioni cambiano per provider) e le estensioni — pg_stat_statements, pg_trgm, pgcrypto. Tutto integrato. In due anni: 400.000+ record di generazioni. Le query analytics aggregate rispondono sotto i 200ms.
Multi-tenant con Row Level Security
LetsAI è multi-tenant: ogni utente vede solo i suoi dati, database condiviso. Ogni tabella ha user_id e una RLS policy. Anche se un bug dimenticasse il WHERE, PostgreSQL blocca l'accesso a dati altrui a livello database. Le RLS ci hanno salvato almeno due volte da potenziali data leak durante lo sviluppo. Costo performance: meno dell'1%.
Crediti: transazioni ACID dove servono davvero
La parte più delicata: il sistema crediti. Compri un pacchetto, generi, i crediti scalano. Se qualcosa va storto a metà, i crediti non devono scalare. Flusso: BEGIN → verifica crediti → SELECT FOR UPDATE (blocca la riga) → chiama provider AI → COMMIT o ROLLBACK. Il SELECT FOR UPDATE impedisce che due richieste simultanee spendano gli stessi crediti. In 400.000+ transazioni: zero crediti persi o duplicati.
JSONB per metadata variabili
Ogni generazione ha metadata diversi. Video: risoluzione, durata, frame rate. Immagine: dimensioni, modello, seed. Colonne per ogni campo? Folle. JSONB risolve: salvi JSON strutturato ma fai query efficienti — metadata->>'model' = 'stable-diffusion-xl'. Con indice GIN le query sono quasi veloci come su colonne normali. Consiglio: i campi per JOIN e filtri frequenti (user_id, created_at, type) restano colonne normali. JSONB solo per dati variabili.
Backup e monitoring: la routine che ci salva
pg_dump ogni 6 ore, retention 30 giorni. WAL archiving per point-in-time recovery. Test restore settimanale — un backup che non sai restorare non è un backup. pg_stat_statements per query lente (alert se >500ms). PgBouncer per connection pooling: il database accetta 100 connessioni, l'app ne vede 500. Costo: meno di 50€/mese su VPS dedicato. Gestisce tutto il traffico LetsAI.
Servizi Correlati
Scopri come applichiamo queste tecnologie nei nostri progetti enterprise.
Interessato?
Contattaci per ricevere un preventivo personalizzato.
Securvita S.r.l. — i3k.eu