Ja, schema's zijn de oplossing. Gebruik één PostgreSQL-cluster, met één database.
Maak een groep voor alle app-gebruikers:
CREATE ROLE app;
Maak een globaal "app"-schema, waarin alle globale tabellen met gedeelde toepassingen zullen leven.
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
Maak een aparte gebruiker (zonder superuser-rechten) voor elk van de implementaties:
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
Optioneel, in plaats van IN ROLE app
, kunt u deze gebruikers expliciete rechten verlenen op geselecteerde app-objecten:
GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
Maak privéschema's waarin implementatie-afhankelijke tabellen zullen leven:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
Nu heb je een privéschema voor elke geïmplementeerde applicatie; maar tegelijkertijd heb je gedeelde toegang tot wereldwijde gegevens.
Wat leuk is, is dat de applicatie niet schema-bewust hoeft te zijn. SELECT * FROM froobles
wordt standaard opgelost in SELECT * FROM app01.froobles
, als je bent verbonden als app01
gebruiker. U hoeft geen schemanaam op te geven.
Als extra maatregel kunt u tabelovererving gebruiken om globale objecten per implementatie uit te breiden:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );