Sì, gli schemi sono la soluzione. Usa un singolo cluster PostgreSQL, con un unico database.
Crea un gruppo per tutti gli utenti dell'app:
CREATE ROLE app;
Crea uno schema globale di "app", in cui vivranno tutte le tabelle delle applicazioni condivise globali.
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
Crea un utente separato (senza diritti di superutente) per ciascuna delle distribuzioni:
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
Facoltativamente, invece di IN ROLE app
, puoi concedere diritti espliciti a questi utenti sugli oggetti app selezionati:
GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
Crea schemi privati, in cui vivranno le tabelle dipendenti dalla distribuzione:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
Ora hai uno schema privato per ogni applicazione distribuita; ma allo stesso tempo hai condiviso l'accesso ai dati globali.
La cosa bella è che l'applicazione non deve essere a conoscenza dello schema. SELECT * FROM froobles
per impostazione predefinita si risolverà in SELECT * FROM app01.froobles
, se sei connesso come app01
utente. Non è necessario specificare il nome dello schema.
Come misura aggiuntiva, puoi utilizzare l'ereditarietà delle tabelle per estendere gli oggetti globali in base alla distribuzione:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );