
Software & AI14 luglio 2025
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.
Tutti gli articoli
Securvita S.r.l. — i3k.eu